首页 > 解决方案 > 找不到元素 - Selenium python

问题描述

这在一两个星期前对我有用,但我认为该网站最近发生了变化。

我在抓取通常能够抓取的元素时遇到问题。我不知道是因为框架问题,我需要切换到特定框架,还是我没有等待正确的元素。

这是问题的图片: 在此处输入图像描述

这是有问题的功能:

def reset_email():
    time.sleep(1)
    wait = WebDriverWait(browser_options.browser, 15)
   browser_options.browser.get('https://cp.intermedia.net/ControlPanel/Menu/AccountMenu/?frameUrl=https://cp.intermedia.net/aspx/Exchange/')

    try:
        wait = WebDriverWait(browser_options.browser, 15)
        wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']")))
    except exceptions.TimeoutException as e:
        print("timed out") #IT USUALLY DOES TIME OUT HERE
        pass
    im_defaultpolicy = browser_options.browser.find_element_by_css_selector("input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']") #IT FAILS HERE EVERYTIME
    im_defaultpolicy.send_keys(email_selection_only.email_select)

    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlSearchOptions_btnSearch')
    im_defaultpolicy.send_keys(Keys.ENTER)
    
    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlUserList_rptList_ctl01_ctlRowContent__ctlActionMenu2_btnAction')
    im_defaultpolicy.send_keys(Keys.ENTER)

    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlUserList_rptList_ctl01_ctlRowContent__ctlActionMenu2_rptMenuBlocks_ctl00_rptMenuItems_ctl00_btnMenuItem')
    im_defaultpolicy.send_keys(Keys.ENTER)
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtManualPassword"))))
    
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtManualPassword")
    im_blacklistaddbutton.send_keys(email_pd.pd)
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtConfirmPassword")
    im_blacklistaddbutton.send_keys(email_pd.pd)
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_btnOk')
    im_blacklistaddbutton.send_keys(Keys.ENTER)
    return

代码在这里特别失败:

im_defaultpolicy = browser_options.browser.find_element_by_css_selector("input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']")

它会说:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']"}

我试过的:

我注意到网页中有两个 iframe,我都试过了。如果我尝试使用browser_options.browser.switch_to_frame('frame-content')

在我尝试选择我得到的元素之前:

selenium.common.exceptions.NoSuchFrameException: Message: frame-content

如果我尝试browser_options.browser.switch_to_frame('MainFrame')这似乎可行,但我会陷入之前的错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']"}

从这里我不知道还能尝试什么。这是页面源信息,以防我遗漏了一些东西: 注意 - 源信息超过 30,000 个字符,所以我不能把它放在这里。相反,我将其放在在线文本文件中,以便您查看: https ://drive.google.com/file/d/10DWzA9-52H7qAQ6AYdtJMRnOZ3wK9O0a/view?usp=sharing

标签: pythonseleniumselenium-chromedriver

解决方案


@c.Peck 通过他的陈述帮助我找到了答案。关键是frame-content从iframe 切换到嵌套MaineFrameiframe。

这是代码:

def reset_email():
    time.sleep(1)
    wait = WebDriverWait(browser_options.browser, 15)
    browser_options.browser.get('https://cp.intermedia.net/ControlPanel/Menu/AccountMenu/?frameUrl=https://cp.intermedia.net/aspx/Exchange/')
    browser_options.browser.switch_to_frame('MainFrame')
    time.sleep(1)
    browser_options.browser.switch_to_frame('frame-content')

    im_defaultpolicy = browser_options.browser.find_element_by_css_selector("input[name='ctl00$ContentPlaceHolder1$ctlCurrentTab$ctlUserList$ctlSearchOptions$txtSearch']")
    im_defaultpolicy.send_keys(email_selection_only.email_select)

    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlSearchOptions_btnSearch')
    im_defaultpolicy.send_keys(Keys.ENTER)
    
    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlUserList_rptList_ctl01_ctlRowContent__ctlActionMenu2_btnAction')
    im_defaultpolicy.send_keys(Keys.ENTER)

    im_defaultpolicy = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_ctlUserList_rptList_ctl01_ctlRowContent__ctlActionMenu2_rptMenuBlocks_ctl00_rptMenuItems_ctl00_btnMenuItem')
    im_defaultpolicy.send_keys(Keys.ENTER)
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtManualPassword"))))
    
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtManualPassword")
    im_blacklistaddbutton.send_keys(email_pd.pd)
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector("#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_txtConfirmPassword")
    im_blacklistaddbutton.send_keys(email_pd.pd)
    im_blacklistaddbutton = browser_options.browser.find_element_by_css_selector('#ctl00_ContentPlaceHolder1_ctlCurrentTab_ctlUserList_dlgResetPassword_btnOk')
    im_blacklistaddbutton.send_keys(Keys.ENTER)
    time.sleep(3)
    return

推荐阅读