簡體   English   中英

截取Selenium中測試失敗的屏幕截圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM