【发布时间】:2015-12-22 03:35:45
【问题描述】:
我正在努力使工作中的一些测试自动化,并希望添加在测试失败时截取屏幕截图的功能。我知道这可以很容易地用 TestNG 以干净的方式完成,但我们所有的单元/集成测试都使用 jUnit,所以我必须坚持这一点。
我几乎已经准备好它的逻辑/代码并且它正在工作,但我遇到了冲突,因为 @Rule 在 @After tearDown() 方法之后执行,到那时 webDriver 不再存在所以它没有任何东西可以截取屏幕截图。
这是我的代码:
@Rule
public TestRule testWatcher = new TestWatcher() {
@Override
protected void failed(Throwable e, Description description) {
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
String scrFilename = "Screenshot_"+ DateUtils.now().getTime()+".png";
File outputFile = new File(screenshotPath, scrFilename);
try {
LOGGER.info("Saving screenshot of failed test...");
FileUtils.copyFile(scrFile, outputFile);
} catch (IOException ioe) {
LOGGER.warn("Error taking screenshot");
}
}
};
这是tearDown方法:
@After
public void tearDown() {
LOGGER.info("Quitting browser");
driver.quit();
LOGGER.info("Stopping Chrome Driver Service");
chromeDriverService.stop();
}
我现在遇到的错误是这样的:
org.openqa.selenium.remote.SessionNotFoundException:会话 ID 是 无效的。调用 quit() 后使用 WebDriver?
这当然是正在发生的事情。它试图在调用driver.quit() 和chromeDriverService.stop() 之后调用代码进行截图。如果我评论这 2 行,则屏幕截图已正确保存。
处理这个问题的正确方法是什么?有什么办法可以设置它让@Rule 先运行然后@After?
【问题讨论】: