加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 16:22:26 所属栏目:大数据 来源:网络整理
导读:我在Sauce Connect中运行Geb / Spock测试,我希望每次测试都有RemoteWebDriver的唯一实例.这样,Sauce报告将按测试进行划分,这样可以轻松诊断故障.我并不担心(现在)关于额外的性能开销,因为它通过一个RemoteWebDriver实例运行所有Geb测试都没有用 – 它需要很
我在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会话,结果在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测试正确创建一个独特的驱动程序?

解决方法

不幸的是,你已经遇到了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,但是你应该disable driver caching这意味着每个驱动程序请求将创建一个新的驱动程序(每个浏览器创建一个驱动程序,每个测试创建一个新的浏览器)而不是缓存一个被重用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读