我在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测试正确创建一个独特的驱动程序?
答案 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()
}
干杯!