如何在 ItestListener 中获取当前的类驱动程序

kri*_*wal 4 java testng selenium-webdriver extentreports

我正在为我的 testng-selenium-java 项目使用 ExtentReports 和 ItestListener,我的侦听器为 ExtentReports 的失败测试用例截取屏幕截图,但问题是我的 testng.XML 中有多个类,并且我一次性运行它们在其他人做不同的事情并拥有自己的司机之后。

在失败的情况下,Ilistener 的代码是 -

public void onTestFailure(ITestResult iTestResult) 
{
    System.out.println("I am in onTestFailure method " +  
    getTestMethodName(iTestResult) + " failed");

    //Get driver from BaseTest and assign to local webdriver variable.
    Object testClass = iTestResult.getInstance();
    WebDriver webDriver = ((BaseTest) testClass).getDriver();


    //Take base64Screenshot screenshot.
    String base64Screenshot = "data:image/png;base64,"+((TakesScreenshot)webDriver).
            getScreenshotAs(OutputType.BASE64);

    //Extentreports log and screenshot operations for failed tests.
    ExtentTestManager.getTest().log(LogStatus.FAIL,"Test Failed",
            ExtentTestManager.getTest().addBase64ScreenShot(base64Screenshot));
}
Run Code Online (Sandbox Code Playgroud)

如何确保每当测试用例失败时都会采用失败的测试用例类的驱动程序,因为在上面的代码中始终只给出一个类的驱动程序,而不是当前类的驱动程序。

Suh*_*med 8

这很简单,您可以在测试类中设置属性,然后在侦听器类中调用此属性

例如

测试类.java

@BeforeClass
public void setDriver(ITestContext context){
  Webdriver driver = new FirefoxDriver();
  context.setAttribute("WebDriver", driver);
}
@Test
public void t1(){
   // your code
}
Run Code Online (Sandbox Code Playgroud)

监听器.java

WebDriver driver = null;
@Override
public void onTestFailure(ITestResult result) {
    ITestContext context = result.getTestContext();
    driver = (WebDriver) context.getAttribute("WebDriver");
    // your code
}
Run Code Online (Sandbox Code Playgroud)

这里您需要注意的是,在您的测试类中,您需要设置驱动程序属性,然后在该侦听器中调用该属性一次。您的测试类和侦听器类中的驱动程序将是相同的