java .lang.NullPointerException Как сделать снимок экрана из метода testNG listner ontestfailure, прикрепить его к отчету о экстентах, если тест не пройден - PullRequest
1 голос
/ 07 апреля 2020

Как сделать снимок экрана из testNG listner методом ontestfailure прикрепить его к отчету о экстентах при неудачном прохождении теста

Здесь, когда тест не пройден, он делает снимок экрана и сохраняет его в папке с надписью «Failed Test ', но не в состоянии опубликовать sh отчет об экстентном отчете с ошибкой нулевой точки.

вот код для класса ExtentListner:

  package com.qa.ExtentReportListener;





    import java.io.File;

    import java.io.IOException;

    import java.text.SimpleDateFormat;

    import java.util.Calendar;

    import java.util.Date;

    import java.util.List;

    import java.util.Map;



    import org.openqa.selenium.OutputType;

    import org.openqa.selenium.TakesScreenshot;

    import org.openqa.selenium.WebDriver;

    import org.openqa.selenium.io.FileHandler;

    import org.testng.IReporter;

    import org.testng.IResultMap;

    import org.testng.ISuite;

    import org.testng.ISuiteResult;

    import org.testng.ITestContext;

    import org.testng.ITestListener;

    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.MediaEntityBuilder;

    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.base.TestBase;







    public class ExtentTestNGIReporterListener extends TestBase implements IReporter,ITestListener  {



        private static final String OUTPUT_FOLDER = "test-output/";

        private static final String FILE_NAME = "Extent.html";



        private  ExtentReports extent;

        private  ExtentTest test;





        public static String getScreenshot(WebDriver xdriver, String screenshotName) throws IOException{

            String dateName = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());

            TakesScreenshot ts = (TakesScreenshot) xdriver;

            File source = ts.getScreenshotAs(OutputType.FILE);

            // after execution, you could see a folder "FailedTestsScreenshots"

            // under src folder

            String destination = System.getProperty("user.dir") + "/FailedTestsScreenshots/" + screenshotName + dateName

                    + ".png";

            File finalDestination = new File(destination);

            FileHandler.copy(source, finalDestination);

            return destination;

        }



        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());

                        test.log(status, "TEST CASE FAILED IS "+result.getName()); //to add name in extent report

                        test.log(status, "TEST CASE FAILED IS "+result.getThrowable().getMessage());//to add error/exception in extent report

                        //String temp = TestUtil.takeScreenshotAtEndOfTest();

                        //test.fail("details",MediaEntityBuilder.createScreenCaptureFromPath(temp).build());

                    }

                    else {

                        test.log(status, "Test " + status.toString().toLowerCase() + "ed");

                    }                

                    test.getModel().setStartTime(getTime(result.getStartMillis()));

                    test.getModel().setEndTime(getTime(result.getEndMillis()));

                }

            }



        }





        private Date getTime(long millis) {

            Calendar calendar = Calendar.getInstance();

            calendar.setTimeInMillis(millis);

            return calendar.getTime();      

        }



        public void onTestFailure(ITestResult result) {

            try {

                if (!result.isSuccess()) {

                    String screenshotPath = ExtentTestNGIReporterListener.getScreenshot(driver, result.getName());
                    System.out.println("************screenshotPath************);");
                    System.out.println(screenshotPath);

                    test.fail("details",MediaEntityBuilder.createScreenCaptureFromPath(screenshotPath).build());

                }

            } catch (IOException e) {

                // TODO Auto-generated catch block

                e.printStackTrace();

            }

        }





    }

это выдает ошибку: для этой строки теста .fail ( "детали", MediaEntityBuilder.createScreenCaptureFromPath (screenshotPath) .build ()); для этой строки

    Screenshot taken:
    ************screenshotPath************);
    C:\Users\puru9\eclipse-workspace\DemoStart\DemoStart/FailedTestsScreenshots/GoogleLogoTest20200408123100.png
    java.lang.NullPointerException

        at com.qa.ExtentReportListener.ExtentTestNGIReporterListener.getScreenshot(ExtentTestNGIReporterListener.java:51)

        at com.qa.ExtentReportListener.ExtentTestNGIReporterListener.onTestFailure(ExtentTestNGIReporterListener.java:140)

        at org.testng.internal.TestListenerHelper.runTestListeners(TestListenerHelper.java:66)

        at org.testng.internal.TestInvoker.runTestResultListener(TestInvoker.java:219)

        at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:826)

        at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:146)

        at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)

        at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)

        at java.base/java.util.ArrayList.forEach(ArrayList.java:1510)

        at org.testng.TestRunner.privateRun(TestRunner.java:766)

        at org.testng.TestRunner.run(TestRunner.java:587)

        at org.testng.SuiteRunner.runTest(SuiteRunner.java:384)

        at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:378)

        at org.testng.SuiteRunner.privateRun(SuiteRunner.java:337)

        at org.testng.SuiteRunner.run(SuiteRunner.java:286)

        at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)

        at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)

        at org.testng.TestNG.runSuitesSequentially(TestNG.java:1187)

        at org.testng.TestNG.runSuitesLocally(TestNG.java:1109)

        at org.testng.TestNG.runSuites(TestNG.java:1039)

        at org.testng.TestNG.run(TestNG.java:1007)

        at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)

        at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)

        at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

вот класс TestBase:

    package com.crm.qa.base;



    import java.io.FileInputStream;

    import java.io.FileNotFoundException;

    import java.io.IOException;

    import java.util.Properties;

    import java.util.concurrent.TimeUnit;





    import org.openqa.selenium.WebDriver;

    import org.openqa.selenium.chrome.ChromeDriver;

    import org.openqa.selenium.firefox.FirefoxDriver;

    import org.openqa.selenium.support.events.EventFiringWebDriver;



    import com.crm.qa.util.TestUtil;

    import com.crm.qa.util.WebEventListener;



    public class TestBase {



        public static WebDriver driver;

        public static Properties prop;

        public  static EventFiringWebDriver e_driver;

        public static WebEventListener eventListener;



        public TestBase(){

            try {

                prop = new Properties();

                FileInputStream ip = new FileInputStream(System.getProperty("user.dir")+ "/src/main/java/com/crm"

                        + "/qa/config/config.properties");

                prop.load(ip);

            } catch (FileNotFoundException e) {

                e.printStackTrace();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }





        public static void initialization(){

            String browserName = prop.getProperty("browser");



            if(browserName.equals("chrome")){

                System.setProperty("webdriver.chrome.driver", "C:\\Users\\puru9\\eclipse-workspace\\webproj\\driver\\chromedriver.exe");    

                driver = new ChromeDriver(); 

            }

            else if(browserName.equals("FF")){

                System.setProperty("webdriver.gecko.driver", "/Users/naveenkhunteta/Documents/SeleniumServer/geckodriver"); 

                driver = new FirefoxDriver(); 

            }





            e_driver = new EventFiringWebDriver(driver);

            // Now create object of EventListerHandler to register it with EventFiringWebDriver

            eventListener = new WebEventListener();

            e_driver.register(eventListener);

            driver = e_driver;



            driver.manage().window().maximize();

            driver.manage().deleteAllCookies();

            driver.manage().timeouts().pageLoadTimeout(TestUtil.PAGE_LOAD_TIMEOUT, TimeUnit.SECONDS);

            driver.manage().timeouts().implicitlyWait(TestUtil.IMPLICIT_WAIT, TimeUnit.SECONDS);



            driver.get(prop.getProperty("url"));

        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...