Extent Report 3 添加截图
Extent Report 3 Add Screenshot
我正在尝试使用范围报告构建 selenium,但我无法使用保存屏幕截图功能,因为我无法在 ITestListener class 中引用 WebDriver 对象。下面是我的示例代码:
测试Runner.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
public class 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
class?
如何在范围报表3中保存截图?
我的代码有什么问题吗?
请帮助,在此先感谢!
首先不要在 @BeforeClass
中实例化你的 webDriver,因为它只被调用一次,正如 class 之前的注释所说,尝试使用 interface ITestListener
并使用 beforeInvocation
WebDriver 初始化的实现。
其次,您不能一次为所有 PageObjects 调用 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(), "");
这是我调用屏幕截图的示例代码部分,我是从 afterInvocation
调用它的,因为我正在使用并发驱动程序初始化,所以它必须来自这里,但是也可以通过 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());
}
你要多考虑结构,
希望这对您有所帮助...
执行此操作的步骤如下:
1 : 将 WebDriver 对象传递给侦听器 class
首先在 ChromeTestManager class 或您可以调用它的任何其他位置创建以下方法,这里假设它存在于 ChromeTestManager class:
public static ITestContext setContext(ITestContext iTestContext, WebDriver driver) {
iTestContext.setAttribute("driver", driver);
return iTestContext;
}
它将驱动程序对象设置为 TestContext。
现在更改您的@BeforeClass setUp 方法以接受参数 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:\Users345\Desktop\sfgfdh.PNG"
} catch (IOException ex) {
LogManager.logger.log(Level.INFO, "Exception: " + ex.getMessage());
}
}
3。你的代码有什么问题吗?
否
您只需要监听器中的驱动程序 class 并在范围报告中添加屏幕截图,
确保屏幕截图的路径正确并且是带扩展名的完全限定路径。
如果您在这方面遇到问题,请告诉我。
我正在尝试使用范围报告构建 selenium,但我无法使用保存屏幕截图功能,因为我无法在 ITestListener class 中引用 WebDriver 对象。下面是我的示例代码:
测试Runner.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 public class 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 class?
如何在范围报表3中保存截图?
我的代码有什么问题吗?
请帮助,在此先感谢!
首先不要在 @BeforeClass
中实例化你的 webDriver,因为它只被调用一次,正如 class 之前的注释所说,尝试使用 interface ITestListener
并使用 beforeInvocation
WebDriver 初始化的实现。
其次,您不能一次为所有 PageObjects 调用 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(), "");
这是我调用屏幕截图的示例代码部分,我是从 afterInvocation
调用它的,因为我正在使用并发驱动程序初始化,所以它必须来自这里,但是也可以通过 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());
}
你要多考虑结构,
希望这对您有所帮助...
执行此操作的步骤如下:
1 : 将 WebDriver 对象传递给侦听器 class
首先在 ChromeTestManager class 或您可以调用它的任何其他位置创建以下方法,这里假设它存在于 ChromeTestManager class:
public static ITestContext setContext(ITestContext iTestContext, WebDriver driver) {
iTestContext.setAttribute("driver", driver);
return iTestContext;
}
它将驱动程序对象设置为 TestContext。
现在更改您的@BeforeClass setUp 方法以接受参数 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:\Users345\Desktop\sfgfdh.PNG"
} catch (IOException ex) {
LogManager.logger.log(Level.INFO, "Exception: " + ex.getMessage());
}
}
3。你的代码有什么问题吗?
否
您只需要监听器中的驱动程序 class 并在范围报告中添加屏幕截图, 确保屏幕截图的路径正确并且是带扩展名的完全限定路径。
如果您在这方面遇到问题,请告诉我。