我在我的测试套件中使用Capybara和Selenium webdriver。我注意到,当所有测试都完成后,Selenium会通过绑定到at_exit
来关闭浏览器。但是,这会导致我的Web应用程序出现问题,显示“您确定要离开”对话框onunload
(请不要判断。这是一个Intranet应用程序,用户特别要求它。)。因此,当测试完成时,我的Cucumber场景失败(即使我的所有步骤都已通过),因为存在未处理的Javascript confirm
对话框。在Selenium尝试关闭浏览器并接受对话框后,有没有办法绑定?
更新
我相信我已经找到了这个问题。似乎在每次测试后,Capybara通过清除所有cookie并导航到about:blank来重置浏览器。这是导致onbeforeunload
对话框打开的原因(不是browser.quit()
)。我在Capybara邮件列表上发帖,试图获得这方面的帮助,并发布我在这里找到的任何内容。
答案 0 :(得分:1)
您是否可以切换上下文at_exit
并接受或取消警报。像这样的东西
at_exit do
page.driver.browser.switch_to.alert.accept
#or
page.driver.browser.switch_to.alert.dismiss
end
答案 1 :(得分:0)
如果您正在使用像JUnit或TestNG这样的单元测试框架,那么我所做的就是使用@AfterTest或@AfterClass之类的配置文件来退出浏览器。这样,在测试运行时,浏览器始终处于运行状态。直到@Test块完成后,测试用例才会关闭浏览器实例。
如果你使用Ruby,我认为有类似的东西。
答案 2 :(得分:0)
正如我在OP更新中所提到的,似乎Capybara导航到about:blank作为每个Cucumber场景的结束。在与Capybara团队的jnicklas交谈之后,看来处理这个问题的最佳方法是实现一个Cucumber after
处理程序,在Capybara尝试处理警报之前导航它。
After do
# after each test navigate away before Capybara tries to so that we can appropriately handle the onbeforeunload dialog
if @browser
begin
@browser.navigate.to("about:blank")
@browser.switch_to.alert.accept
rescue Selenium::WebDriver::Error::NoAlertPresentError
# No alert was present. Don't need to do anything
end
end
end
答案 3 :(得分:-1)
就像提到的那样,调用driver.Quit()应该可以解决问题,但是如果弹出窗口导致阻止浏览器关闭的问题,那么就删除实例。一个简单的解决方案是将您的测试包装在using子句中。
using (IWebDriver driver = new FirefoxDriver())
{
//Perform your test
driver.Quit();
}