当前位置: 首页 > 知识库问答 >
问题:

扩展报告3添加屏幕截图

袁骏祥
2023-03-14

我正在尝试使用extent report构建selenium,但无法使用save screenshot函数,因为我无法引用ITestListener类中的WebDriver对象。下面是我的示例代码:

测试转轮。java:

@Listeners({com.peterwkc.Listener.TestListener.class})
public class ChromeTestManager {

    private WebDriverManager webDriverManager = new WebDriverManager();
    private WebDriver driver;

    private LoginPages loginPages;
    private AdminPages adminPages;

    @BeforeClass
    //@Parameters({"browser"})
    public void setupTest(/*String browser*/) throws MalformedURLException {
        System.out.println("BeforeMethod is started. " + Thread.currentThread().getId());
        // Set & Get ThreadLocal Driver with Browser

        webDriverManager.createDriver("chrome");
        driver = webDriverManager.getDriver();

        // Pages Object Initialization
        loginPages = PageFactory.initElements(driver, LoginPages.class);
        logoutPages = PageFactory.initElements(driver, LogoutPages.class);
        adminPages = PageFactory.initElements(driver, AdminPages.class);
    }

    @DataProvider(name = "loginCredentials")
    public static Object[][] getLoginCredentials() {
        return new Object [][] {{ "Admin123", "admin123"  }, {"testUser", "test"}, {"test", "test"}};
    }

    @Test(groups= {"Login"}, description="Invalid Login", priority = 0, dataProvider = "loginCredentials", invocationCount = 3) 
    public void login_invalid(String username, String password) {
        loginPages.login_invalid(driver, username, password);
    }
}

TestListener.java公共类TestListener实现ITestListener{

    //Extent Report Declarations
    private static ExtentReports extent = ExtentManager.createInstance();
    private static ThreadLocal<ExtentTest> test = new ThreadLocal<>();

    public TestListener() {
    }

@Override
    public synchronized void onTestFailure(ITestResult result) {
        System.out.println((result.getMethod().getMethodName() + " failed!"));
        test.get().fail("Exception Error : \n" + result.getThrowable());

        /*String feature = getClass().getName();
        String screenShot;
        try {
            screenShot = CaptureScreenshot.captureScreen(driver, CaptureScreenshot.generateFileName(feature));
            test.get().addScreenCaptureFromPath(screenShot);
            test.get().log(Status.FAIL, screenShot);
        } catch (IOException ex) {    
            LogManager.logger.log(Level.INFO, "Exception: " + ex.getMessage());
        }*/

    }
}

问题:

