gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:54:02 25 4
gpt4 key购买 nike

我正在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com