Selenium切换到作为窗口的div类

2024-10-02 02:30:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要帮助选择网页上的元素与硒。我已经在这个网站上使用Selenium大约3周了,到目前为止,我通常可以通过css选择器或XPath找到元素。然而,网站的这一特定部分让我很为难。 在我点击“重置office 365密码”后,会出现一个窗口,我想通过编程输入新密码,但在弹出窗口中找不到任何内容。 以下是页面的外观: (我的分数太低,无法在这里发布图片)https://cdn.discordapp.com/attachments/768594779344470022/845811910577881098/unknown.png

以下是整个元素的信息:

<input type="password" tabindex="1" name="password" class="m-third pass ng-pristine ng-empty ng-invalid ng-invalid-required ng-touched" ng-model="password.value" ng-blur="password.check = false" ng-focus="password.check = true" required="" autofocus="" ng-disabled="!active">

以下是我尝试过的:(我尝试了很多东西)

尝试使用css选择器单击密码框–失败:选择器无效

im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector('#ng-app > div.page-container > div > div > div.vertical-tabs.j-vertical-tabs.ng-scope > div.vertical-tabs-panes.p0 > div > div > div.page-content.ng-scope > div > div > form > div > div > div.ng-isolate-scope > div.modal > div.modal-body.ng-transclude > div > reset:password > ng-form > div:nth-child(1) > div > div.validation-input > input')
 im_blacklistaddbutton.send_keys(email_pd.pd)
selenium.common.exceptions.InvalidSelectorException: Message: invalid selector: An invalid or illegal selector was specified

尝试使用xpath选择器单击密码框–失败:命名空间错误

im_blacklistaddbutton = browser_options.browser.find_element_by_xpath('//*[@id="ng-app"]/div[2]/div/div/div[3]/div[2]/div/div/div[2]/div/div/form/div/div/div[3]/div[1]/div[2]/div/reset:password/ng-form/div[1]/div/div[1]/input')
im_blacklistaddbutton.send_keys(email_pd.pd)
NamespaceError: Failed to execute 'evaluate' on 'Document': The string '//*[@id="ng-app"]/div[2]/div/div/div[3]/div[2]/div/div/div[2]/div/div/form/div/div/div[3]/div[1]/div[2]/div/reset:password/ng-form/div[1]/div/div[1]/input' contains unresolvable namespaces.

尝试通过部分链接文本等待元素:超时

wait.until(EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, 'Generate password')))
selenium.common.exceptions.TimeoutException: Message:

尝试按ID名称文本值等待元素:超时

wait.until(EC.text_to_be_present_in_element((By.CLASS_NAME, 'btn m-link'), "Generate Password"))
selenium.common.exceptions.TimeoutException: Message:

试图切换到窗口或iframe,但它表示“model”的div类不是窗口或iframe

从这里我完全不明白为什么这个愚蠢的窗口是不可接近的。文本窗口-你为什么对我这么刻薄

以下是我的具体功能:

def reset_im_oa_password():
    browser_options.browser.get('https://cpx.intermedia.net/ControlPanel/Menu/AccountMenu/?frameUrl=https://cpx.intermedia.net/aspx/Office365/Home/licenses#/installed/users')
    wait = WebDriverWait(browser_options.browser, 10)
    try:
        wait.until(EC.element_to_be_clickable((By.XPATH, 'player')))
    except exceptions.TimeoutException as e:
        pass

    browser_options.browser.switch_to_frame('mainFrame')
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#ng-app > div.page-container > div > div > div.vertical-tabs.j-vertical-tabs.ng-scope > div.vertical-tabs-panes.p0 > div > div > div.page-content.ng-scope > div > div > form > div > div > div:nth-child(2) > div.table-wrap.table-fixed.j-table-wrap.s-wide.ng-isolate-scope > div.table-filter > div.table-filter-search.searchbox.ng-isolate-scope > div > span:nth-child(3) > input')))
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector('#ng-app > div.page-container > div > div > div.vertical-tabs.j-vertical-tabs.ng-scope > div.vertical-tabs-panes.p0 > div > div > div.page-content.ng-scope > div > div > form > div > div > div:nth-child(2) > div.table-wrap.table-fixed.j-table-wrap.s-wide.ng-isolate-scope > div.table-filter > div.table-filter-search.searchbox.ng-isolate-scope > div > span:nth-child(3) > input')
    im_blacklistaddbutton.send_keys(email_or_user_selection.email_select)
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector('#ng-app > div.page-container > div > div > div.vertical-tabs.j-vertical-tabs.ng-scope > div.vertical-tabs-panes.p0 > div > div > div.page-content.ng-scope > div > div > form > div > div > div:nth-child(2) > div.table-wrap.table-fixed.j-table-wrap.s-wide.ng-isolate-scope > div.table-filter > div.table-filter-search.searchbox.ng-isolate-scope > div > span:nth-child(3) > button')
    im_blacklistaddbutton.send_keys(Keys.ENTER)
    wait.until(EC.element_to_be_clickable((By.XPATH, ("//*[starts-with(@id, 'btnResetPassword')]"))))
    im_blacklistaddbutton = browser_options.browser.find_element_by_xpath(("//*[starts-with(@id, 'btnResetPassword')]"))
    im_blacklistaddbutton.send_keys(Keys.ENTER)
    try:
        wait.until(EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, 'Generate password')))
    except exceptions.TimeoutException as e:
        pass
    browser_options.browser.switch_to_window('model') # anything past this section will fail
    wait.until(EC.visibility_of_element_located((By.CLASS_NAME, 'model')))
    im_blacklistaddbutton = browser_options.browser.find_element_by_xpath('//*[@id="ng-app"]/div[2]/div/div/div[3]/div[2]/div/div/div[2]/div/div/form/div/div/div[3]/div[1]/div[2]/div/reset:password/ng-form/div[1]/div/div[1]/input')
    im_blacklistaddbutton.send_keys(email_pd.pd)
   
    return

如果有人需要该网页的完整代码,请告诉我。谢谢


Tags: divbrowserforminputpagetablepasswordelement
2条回答

因为没有网页代码,现在我无法解释为什么元素不能被Selenium检测到,但您可以尝试一件事。右键单击元素(如图所示,dom中的输入标记)并转到“复制到”选项并选择“复制JS路径”。然后转到开发工具中的控制台选项卡并粘贴它。然后尝试将它的值设置为一些伪文本,并查看它是否设置了密码

jsPath.value="some password"  //this should set the password

如果这样做有效,那么您可以使用Selenium的JavaScript executor以同样的方式设置该值

如果在编写时该元素实际上不在iframe中,则等待它变成可单击的,如下所示:

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[type='password']")))
im_blacklistaddbutton = browser.find_element_by_css_selector("input[type='password']")
im_blacklistaddbutton.send_keys("new_password")

但是要确保css选择器input[type='password']是唯一的。 如果没有,请尝试以下方法:.validation-input>input[type='password'] (检查validation-input类名是否正确,因为它是在屏幕截图上剪切的)

  1. 如果输入帧位于iframe内,则在切换到此iframe之前,任何内容都不会起作用

相关问题 更多 >

    热门问题