>

  • 如何将WebDriver对象从TestRunner.java传递给TestListener类?

    如何在数据块报告3中保存屏幕截图?

    我的代码有什么问题吗?

    请帮忙,提前谢谢!

  • 共有2个答案

    壤驷阳波
    2023-03-14

    首先,不要在BeforeClass中实例化您的webDriver,因为这只作为注释调用一次,比如在类之前,请尝试使用接口ITestListener和beforeInvocation实现来初始化webDriver。

    其次,您不能一次为所有页面对象调用PageFactory,您认为如何一次初始化所有3个页面,这应该在每个页面对象的构造函数中实现,并且当您初始化页面对象(新登录)时,元素也会初始化,所以这是不确定的:

        // Pages Object Initialization
        loginPages = PageFactory.initElements(driver, LoginPages.class);
        logoutPages = PageFactory.initElements(driver, LogoutPages.class);
        adminPages = PageFactory.initElements(driver, AdminPages.class);
    

    第三,我没有看到ExtentReport测试的初始化。应该是这样的:

    ExtentTest extentTest = ExtentTestManager.startTest(method.getName(), "");
    

    这是我实现调用屏幕截图的代码示例部分,我正在从postInvtion调用它,因为我使用并发驱动程序初始化,所以它必须从这里开始,但也可以通过onTestFailure实现:

           public synchronized void afterInvocation(IInvokedMethod method, ITestResult testResult){
            if (method.isTestMethod() && testResult.getStatus()==2) {
    
                    File scrFile = (dataMethod.getAndroidDriver()).getScreenshotAs(OutputType.FILE);
                    String dest = System.getProperty("user.dir") + "/resources/screenshots/" + dataMethod.getDriver().getSessionId() + ".png";
    
                    File destination = new File(dest);
                    try {
                        FileUtils.copyFile(scrFile, destination);
                        dataMethod.setScreenshotPath(destination.getAbsolutePath());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                    System.err.println("Path:" + dataMethod.getScreenshotPath());
    
            }
    

    你必须更多地考虑结构,

    希望这有帮助。。。

    皇甫建木
    2023-03-14

    以下是执行此操作的步骤:

    1:将WebDriver对象传递给侦听器类

    首先在ChromeTestManager类中创建以下方法,或者在可以调用它的任何其他位置创建,这里假设它存在于ChromeTestManager类中:

    public static ITestContext setContext(ITestContext iTestContext, WebDriver driver) {
            iTestContext.setAttribute("driver", driver);
    
            return iTestContext;
        }
    

    它将驱动程序对象设置为TestContext。

    现在,将@BeforeClass设置方法更改为接受参数ITestContext,下面是代码:

    public class ChromeTestManager {
    
            private WebDriverManager webDriverManager = new WebDriverManager();
            private WebDriver driver;
    
            private LoginPages loginPages;
            private AdminPages adminPages;
    
            private static ITestContext context;  // creating a ITestContext variable
    
            @BeforeClass
            //@Parameters({"browser"})
            public void setupTest(ITestContext iTestContext) throws MalformedURLException {
                System.out.println("BeforeMethod is started. " + Thread.currentThread().getId());
                // Set & Get ThreadLocal Driver with Browser
    
                webDriverManager.createDriver("chrome");
                driver = webDriverManager.getDriver(); 
    
                this.context = setContext(iTestContext, driver);  // setting the driver into context
    
                // Pages Object Initialization
                loginPages = PageFactory.initElements(driver, LoginPages.class);
                logoutPages = PageFactory.initElements(driver, LogoutPages.class);
                adminPages = PageFactory.initElements(driver, AdminPages.class);
            }
    

    当您运行它时,它将平稳运行,不会产生错误(如果您认为我将如何传递ITestcontext上下文,那么它将在内部处理)

    现在,驱动程序已作为对象添加到ITestcontext中;

    现在访问Listener中的驱动程序:

    @Override
        public synchronized void onTestFailure(ITestResult result) {
            WebDriver driver = (WebDriver) result.getTestContext().getAttribute("driver");  // here we are accessing the driver object that we added in Test class  
    
    }
    

    2、在数据块报告3中保存屏幕截图(我正在maven中使用依赖项3.1.5)

    @Override
        public synchronized void onTestFailure(ITestResult result) {
            System.out.println("!!!!!!!!!!!!!!!!!!!! Test Failed !!!!!!!!!!!!!!!!!!!!");
    
            WebDriver driver = (WebDriver) result.getTestContext().getAttribute("driver"); // accessing driver here
            String feature = getClass().getName();
            String screenShot;
            try {
                screenShot = CaptureScreenshot.captureScreen(driver, CaptureScreenshot.generateFileName(feature));
                test.addScreenCaptureFromPath(screenShotPath);  // I am assuming that the "screenShot" is fully qualified path with extension e.g "C:\Users\12345\Desktop\sfgfdh.PNG"
            } catch (IOException ex) {    
                LogManager.logger.log(Level.INFO, "Exception: " + ex.getMessage());
            }
    
        }
    

    3、你的代码有什么问题吗?

    没有啦

    您只需要监听器类中的驱动程序,并且在范围报告中添加屏幕截图时,确保屏幕截图的路径是正确的,并且是带有扩展的完全限定路径。

    如果你在这方面遇到问题,请告诉我。

     类似资料:
    • 我使用的是扩展报告4。实际上,当测试失败时,我试图在扩展报告中添加屏幕截图。我使用下面的代码来实现这一点。截图会附在我的报告的结尾(请参考截图),但我希望截图在适当的步骤中附上,即当测试用例失败时。请帮助我解决方案或变通方法

    • Cucumber Extent Reports在没有屏幕截图的情况下工作,但是当我想要在Extent report中使用屏幕截图时,我会得到以下例外。 为了制作cucumber范围报告,我只做了配置更改。。。没有代码更改。为了添加截图,我在下面添加了钩子来添加截图API。 波姆。xml: 跑步者代码: 在钩子中添加截图代码: 添加了最后一行- 我使用extent.properties文件和exte

    • 我在我的项目中使用cucumber版本4。我在我的项目中使用以下依赖项。 使用上述依赖关系,我能够生成“cucumberjvm报告”。 我还用java编写了代码,用于将屏幕截图附加到报告中,我只在场景失败时拍摄屏幕截图。 我不确定是否遗漏了什么,但屏幕截图没有附加到报告中。cucumber生成的默认html报告正在显示屏幕截图。 谁能帮我一下吗。谢谢

    • 我无法看到截图被捕获在cucumber的程度报告。 我已经调试并观察到代码已经执行,但屏幕截图并没有保存在extent report或html report文件中。 截图代码 if(scenario.isFailed()){byte[]screenshot=seleniumitls.captureShot();scenario.public void screenshot(scenario sce

    • 我目前正在使用Cucumber框架和Selenium Java。我希望将我的正常cucumber报告升级为扩展报告。尝试使用扩展报告3.0.2。我能够生成范围报告,但我不能将失败测试用例的截图嵌入到范围报告中。 请大家帮忙了解一下,是否有可能将失败案例的截图嵌入到Cucumber Selenium Java框架中。如果是,请帮助我在转发与此或代码相关的任何链接。

    • 问题内容: 目前,我正在以这种方式拍摄测试失败的屏幕截图: 我可以将自己的屏幕截图包含在TestNG报告链接或图片中吗?如果是,怎么办? 我在网上发现的只是FEST框架。但是由于我已经在截屏了,所以我不想使用其他框架。 问题答案: 是的,您可以在testng报告中包含指向屏幕截图的链接。 您需要通过使用@Listeners({yourListener.class})注释您的测试类或所有测试类的父级