[英]Take screenshot on test failure in Selenium
我正在嘗試編寫一個硒代碼,該代碼在測試失敗時需要截圖。
這是在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();
}
我面臨的問題是File src = ts.getScreenshotAs(OutputType.FILE);行。
該語句引發NullPointerException。
誰能幫我這個?
我建議在這里做以下技巧:
1)首先創建Screen界面。
package com.ej.alumni.selenium.testcases.core;
import org.openqa.selenium.WebDriver;
public interface Screen {
WebDriver getDriver();
}
2)測試套件類將以以下方式表示:
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;
}
}
3)並在偵聽器中獲取WebDriver實例,應實現:
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;
}
}
希望這對您有用。
如果您覺得很麻煩,則無需使用任何偵聽器。 只需遵循以下解決方法。
1:用戶@AfterMethod批注2:傳遞ITestResult作為參數和驅動程序(如果take屏幕截圖方法位於其他類中)3:在測試后,調用take屏幕截圖方法。 根據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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.