测试完成后处理浏览器关闭

时间:2014-02-14 15:46:20

标签: selenium selenium-webdriver cucumber capybara

我在我的测试套件中使用Capybara和Selenium webdriver。我注意到,当所有测试都完成后,Selenium会通过绑定到at_exit来关闭浏览器。但是,这会导致我的Web应用程序出现问题,显示“您确定要离开”对话框onunload(请不要判断。这是一个Intranet应用程序,用户特别要求它。)。因此,当测试完成时,我的Cucumber场景失败(即使我的所有步骤都已通过),因为存在未处理的Javascript confirm对话框。在Selenium尝试关闭浏览器并接受对话框后,有没有办法绑定?

更新

我相信我已经找到了这个问题。似乎在每次测试后,Capybara通过清除所有cookie并导航到about:blank来重置浏览器。这是导致onbeforeunload对话框打开的原因(不是browser.quit())。我在Capybara邮件列表上发帖,试图获得这方面的帮助,并发布我在这里找到的任何内容。

4 个答案:

答案 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(); 
}