【问题标题】:Python Selenium unable to locate an element after switching to frame using Firefox browser使用 Firefox 浏览器切换到框架后,Python Selenium 无法定位元素
【发布时间】:2021-03-31 00:58:21
【问题描述】:

切换到正确的框架后,我无法在框架内找到元素。这是我的代码、错误和 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')

错误堆栈跟踪:

NoSuchElementException Traceback(最近调用 最后)在 ----> 1 browser.find_element_by_css_selector('#_ctl12_btnExportCSV')

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py 在 find_element_by_css_selector(self, css_selector) 第596章 第597章 --> 598 返回 self.find_element(by=By.CSS_SELECTOR, value=css_selector) 599 600 def find_elements_by_css_selector(自我,css_selector):

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py 在 find_element(self, by, value) 中 974 by = By.CSS_SELECTOR 975 价值 = '[name="%s"]' % 价值 --> 976 返回 self.execute(Command.FIND_ELEMENT, { 第977章 第978章

~\anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py 在执行(自我,driver_command,参数) 319 响应 = self.command_executor.execute(driver_command,参数) 320 如果响应: --> 321 self.error_handler.check_response(响应) 322响应['值'] = self._unwrap_value( 323 response.get('value',无))

~\anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py 在 check_response(self, response) 240 alert_text = value['alert'].get('text') 241 引发异常类(消息、屏幕、堆栈跟踪、警报文本) --> 242 引发异常类(消息、屏幕、堆栈跟踪) 243 244 def _value_or_default(self, obj, key, default):

NoSuchElementException:消息:无法定位元素: #_ctl12_btnExportCSV

HTML:

【问题讨论】:

    标签: python selenium xpath iframe css-selectors


    【解决方案1】:

    诱导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
    

    【讨论】:

      【解决方案2】:

      元素#_ctl12_btnExportCSV 是启用了__doPostBack 的元素。

      由于元素位于 <iframe> 内,因此您必须:

      • 诱导WebDriverWait 使所需的框架可用并切换到它

      • 诱导WebDriverWait 使所需的元素可点击

      • 您可以使用以下任一Locator Strategies

        • 使用CSS_SELECTOR

          WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"DialogFrame")))
          WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[id$='btnExportCSV'][name$='btnExportCSV'][value='Scaricamento']"))).click()
          
        • 使用XPATH:

          WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.ID,"DialogFrame")))
          WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[contains(@id, 'btnExportCSV') and contains(@name, 'btnExportCSV')][@value='Scaricamento']"))).click()
          
      • 注意:您必须添加以下导入:

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

      参考

      您可以在以下位置找到一些相关讨论:

      【讨论】:

      • 谢谢你们,但不幸的是,解决方案不起作用。定位元素时出现超时错误:
      猜你喜欢
      • 2022-10-22
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2015-06-08
      • 1970-01-01
      • 2017-08-16
      • 2016-10-12
      相关资源
      最近更新 更多