截取Selenium中测试失败的屏幕截图

时间:2019-07-21 13:29:01

标签: java selenium screenshot

我正在尝试编写一个硒代码,该代码需要在测试失败时截图。

这是在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。

有人可以帮我吗?

2 个答案:

答案 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
}

}