我在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这意味着每个驱动程序请求将创建一个新的驱动程序(每个浏览器创建一个驱动程序,每个测试创建一个新的浏览器)而不是缓存一个被重用.