【问题标题】:Selenium - NoSuchElementException after switching from frame[0] to window[1] - Firefox GeckoDriver Error - PythonSelenium - 从帧 [0] 切换到窗口 [1] 后出现 NoSuchElementException - Firefox GeckoDriver 错误 - Python
【发布时间】:2017-02-08 11:24:55
【问题描述】:

我在 Firefox GeckoDriver 浏览器中收到错误 element not found

当我从window[1]切换到frame[0]时,再回到window[1],然后点击关闭frame按钮。

我想继续使用GeckoDriver,因为我遇到了ChromeDriver 的性能问题。抱歉,这是一个内部网站,我无法分享 HTML

  1. 我已执行以下操作来查明问题。
    • 使用完全相同的代码进行测试,并在 Chrome 驱动程序中正常工作
    • 当我切换到窗口 [1] 单击 openframe 按钮,然后单击 closeframe 按钮时,在 Firefox 中工作,而不切换到框架 [0]。
    • 我可以切换到frame[0],切换回window[1]并执行driver.close(),它会关闭window[1]。
    • 从 frame[0] 切换回来后,我可以从 window[1] 读取 driver.page_source 并看到该元素仍在 page_source 中并且没有更改。
    • 我可以从 frame[0] 切换回 window[0] 并单击按钮重新打开 window[1] 并且可以正常工作。然后我可以点击打开和关闭框架按钮。

所以问题只在于从 frame[0] 切换回 window[1],然后尝试在 Firefox GeckoDriver 中单击 window[1] 中的元素。

Python:2.7
硒:3.0.1
GeckoDriver:v0.13.0
火狐:51.0.1

代码如下:

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(capabilities=firefox_capabilities)
driver.get('www.internalwebsite.com')
driver.find_element_by_id('opensnewwindow').click()
driver.switch_to_window(driver.window_handles[1])
driver.find_element_by_id('opennewframe').click()
driver.switch_to_frame(0)
//read contents
driver.switch_to_window(driver.window_handles[1])
driver.find_element_by_id('closeframe').click()

错误:

selenium.common.exceptions.NoSuchElementException:消息:无法定位元素:[id="closeframe"]

【问题讨论】:

  • 您正在使用索引进行切换,您确定打开/关闭帧后您的索引正确吗?尝试按框架名称和主窗口切换。

标签: javascript python selenium geckodriver firefox-marionette


【解决方案1】:

下面的代码似乎可以解决问题。仍然不知道为什么。

driver.switch_to.default_content()

firefox_capabilities = DesiredCapabilities.FIREFOX
firefox_capabilities['marionette'] = True
driver = webdriver.Firefox(capabilities=firefox_capabilities)
driver.get('www.internalwebsite.com')
driver.find_element_by_id('opensnewwindow').click()
driver.switch_to_window(driver.window_handles[1])
driver.find_element_by_id('opennewframe').click()
driver.switch_to_frame(0)
//read contents
driver.switch_to.default_content()
driver.switch_to_window(driver.window_handles[1])
driver.find_element_by_id('closeframe').click()

【讨论】: