如何在Java Selenium中将屏幕截图附加到Extent报告

3

我试图将测试用例失败的截图附加到我的 Extent 报告中,但不知何故无法附加。

我尝试了各种解决方案,但均未成功。 我使用的是 Extent Report 版本 3。

以下是单独的 ExtentReport 类中完整的代码:

    package com.qa.ExtentReportListener;


    import java.io.IOException;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;

    import org.testng.IReporter;
    import org.testng.IResultMap;
    import org.testng.ISuite;
    import org.testng.ISuiteResult;
    import org.testng.ITestContext;
    import org.testng.ITestResult;
    import org.testng.Reporter;
    import org.testng.xml.XmlSuite;

    import com.aventstack.extentreports.ExtentReports;
    import com.aventstack.extentreports.ExtentTest;
    import com.aventstack.extentreports.Status;
    import com.aventstack.extentreports.reporter.ExtentHtmlReporter;
    import com.aventstack.extentreports.reporter.configuration.ChartLocation;
    import com.aventstack.extentreports.reporter.configuration.Theme;
    import com.crm.qa.util.TestUtil;

    public class ExtentTestNGIReporterListener implements IReporter {

        private static final String OUTPUT_FOLDER = "test-output/";
        private static final String FILE_NAME = "Extent.html";

        private ExtentReports extent;
        private ExtentTest test;

        public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
            init();

            for (ISuite suite : suites) {
                Map<String, ISuiteResult> result = suite.getResults();

                for (ISuiteResult r : result.values()) {
                    ITestContext context = r.getTestContext();

                    buildTestNodes(context.getFailedTests(), Status.FAIL);
                    buildTestNodes(context.getSkippedTests(), Status.SKIP);
                    buildTestNodes(context.getPassedTests(), Status.PASS);

                }
            }

            for (String s : Reporter.getOutput()) {
                extent.setTestRunnerOutput(s);
            }

            extent.flush();
        }

        private void init() {
            ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter(OUTPUT_FOLDER + FILE_NAME);
            htmlReporter.config().setDocumentTitle("ExtentReports - Created by TestNG Listener");
            htmlReporter.config().setReportName("ExtentReports - Created by TestNG Listener");
            htmlReporter.config().setTestViewChartLocation(ChartLocation.BOTTOM);
            htmlReporter.config().setTheme(Theme.STANDARD);

            extent = new ExtentReports();
            extent.attachReporter(htmlReporter);
            extent.setReportUsesManualConfiguration(true);
        }

        private void buildTestNodes(IResultMap tests, Status status) {


            if (tests.size() > 0) {
                for (ITestResult result : tests.getAllResults()) {
                    test = extent.createTest(result.getMethod().getMethodName());

                    for (String group : result.getMethod().getGroups())
                        test.assignCategory(group);

                    if (result.getThrowable() != null) {
                        test.log(status, result.getThrowable());
                    }
                    else {
                        test.log(status, "Test " + status.toString().toLowerCase() + "ed");
                    }

                    test.getModel().setStartTime(getTime(result.getStartMillis()));
                    test.getModel().setEndTime(getTime(result.getEndMillis()));
                }
            }
        }

        public void down(ITestResult result) throws IOException{


            if(result.getStatus()==ITestResult.FAILURE){
                test.log(Status.FAIL, "TEST CASE FAILED IS "+result.getName()); //to add name in extent report
                test.log(Status.FAIL, "TEST CASE FAILED IS "+result.getThrowable()); //to add error/exception in extent report

                String screenshotPath = TestUtil.takeScreenshotAtEndOfTest();
                test.fail("Test Case failed check screenshot below"+test.addScreenCaptureFromPath(screenshotPath));
                //extentTest.log(Status.FAIL, MediaEntityBuilder.createScreenCaptureFromPath(screenshotPath).build()); //to add screenshot in extent report
                //extentTest.fail("details").addScreenCaptureFromPath(screenshotPath);
            }
            else if(result.getStatus()==ITestResult.SKIP){
                test.log(Status.SKIP, "Test Case SKIPPED IS " + result.getName());
            }
            else if(result.getStatus()==ITestResult.SUCCESS){
                test.log(Status.PASS, "Test Case PASSED IS " + result.getName());

            }
        extent.flush();
        }

        private Date getTime(long millis) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTimeInMillis(millis);
            return calendar.getTime();      
        }
    }

这是我的工具类,其中包含截图方法:

