groovy – 每次Geb Spock测试后退出驱动程序
我在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这意味着每个驱动程序请求将创建一个新的驱动程序(每个浏览器创建一个驱动程序,每个测试创建一个新的浏览器)而不是缓存一个被重用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |