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

时间:2015-03-30 22:16:38

标签: groovy gradle spock geb saucelabs

我在Sauce Connect中运行Geb / Spock测试,我希望每个测试都有RemoteWebDriver的唯一实例。这样,Sauce报告将按测试进行划分,这样可以轻松诊断故障。我并不担心(现在)关于额外的性能开销,因为它通过一个RemoteWebDriver实例运行所有Geb测试都没有用 - 它需要很长时间来协调结果与Sauce截图/ screencasts,当超时发生时(在Sauce Connect上长时间运行的工作很可能),通常会有一些测试失败溢出。

我在扩展GebReportingSpec的类中尝试了这个:

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

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

通过这种方法,我在每个测试中获得了一个独特的Sauce Connect会话,结果在Sauce中得到了很好的组织。但是,所有测试都因以下原因而失败:

" org.openqa.selenium.remote.SessionNotFoundException:会话ID为空。调用quit()后使用WebDriver?"

事实证明,GebReportingSpec中的cleanup()方法调用了这个方法:

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)

假设在调用GebReportingSpec cleanup()方法时WebDriver实例仍然存在,以便可以准备报告信息。

所以,我的方法显然不是" Geb方式" ....我想知道是否有人能够了解如何根据Spock测试正确创建一个独特的驱动程序?

2 个答案:

答案 0 :(得分:3)

不幸的是,您已经遇到了GebReportingSpec实施的限制以及继承层次结构中Spock的设置和清理方法的固定执行顺序。您应该使用覆盖GebSpec.resetBrowser()而不是cleanup()的方法退出浏览器:

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

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

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

答案 1 :(得分:0)

如果使用browser.quit(),则会出现异常,测试将失败。您可以在课程开始时尝试以下代码段,它应该可以正常工作:

def setup() {       
    browser.config.cacheDriver = false
    browser.driver = browser.config.driver
}

def cleanup() {
    browser.close()
}

干杯!