我正在 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 方法将清除浏览器引用,这意味着之后您将无法获取驱动程序。
此外,您不应该创建新的
RemoteWebDriver
在 setup()
但你应该disable driver caching这意味着每个驱动程序请求都会创建一个新驱动程序(每个浏览器创建一个驱动程序,每个测试创建一个新浏览器),而不是重用缓存的驱动程序。
关于groovy - 每次 Geb Spock 测试后退出驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29357333/