关闭FireFox驱动程序刷新后警告

关闭FireFox驱动程序刷新后警告,firefox,selenium,geb,Firefox,Selenium,Geb,我继承了一些测试登录站点的GEB测试(以及各种错误案例/验证警告) 测试运行时遇到一些验证失败,然后尝试重新导航到同一页面(只是刷新页面/dom)并尝试有效登录。使用GEB的to()方法,它检测到您正试图导航到您所在的页面,它只调用refresh—这里的问题是试图刷新最后一个POST请求,而驱动程序显示 要显示此页面,Firefox必须发送重复先前执行的任何操作(如搜索或订单确认)的信息 消息-由于测试不希望出现此弹出窗口,因此它将挂起,测试将超时 有没有办法在FirefoxWebDriver中

我继承了一些测试登录站点的GEB测试(以及各种错误案例/验证警告)

测试运行时遇到一些验证失败,然后尝试重新导航到同一页面(只是刷新页面/dom)并尝试有效登录。使用GEB的to()方法,它检测到您正试图导航到您所在的页面,它只调用refresh—这里的问题是试图刷新最后一个POST请求,而驱动程序显示

要显示此页面,Firefox必须发送重复先前执行的任何操作(如搜索或订单确认)的信息

消息-由于测试不希望出现此弹出窗口,因此它将挂起,测试将超时

有没有办法在FirefoxWebDriver中关闭这些警告?或者通过Selenium或GEB自动忽略/接受它们

GEB版本:0.9.2, Selenium版本:2.39.0

(也尝试使用上面的次要版本:0.9.3和2.40.0)

注意事项:

  • 我知道POST/Re-direct/GET模式,但在这种情况下,我无权更改应用程序代码
  • 警告消息只会间歇性地(可能是5次中的1次)引发问题-我将此归因于速度/比赛条件,即测试在消息出现之前完成下一个操作-我知道一个可能的解决方案是更新测试以等待消息出现,然后接受,但我的问题是,是否有一个全局设置可以避免这些被触发/显示

    • 如果我理解您的问题,这可能会有所帮助。在Groovy中,可以动态修改类

      我们将Spock与Geb结合使用,我将其放在一个超类中,所有Spock规范都从该超类继承。QSpec扩展了GebSpec

      它是原始方法,对原始代码稍加修改,这样您就知道更改了什么。我在几个需要的地方使用此技术来改变Geb行为

      static {
      
          Browser.metaClass.go = { Map params, String url ->
              def newUrl = calculateUri(url, params)
              //          if (driver.currentUrl == newUrl) {
              //              driver.navigate().refresh()
              //          } else {
              //              driver.get(newUrl)
              //          }
              driver.get(newUrl)
              if (!page) {
                  page(Page)
              }
          }
      }
      

      如果我正确理解您的问题,这可能会有所帮助。在Groovy中,可以动态修改类

      我们将Spock与Geb结合使用,我将其放在一个超类中,所有Spock规范都从该超类继承。QSpec扩展了GebSpec

      它是原始方法,对原始代码稍加修改,这样您就知道更改了什么。我在几个需要的地方使用此技术来改变Geb行为

      static {
      
          Browser.metaClass.go = { Map params, String url ->
              def newUrl = calculateUri(url, params)
              //          if (driver.currentUrl == newUrl) {
              //              driver.navigate().refresh()
              //          } else {
              //              driver.get(newUrl)
              //          }
              driver.get(newUrl)
              if (!page) {
                  page(Page)
              }
          }
      }
      
      这个
      refresh()
      是用来解决IE驱动程序的一个问题的,它忽略了对
      driver.get()
      的调用,调用的url与当前的相同

      我将更改您的登录页面类的url,而不是对浏览器类进行修补(这可能会在某个地方咬到您,也可能不会咬到您)。例如,您可以添加一个无关紧要的查询字符串—我认为在末尾添加一个
      就足够了。
      driver.currentUrl==newUrl
      条件将计算为false,您将不再看到该弹出窗口。

      refresh()
      用于解决IE驱动程序忽略调用与当前url相同的
      driver.get()
      的问题


      我将更改您的登录页面类的url,而不是对浏览器类进行修补(这可能会在某个地方咬到您,也可能不会咬到您)。例如,您可以添加一个无关紧要的查询字符串—我认为在末尾添加一个
      就足够了。
      driver.currentUrl==newUrl
      条件将计算为false,您将不再看到该弹出窗口。

      :)这实际上与我考虑的解决方案非常接近-不确定是否覆盖go()如果我们想继续升级GEB版本,方法可能会在以后出现问题,尽管看不到有太多的更改。如果有帮助,我更改了这个,并且没有问题。还有另一种方法,我也为PageChangeListening更改了,这可能会有所帮助。如果您需要,我会在工作中检查它。:)这实际上与我考虑的解决方案非常接近-不确定如果我们想继续升级GEB版本,重写go()方法以后是否会有问题-尽管看不到有太多的更改。如果有帮助,我更改了它,没有问题。还有另一种方法,我也为PageChangeListening更改了,这可能会有所帮助。如果你需要的话,我会在工作中检查。很好的优雅解决方案。知道IE的更新也很好。但奇怪的是,我之所以改变这一点是因为IE以及它在逐步测试中的表现?很好的优雅解决方案。知道IE的更新也很好。但奇怪的是,我之所以改变这一点是因为IE以及它在逐步测试中的表现?