public static String takeScreenshotAtEndOfTest() throws IOException {
    String dateName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
    TakesScreenshot ts = (TakesScreenshot)driver;
    File source = ts.getScreenshotAs(OutputType.FILE);
    String destination = System.getProperty("user.dir") + "/screenshots/" +  dateName
            + ".png";
    File finalDestination = new File(destination);
    FileHandler.copy(source, finalDestination);
    return destination;
}
6个回答

1

在 after 方法中使用此代码

if(result.getStatus()==result.FAILURE || result.getStatus()==result.SKIP) {
            String screenshotPath = util.captureScreenshot(driver, result.getName());
            result.setAttribute("screenshotPath", screenshotPath); //sets the value the variable/attribute screenshotPath as the path of the sceenshot
        }

并在buildtestnodes中添加以下代码

    if(result.getStatus()==result.FAILURE || result.getStatus()==result.SKIP) {
                        String screenshotPath=(String) 
     result.getAttribute("screenshotPath");
                        test.log(status, test.addScreenCapture(screenshotPath));
                    } 

0
    package com.helper;

    import org.testng.annotations.Test;

    import com.aventstack.extentreports.AnalysisStrategy;
    import com.aventstack.extentreports.ExtentReports;
    import com.aventstack.extentreports.ExtentTest;
    import com.aventstack.extentreports.MediaEntityBuilder;
    import com.aventstack.extentreports.Status;

    import com.aventstack.extentreports.reporter.ExtentSparkReporter;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;

    import org.apache.commons.codec.binary.Base64;
    import org.apache.commons.io.FileUtils;
    import org.openqa.selenium.By;
    import org.openqa.selenium.OutputType;
    import org.openqa.selenium.TakesScreenshot;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.chrome.ChromeDriver;
    import org.openqa.selenium.edge.EdgeDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.ie.InternetExplorerDriver;
    import org.openqa.selenium.opera.OperaDriver;
    import org.testng.IResultMap;
    import org.testng.ITest;
    import org.testng.ITestContext;
    import org.testng.ITestResult;
    import org.testng.Reporter;
    import org.testng.annotations.AfterMethod;
    import org.testng.annotations.BeforeMethod;
    import org.testng.annotations.Listeners;
    import org.testng.annotations.Test;







    public class TestingEdgeDriver {
        ExtentReports extent;
        ExtentTest test;
        WebDriver driver;
        ExtentTest Parent;
        ExtentTest child1,child;
        
        @BeforeMethod
        public void setup(){
            
            DateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH-mm-ss"); 
            String destDir = dateFormat.format(new Date());
            ExtentSparkReporter esp=new ExtentSparkReporter(System.getProperty("user.dir")+"/ExtentReport/ExtentReports_"+destDir+"/SwarupExtentReport.html");
            extent=new ExtentReports();
            extent.attachReporter(esp);
            extent.setAnalysisStrategy(AnalysisStrategy.SUITE);
        }
        
        @Test (testName="Chrome browser Testing")public void chromeBrowser() throws IOException{
            /*extent.attachReporter(spark);
            extent.createTest("chromeBrowser").log(Status.PASS  , "This is logging event for the setup and it is passed");
            extent.flush();*/
            Parent=extent.createTest("CMO");
            child1=Parent.createNode("Test1");
            child=child1.createNode("Chrome browser Testing");
            
            System.out.println("The tread value for Chrome browser is "+ Thread.currentThread().getId());
            System.setProperty("webdriver.chrome.driver","E:\\chromedriver_win32 (2)\\chromedriver.exe");
            driver=new ChromeDriver();
            child.log(Status.PASS, "Chrome browser has opened",MediaEntityBuilder.createScreenCaptureFromPath(capture(driver)).build());
            driver.get("https://www.icicibank.com");
            
            child.log(Status.PASS,"Expected was its should open the bank website",MediaEntityBuilder.createScreenCaptureFromPath(capture(driver)).build());
            
            child.log(Status.PASS, "Need to open the URL "+" http://www.icicibank.com");
            driver.manage().window().maximize();
            child.log(Status.PASS, "Test Case is passed",MediaEntityBuilder.createScreenCaptureFromPath(capture(driver)).build());
            
            
            
        }
        
        @AfterMethod
        public void getResult(ITestResult result){
            if(result.getStatus()==ITestResult.SUCCESS){
                child.log(Status.PASS, "Test case is passed "+result.getStatus()+" "+result.getTestClass()+"  "+result.getName());
                child.log(Status.PASS, "Test case is passed "+result.getTestName());
                
            }
            if(result.getStatus()==ITestResult.FAILURE){
                child.log(Status.FAIL, "Test case is failed at below location "+result.getThrowable());
            }
            extent.flush();
        }
        
        
        /*@Test public void operaTesting(){
            System.out.println("The tread value for Opera browser is "+ Thread.currentThread().getId());
            System.setProperty("webdriver.opera.driver","E:\\operadriver_win32\\operadriver_win32\\operadriver.exe");
            Reporter.log("opera driver has been set",true);
            driver=new OperaDriver();
            driver.manage().window().maximize();
            driver.get("https://www.irctc.co.in");
        }
        @Test public void FirefoxTesting(){
            System.out.println("The tread value for Firefox browser is "+ Thread.currentThread().getId());
            System.setProperty("webdriver.gecko.driver","E:\\gecodriver\\geckodriver-v0.29.0-win32\\geckodriver.exe");
            Reporter.log("Gecko Driver has been set",true);
            driver=new FirefoxDriver();
            driver.manage().window().maximize();
            Reporter.log("firefox driver has been initialsed",true);
            driver.get("https://www.primevideo.com/");
        }
        @Test public void InternetExplorerTesting(){
            System.out.println("The tread value for IE browser is "+ Thread.currentThread().getId());
            System.setProperty("webdriver.ie.driver","E:\\IEDriverServer_Win32_3.4.0\\IEDriverServer.exe");
            Reporter.log("IE driver has been set",true);
            driver=new InternetExplorerDriver();
            driver.manage().window().maximize();
            driver.get("https://www.hotstar.com/in");
        }*/
        
        public static String captureBase64(WebDriver driver) throws IOException {
            String encodedBase64 = null;
            FileInputStream fileInputStream = null;
            File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
            File Dest = new File("src/../BStackImages/" + System.currentTimeMillis()
            + ".png");
            String errflpath = Dest.getAbsolutePath();
            FileUtils.copyFile(scrFile, Dest);
             
            try {
                
                fileInputStream =new FileInputStream(Dest);
                byte[] bytes =new byte[(int)Dest.length()];
                fileInputStream.read(bytes);
                encodedBase64 = new String(Base64.encodeBase64(bytes));

            }catch (FileNotFoundException e){
                e.printStackTrace();
            }
            return "data:image/png;base64,"+encodedBase64;
            
            
            }
        
        public static String capture(WebDriver driver) throws IOException {
            
            File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
            File Dest = new File("src/../BStackImages/" + System.currentTimeMillis()
            + ".png");
            String errflpath = Dest.getAbsolutePath();
            FileUtils.copyFile(scrFile, Dest);
            return errflpath;
            }
    }

