当前位置: 首页 > 知识库问答 >
问题:

每次Geb Spock测试后退出驱动程序

松博耘
2023-03-14

我在一个扩展GebreportingSpec的类中尝试了这一点:

def cleanup() {
    if (System.getProperty('geb.env')?.contains('sauce')) {
        setSauceJobStatus()
        driver.quit()
    }
}

当然,我在setup()方法中创建了一个新的RemoteWebDriver。

使用这种方法,每个测试都得到一个独特的Sauce Connect会话,结果都以Sauce的形式组织得很好。但是,由于以下原因,所有测试都失败了:

void report(String label = "") {
    browser.report(ReporterSupport.toTestReportLabel(_gebReportingSpecTestCounter, _gebReportingPerTestCounter++, _gebReportingSpecTestName.methodName, label))
}
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:125)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:572)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:622)
at org.openqa.selenium.remote.RemoteWebDriver.getPageSource(RemoteWebDriver.java:459)
at geb.report.PageSourceReporter.getPageSource(PageSourceReporter.groovy:42)
at geb.report.PageSourceReporter.writePageSource(PageSourceReporter.groovy:38)
at geb.report.PageSourceReporter.writeReport(PageSourceReporter.groovy:29)
at geb.report.CompositeReporter.writeReport(CompositeReporter.groovy:31)
at geb.Browser.report(Browser.groovy:788)
at geb.spock.GebReportingSpec.report(GebReportingSpec.groovy:44)
at geb.spock.GebReportingSpec.cleanup(GebReportingSpec.groovy:39)

共有1个答案

汝才良
2023-03-14

不幸的是,您遇到了gebreportingspec实现的限制,以及继承层次结构中Spock的设置和清理方法的固定执行顺序。您应该使用重写gebspec.resetbrowser()而不是cleanup()的方法退出浏览器:

void resetBrowser() {
    def driver = browser.driver
    super.resetBrowser()
    if (System.getProperty('geb.env')?.contains('sauce')) {
        driver.quit()
    }
}

获取对驱动程序的本地引用,然后调用super方法很重要,因为调用super方法将清除浏览器引用,这意味着在此之后您将无法获得驱动程序。

此外,您不应该在setup()中创建新的RemoteWebDriver,但是您应该禁用驱动程序缓存,这意味着每个驱动程序请求将创建一个新的驱动程序(每个浏览器创建请求一个驱动程序,每个测试创建一个新的浏览器),而不是重用缓存的驱动程序。

 类似资料:
  • 我正在尝试在python中使用selenium,由于某种原因我无法修改PATH,因此我只能指定浏览器驱动程序的位置。但是,我尝试了几个驱动程序,但都不起作用。 环境:Windows 7,Anaconda3-python3.6.1,selenium3.4.3,chrome59.0.3071.115(官方构建)(64位),chromedriver2.30(win32)。 这里是我尝试过的一部分代码和相

  • 在跨平台运行我的自动化测试时,存在登录冲突,我通过创建一个方法来解决此冲突,该方法在两个平台之间切换之前重置浏览器会话: 这在本地有效,但在BrowserStack上运行时,此方法退出会话。我还创建了一个使用Chrome UI(版本86.0.4240.111)来清除历史记录的方法

  • 问题内容: 我最近在许多Android应用程序和游戏中都注意到了这种模式:单击“后退”按钮以“退出”该应用程序时,会出现类似“请再次单击BACK退出”的消息。 我想知道,正如我越来越经常看到的那样,这是你可以以某种方式在活动中访问的内置功能吗?我看过许多类的源代码,但似乎找不到任何东西。 当然,我可以考虑几种很容易实现相同功能的方法(最简单的方法可能是在活动中保留一个布尔值,以指示用户是否已经单击

  • 迁移工作得很好,但事务根本不起作用。 我尝试公开我的设置: 运行在docker容器中的MariaDB 10.1(我已经证明了测试中使用的所有表都在InnoDB中,因此支持事务处理) 基测试类正在使用 我尝试了一个单独的连接与一起进行测试,并使用默认连接进行测试。事务也不起作用

  • 问题内容: 我有一个包含2个测试的测试类: 当我单独运行测试时,我不会出错,但是当我同时运行所有测试时,会失败。失败是由于某些测试修改了应用程序上下文导致的: 是否可以单独运行此测试?我只想在启动test1时读取所有必需的东西,然后运行测试,然后关闭所有必需的东西。然后启动test2。 问题答案: 您可以在修改应用程序上下文的测试类上使用@DirtiesContext批注。 Java文档 Spri

  • 我有一组用unittest实现的测试,它们是自动运行的。我希望每小时最多运行一次,我有一个方法检查这个条件,并返回True(如果可以运行它们)或False(如果应该退出测试)。