gpt4 book ai didi

java - Selenium+junit - 与 @Rule 和 @After 方法冲突

转载 作者:太空宇宙 更新时间:2023-11-04 13:06:09 25 4
gpt4 key购买 nike

我正在致力于自动化工作中的一些测试,并希望添加在测试失败时截取屏幕截图的功能。我知道这可以使用 TestNG 以干净的方式轻松完成,但我们所有的单元/集成测试都使用 jUnit,所以我必须坚持这一点。

我的逻辑/代码几乎已经准备好并且正在工作,但我遇到了冲突,因为 @Rule 是在 @After TeaDown() 方法之后执行的,到那时 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: Session ID is null. Using WebDriver after calling quit()?

这当然是正在发生的事情。它尝试在调用 driver.quit()chromeDriverService.stop() 后调用代码来截取屏幕截图。如果我评论这两行,那么屏幕截图就会正确保存。

处理这个问题的正确方法是什么?有什么方法可以设置它,以便 @Rule 首先运行,然后是 @After?

最佳答案

好的,再浏览/搜索一下我发现 this question here这正是我想要的。我所做的是将tearDown 代码添加到@Rule 中,然后在try/catch block 之后使用finally 调用它。

  @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");
} finally {
tearDown();
}
}

public void tearDown() {
LOGGER.info("Quitting browser");
driver.quit();

LOGGER.info("Stopping Chrome Driver Service");
chromeDriverService.stop();
}
};

关于java - Selenium+junit - 与 @Rule 和 @After 方法冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34408049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com