有一些典型的解决方案可以在
@Test
失败时捕获屏幕截图,但是是否可以在 @Before/After
Class/Method
失败时执行此操作?
为什么我需要它? - 特别是对于
@BeforeMethod
来说,这会很好,我在测试类中使用通用逻辑 - 登录并转到特定页面。
您可能想尝试实现
WebDriverEventListener
,在您的情况下,您可能对方法onException
感兴趣,该方法将允许您对代码执行期间发生的每个异常进行处理,而且有必要使用EventFiringWebDriver
添加监听器
当前停止覆盖 TestNG
ITestListener
- onTestSkipped
方法。缺点是每个跳过的 @Test
方法都会截取屏幕截图。当然,下面的代码应该重构,但这是一个很好的起点。注意:您应该将此自定义侦听器包含到您的 testng.xml 中
@Override
public void onTestSkipped(ITestResult result) {
if(result != null){
String failedTestScreenshotFolder = Paths.get("").toAbsolutePath().toString() + "path/skippedScreenshots/";
WebDriver webDriver = ((TestBase)result.getInstance()).webDriver;
File scrFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
try {
String className = result.getTestClass().getName();
FileUtils.copyFile(scrFile, new File(failedTestScreenshotFolder + className.substring(className.lastIndexOf(".") + 1) + "." + result.getMethod().getMethodName() + ".jpg"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
对于 @Before 注释,您可以通过将屏幕截图放入 public void onTestSkipped(final ITestResult result) 来解决,因为当 Before 方法出现任何失败时,所有 @Test 将被跳过并调用 onTestSkipped。
这就是我在项目中解决它的方法:)