python - 找不到元素 - 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
解决方案
@c.Peck 通过他的陈述帮助我找到了答案。关键是frame-content
从iframe 切换到嵌套MaineFrame
iframe。
这是代码:
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
推荐阅读
- javascript - 如何在 fabric.js 3.6.2 中添加自定义控件?
- react-native - 正在从 React Native Redux 中删除不正确的项目
- javascript - 如何使用 js toDataURL 进入 django 视图
- java - Retrofit 将自引用的 Pojo 变量返回为 LinkedTreeMap 而不是 Pojo
- javascript - 如何在具有中心模式的 Swiper 中禁用分页点?
- php - 如何在 php GD 库中启用字体连字
- javascript - 动态添加的小部件不可移动、不可拖动或调整大小
- javascript - 使用每个产品的数量在购物车中渲染产品
- opengl-es - OpenGL es中的纹理未声明标识符
- pytorch - Pytorch nn.parallel.DistributedDataParallel 模型加载