【问题标题】:The browser window may have been closed. (Selenium::WebDriver::Error::UnknownError)浏览器窗口可能已关闭。 (Selenium::WebDriver::Error::UnknownError)
【发布时间】:2013-04-22 15:14:27
【问题描述】:

我有多个功能一起运行时会抛出此错误。如果我自己运行场景,则没有问题。我认为问题是在测试运行期间会生成弹出窗口并且没有正确关闭。我在 After 钩子中有代码,它会关闭所有打开的窗口,除了打开的第一个窗口。

错误:会话 [2c50a228-3ad7-a544-a6ca-5d173b86bc86] 没有驱动程序。浏览器窗口可能已关闭。 (Selenium::WebDriver::Error::UnknownError)

我在代码中添加了一堆打印语句来获取当前状态:
之后:会话 -> #Capybara::Session:0x00000100f811b8>
之前:驱动程序->硒
之前:会话对象 -#Capybara::Session:0x00000100f811b8>
之前:(开始)驱动对象#Capybara::Selenium::Driver:0x000001028ad790>

这个特定场景之前的场景失败了,这一定是罪魁祸首,但为什么呢?谁能指出我正确的方向?

挂钩后

#assume ONLY last window opened is to be closed
page.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
page.execute_script "window.close();"

#switch back to first window opened, make it the default window now
page.driver.browser.switch_to.window(page.driver.browser.window_handles.first)  


环境: 水豚 (2.0.3)
黄瓜 (1.1.9)
selenium-webdriver (2.29.0)
红宝石 1.9.3p0

【问题讨论】:

  • 哪一行报错,请分享

标签: ruby selenium cucumber capybara selenium-webdriver


【解决方案1】:
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "https://www.google.co.in/"
address = driver.find_element(:link_text, "Gmail").attribute('href')
driver.execute_script( "window.open()" )
p driver.window_handles.length
p driver.window_handles.first #=> "{f17eac79-daf9-4a6c-a1ff-1b524fef9faf}"
driver.switch_to.window( driver.window_handles.last )
driver.get address
driver.execute_script "window.close()"
driver.execute_script "window.close()"
# => Window not found. The browser window may have been closed. (Selenium::WebDriver::Error::NoSuchWindowError)

在上面的代码中,我只是试图重新生成错误,它发生了。Error 非常合乎逻辑,因为我试图关闭一个已经关闭、不存在的窗口。

现在我想这样调试:

p driver.browser.window_handles.length # if this is 0,then below line obvious throw error.
page.driver.browser.switch_to.window(page.driver.browser.window_handles.last)
page.execute_script "window.close();"
p driver.browser.window_handles.length # if this is 0,then below line obvious throw error.
page.driver.browser.switch_to.window(page.driver.browser.window_handles.first)

现在调试并告诉我你的结果。

【讨论】:

  • 我在关闭第二个窗口时遇到错误,这是我预料到的,但即使我没有关闭所有窗口,我似乎也会收到此错误。我刚刚重新运行了我的功能,好像页面对象有些丢失了!前一步会访问页面,但下一步会丢失它!
  • @ChesterTester 是的,您需要仔细调试您的代码,尝试关闭一个窗口,该窗口可能会提前关闭。
【解决方案2】:

解决方案是首先最大化窗口。我还没有找到最大化窗口的方法。在测试过程中,我手动点击浏览器最大化按钮,测试运行完美。

https://github.com/fahenao/_bot

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。