我正在尝试编写一个硒代码,该代码需要在测试失败时截图。
这是在Listeners类中编写的。
@Override
public void onTestFailure(ITestResult result) {
// TODO Auto-generated method stub
System.out.println("***** Error " + result.getName() + " test has failed *****");
ITestContext context = result.getTestContext();
WebDriver driver = (WebDriver) context.getAttribute("driver");
TakesScreenshot ts = (TakesScreenshot)driver;
File src = ts.getScreenshotAs(OutputType.FILE);
System.out.println(src.getAbsolutePath());
try {
FileHandler.copy(src, new File("./Screenshots/OnboardingTestFailed.png"));
System.out.println("Screenshot taken");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我面临的问题是线路 文件src = ts.getScreenshotAs(OutputType.FILE);
此语句引发NullPointerException。
有人可以帮我吗?
答案 0 :(得分:0)
我建议在此处进行以下操作:
1)首先,创建屏幕界面。
public class LoginTest implements Screen {
private WebDriver driver;
@Test(groups = {"LOGIN"})
public void myPrimaryTest()
//driver init
driver = .... ;
driver.get(baseUrl);
// ....
}
@Override
public WebDriver getDriver() {
return driver;
}
}
2)测试套件类将以以下方式表示:
public class CustomTestListener extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult result) {
try {
Object currentClass = result.getInstance();
if (currentClass instanceof Screen) {
WebDriver driver = ((Screen) currentClass).getDriver();
byte[] srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
saveScreenshot(srcFile);
postBrowserLogs(driver);
}
} catch (Exception e) {
Error e1 = new Error(e.getMessage());
e1.setStackTrace(e.getStackTrace());
throw e1;
}
}
@Override
public void onTestSuccess(ITestResult result) {
Object currentClass = result.getInstance();
if (currentClass instanceof Screen) {
WebDriver driver = ((Screen) currentClass).getDriver();
byte[] srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
saveScreenshot(srcFile);
postBrowserLogs(driver);
}
}
@Attachment(value = "Page screenshot", type = "image/png")
private byte[] saveScreenshot(byte[] screenshot) {
return screenshot;
}
}
3)并且要在监听器中获取 WebDriver 实例,应实现:
{{1}}
希望这对您有用。
答案 1 :(得分:0)
如果您觉得很麻烦,则无需使用任何侦听器。只需遵循以下解决方法。
1:用户@AfterMethod批注 2:将ITestResult作为参数和驱动程序传递(如果采取截屏方法在不同的类中) 3:在测试后,调用采取屏幕截图方法。在ITestResult的基础上,捕获屏幕。
@AfterMethod
public void after_method(ITestResult result, WebDriver driver) {
takeScreenshot(result,driver);
}
public void takeScreenshot(ITestResult result,WebDriver driver) {
if (result.getStatus() == ITestResult.FAILURE) {
byte[] srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.BYTES);
// add more code to save file
}
}