【问题标题】:Handling browser closing when tests are done测试完成时处理浏览器关闭
【发布时间】:2014-02-24 23:49:05
【问题描述】:

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

更新

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

【问题讨论】:

  • 虽然我并不完全熟悉您使用的绑定,但 driver.switch_to_alert() alert.confirm()(对于 python 版本)是否不适合您?
  • 这就是我需要做的,我只是想不出合适的地方去做。测试场景完成后,Capybara 或 Cucumber 似乎正在关闭浏览器。那时我需要切换到警报并接受它。
  • 是否可以使用“tearDown”方法?你可以在那里输入try/catch 吗?
  • 是的,这就是我要找的。 Capybara 绑定了一个at_exit 方法,在该方法中调用driver.quit()。但我需要在 driver.quit() 方法内部,因为这是弹出 confirm 对话框的地方,如果我不处理它,就会引发异常。
  • 使用 Python 绑定 driver.quit() 只会退出,无论打开什么。我已经在带有onunload 的页面上使用它来显示提示。没问题。 documentation 还说quit“关闭每个关联的窗口”(提示也是一个窗口,所以应该关闭它)。对我来说,这表明 Ruby 绑定中存在错误,或者其他干扰 Selenium 的东西。

标签: selenium selenium-webdriver cucumber capybara


【解决方案1】:

您是否可以切换上下文at_exit 并接受或关闭警报。像这样的

at_exit do
  page.driver.browser.switch_to.alert.accept
  #or
  page.driver.browser.switch_to.alert.dismiss
end

【讨论】:

  • 感谢您的提示。我尝试设置自己的 at_exit 方法(它似乎在 Capybara 的 at_exit 之前运行。问题是在浏览器关闭之前我无法接受或关闭警报。如果我尝试调用 quit 然后接受这也不起作用的警报(警报消失然后又回来)。
【解决方案2】:

如果你正在使用像 JUnit 或 TestNG 这样的单元测试框架,那么我所做的就是使用像 @AfterTest 或 @AfterClass 这样的配置注解来退出浏览器。这样,当测试运行时,浏览器总是启动的。直到@Test 块完成,测试用例才会关闭浏览器实例。

如果您使用的是 Ruby,我假设有类似的东西。

【讨论】:

    【解决方案3】:

    正如我在 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
    

    【讨论】:

      【解决方案4】:

      就像前面提到的,调用 driver.Quit() 应该可以解决问题,但如果弹出窗口导致浏览器无法关闭,则删除该实例。一个简单的解决方案是将测试包装在 using 子句中。

      using (IWebDriver driver = new FirefoxDriver())
      {
          //Perform your test
          driver.Quit(); 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-20
        • 1970-01-01
        • 2023-02-19
        • 2010-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        相关资源
        最近更新 更多