【问题标题】:Take screenshot on test failure in Selenium截取 Selenium 中测试失败的屏幕截图
【发布时间】:2019-07-22 18:30:46
【问题描述】:

我正在尝试编写一个在测试失败时截取屏幕截图的 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();
    }

我面临的问题是线路 文件 src = ts.getScreenshotAs(OutputType.FILE);

这个语句正在抛出 NullPointerException。

谁能帮我解决这个问题?

【问题讨论】:

  • 您确定 WedDriver 已正确初始化吗?似乎它为空,因此异常。
  • 正确,WebDriver 未正确初始化。你能指导如何将我的测试中的驱动程序对象从另一个类中传递给这个 Listeners 类
  • @AAINAARORA,嗨。在下面提供响应,其中包含代码 sn-p。希望对您有所帮助。

标签: java selenium screenshot


【解决方案1】:

我建议在这里做以下技巧:

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;
    }
}

希望这对你有用。

【讨论】:

    【解决方案2】:

    如果对您来说很复杂,则无需使用任何侦听器。只需按照以下解决方法即可。

    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
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2018-09-04
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      相关资源
      最近更新 更多