1
请不要仅仅发布代码作为答案,还要提供解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Doj

0
如果您想使用测试类名称为失败的测试用例拍摄屏幕截图,请使用以下代码段。

click here

enter image description here


0

Extent Report已经提供了截图工具。请参考下面的链接:

https://extentreports.com/docs/versions/3/java/#automatic-screenshot-management

同时也可以找到相应的快照和代码:

 ExtentHtmlReporter htmlReporter = new ExtentHtmlReporter("extent.html");
htmlReporter.config().setAutoCreateRelativePathMedia(true);

test1.fail("details", MediaEntityBuilder.createScreenCaptureFromPath("1.png").build());
test2.fail("details", MediaEntityBuilder.createScreenCaptureFromPath("2.png").build());

如何使用Extent报告进行屏幕截图


最好提供流程描述而不只是链接。 - helvete

0

尝试使用这个:

logger.log(Status.FAIL, logger.addScreenCaptureFromPath("YOUR PATH"));

更新: 如果这个方法不起作用,只需使用标记语言转换内部记录器。 导入:import com.aventstack.extentreports.markuputils.Markup;

出现错误 java.lang.ClassCastException: com.aventstack.extentreports.ExtentTest 无法转换为 com.aventstack.extentreports.markuputils.Markup。 - napendra
获取 ExtentTest 对象,然后使用该对象以以下方式添加屏幕截图 - child.addScreenCaptureFromPath(System.getProperty("user.dir") + "/src/test/resources/screenshots/" + name); - Ankit Kumar

-1

使用以下Java示例:

   WebDriver driver = new FirefoxDriver();

   driver.get("http://www.google.com/");

        // Store the screenshot in current project dir.
        String screenShot = System.getProperty("user.dir")+"\\Artifacts\\FileName.png";

        // Call Webdriver to click the screenshot.
        File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);

        // Save the screenshot.
        FileUtils.copyFile(scrFile, new File(screenShot));

1
使用这个工具类,它包含了截图方法。 - Apoorwa Jayswal
1
这不是逻辑问题,这只能用于截取屏幕截图,但我想在 Extent 报告中获取失败的测试用例截图。 - user11783025

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接