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

标签 groovy gradle spock geb saucelabs

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

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

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

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

通过这种方法,我每次测试都会获得一个独特的 Sauce Connect session ,并且所有结果都在 Sauce 中进行了精美的组织。但是,由于以下原因,所有测试都失败了:

“org.openqa.selenium.remote.SessionNotFoundException: session 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 测试的唯一驱动程序?

最佳答案

不幸的是,您遇到了 GebReportingSpec 的限制Spock 的 setup 和 cleanup 方法在继承层次结构中的实现和固定执行顺序。您应该做的是以覆盖 GebSpec.resetBrowser() 的方法退出浏览器。而不是 cleanup() :

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

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

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

关于groovy - 每次 Geb Spock 测试后退出驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357333/

相关文章:

unit-testing - 模拟记录器时出现问题

java - Gradle 2.13连接了错误的JRE

java - 如何将 Sharepoint 日期从十六进制解析为 java.util.Date

Grails:方法的 ExpandoMetaClass

java - 使用 Gradle 配置 IntelliJ 代码样式

android - Android Studio中的Gradle同步错误

java - 通过 gradle 运行特定的@Issue

spring - 在 Grails 中将 Activiti 连接为 Spring Bean

grails - 在集成测试中执行Grails筛选器

jenkins - 如何在 Jenkins 管道 webhook 中为 office365Connector 添加备注、提交者和开发人员