【问题标题】:Python Selenium: how to switch frames after navigation?Python Selenium:导航后如何切换帧?
【发布时间】:2019-08-19 20:26:15
【问题描述】:

在使用 Python3 + selenium 导航到页面后,我正在尝试下载表格中的链接。使用 selenium 单击链接并检查最新加载页面上的元素后,我可以看到我的元素位于名为“内容”的框架内。但是,当我尝试访问此框架时,调用:

DRIVER.switch_to_frame("contents")

我收到以下错误:

selenium.common.exceptions.NoSuchFrameException: Message: contents

为了获得更多上下文,我应用了一个实验。我使用 DRIVER.get(URL) 加载的页面和我导航到的页面都有一个名为“菜单”的框架。
我可以在第一页调用 DRIVER.switch_to_frame("menu"),但不能在第二页调用。

DRIVER = webdriver.Chrome(CHROME_DRIVER)
DRIVER.get(SITE_URL)
DRIVER.switch_to_frame("contents") # This works
target_element = DRIVER.find_element_by_name(LINK)
target_element.click()
time.sleep(5)
DRIVER.switch_to_frame("menu")
target_element = DRIVER.find_element_by_name(LINK2)
target_element.click()
target_element = DRIVER.find_element_by_name(LINK3)
target_element.click()
DRIVER.switch_to_frame("contents") # Code breaks here.
target_element = DRIVER.find_element_by_xpath(REF)
target_element.click()
print("Program complete.")

我希望代码能够在“内容”框架中找到链接的 xpath 引用。相反,当尝试切换到“内容”框架时,python 运行时错误并且找不到“内容”。

【问题讨论】:

    标签: python-3.x selenium iframe frame webdriverwait


    【解决方案1】:

    selenium.common.exceptions.NoSuchFrameException: Message: contents

    这是因为您停留在 iframe 的子级别,即“菜单”,因此在内部无法找到 iframe 的“内容”。

    首先切换回父框架,即“内容”,通过使用

    DRIVER.switch_to.default_content()

    然后尝试转到“内容”iframe 并执行操作,现在它应该可以工作了。

    【讨论】:

      【解决方案2】:

      由于内容似乎是顶级框架,请尝试在选择框架之前返回顶部:

      DRIVER.switch_to.default_content()
      DRIVER.switch_to.frame("contents")
      

      【讨论】:

        【解决方案3】:

        作为一个经验法则,每当切换帧时,您需要为frame_to_be_available_and_switch_to_it() 引入 WebDriverWait,并且您需要:

        • 诱导 WebDriverWait 使所需的框架可用并切换到它
        • 诱导 WebDriverWait 使所需的元素可点击
        • 您可以使用以下解决方案:

          target_element.click()
          WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"frame_xpath")))
          WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "REF"))).click()
          
        • 可以在How can I select a html element no matter what frame it is in in selenium?找到关于帧切换的详细讨论

        在这里你可以找到Ways to deal with #document under iframe的相关讨论

        【讨论】:

          猜你喜欢
          • 2020-10-15
          • 1970-01-01
          • 2015-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多