首页 > 解决方案 > 使用 Firefox 浏览器切换到框架后,Python Selenium 无法定位元素

问题描述

切换到正确的框架后,我无法在框架内找到元素。这是我的代码、错误和 HTML 源代码。如果我右键单击框架并选择,This Frame -> Show Only This Frame那么我可以在 中找到该元素default_content,但我需要在没有的情况下找到它Show Only This Frame

browser.switch_to.default_content()  

browser.switch_to.frame(browser.find_element_by_id('DialogFrame'))

browser.find_element_by_css_selector('#_ctl12_btnExportCSV')

错误堆栈跟踪:

----> 1 browser.find_element_by_css_selector('#_ctl12_btnExportCSV') 中的 NoSuchElementException Traceback(最近一次调用)

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element_by_css_selector(self, css_selector) 596 element = driver.find_element_by_css_selector('#foo') 597 """ --> 598 return self.find_element (by=By.CSS_SELECTOR, value=css_selector) 599 600 def find_elements_by_css_selector(self, css_selector):

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in find_element(self, by, value) 974 by = By.CSS_SELECTOR 975 value = '[name="%s"]' % value - -> 976 return self.execute(Command.FIND_ELEMENT, { 977 'using': by, 978 'value': value})['value']

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py in execute(self, driver_command, params) 319 response = self.command_executor.execute(driver_command, params) 320 if response: --> 321 self .error_handler.check_response(response) 322 response['value'] = self._unwrap_value(323 response.get('value', None))

~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py in check_response(self, response) 240 alert_text = value['alert'].get('text') 241 raise exception_class(message, screen, stacktrace, alert_text) --> 242 raise exception_class(message, screen, stacktrace) 243 244 def _value_or_default(self, obj, key, default):

NoSuchElementException:消息:无法找到元素:#_ctl12_btnExportCSV

HTML:

嵌套的 HTML

框架

标签: pythonseleniumxpathiframecss-selectors

解决方案


诱导WebDriverWait() 并等待frame_to_be_available_and_switch_to_it()

诱导WebDriverWait() 并等待element_to_be_clickable()

WebDriverWait(browser, 10).until(EC.frame_to_be_available_and_switch_to_it((By.ID, 'DialogFrame')))
inptelement=WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#_ctl12_btnExportCSV')))

您需要导入以下库。

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

推荐阅读