首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >范围报告3添加屏幕快照

范围报告3添加屏幕快照
EN

Stack Overflow用户
提问于 2018-06-19 07:59:01
回答 2查看 12.1K关注 0票数 1

我正在尝试用区段报告构建selenium,但是由于无法在WebDriver类中引用ITestListener对象,所以无法使用保存屏幕截图函数。

测试Runner.java:

代码语言:javascript
复制
@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 {

代码语言:javascript
复制
    //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中保存屏幕截图?
  • 我的密码有什么问题吗?

请帮忙,谢谢提前!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-20 10:17:39

以下是这样做的步骤:

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

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

代码语言:javascript
复制
public static ITestContext setContext(ITestContext iTestContext, WebDriver driver) {
        iTestContext.setAttribute("driver", driver);

        return iTestContext;
    }

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

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

代码语言:javascript
复制
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 ;

现在访问监听器中的驱动程序:

代码语言:javascript
复制
@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中保存ScreenShot (在maven中使用依赖项3.1.5 )

代码语言:javascript
复制
@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.您的代码有什么问题吗?

No

您只需要监听器类中的驱动程序,在区段报告中添加屏幕快照时,请确保屏幕快照的路径是正确的,并且是具有扩展的完全限定的路径。

如果你在这件事上遇到问题,请告诉我。

票数 4
EN

Stack Overflow用户

发布于 2018-06-19 09:20:46

首先,不要在WebDriver中实例化您的@BeforeClass,因为它只被调用一次,比如在上课之前使用注释,尝试使用interface ITestListener并使用beforeInvocation实现初始化webDriver。

第二,不能同时调用所有PageFactory,如何同时初始化所有3个页面,这应该在每个页面对象的构造函数中实现,当您插入页面对象(新登录)时,元素也被初始化,所以这是不对的:

代码语言:javascript
复制
    // Pages Object Initialization
    loginPages = PageFactory.initElements(driver, LoginPages.class);
    logoutPages = PageFactory.initElements(driver, LogoutPages.class);
    adminPages = PageFactory.initElements(driver, AdminPages.class);

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

代码语言:javascript
复制
ExtentTest extentTest = ExtentTestManager.startTest(method.getName(), "");

下面是我实现调用屏幕截图的代码的一个例子,我从afterInvocation调用它,因为我使用并发驱动程序初始化,所以它必须来自这里,但也可以通过onTestFailure实现来实现:

代码语言:javascript
复制
       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());

        }

你得多考虑一下结构,

希望这能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50923373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档