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

4

我正在使用ExtentReports和ItestListener为我的testng-selenium-java项目工作,

我的监听器会为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));
}

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

乍一看,这里没有明显的问题。也许您可以包括一些BaseTest类的片段,其中包含“driver”字段的定义和初始化,因为这将有助于识别任何问题。 - Edvins
4个回答

8

很简单,您可以在测试类中设置属性,然后在监听器类中调用该属性。

例如:

testClass.java

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

Listener.java

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

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


1
我有一个解决方案,对于一个非静态驱动程序,当你有多个类拥有自己的驱动程序并运行自己的功能时,可以设置一个基类来进行驱动程序初始化,并使用getdriver函数从基类获取驱动程序,并从其他类扩展该类。
class BaseClass
{
WebDriver driver;

public WebDriver getDriver()
{
system.setproperty()
driver=new ChromeDriver();

return driver;
}

Class Test1 extends BaseClass
{
BaseClass bc=new BaseClass()
@BeforTest
public void setup()
{
driver=bc.getDriver()
//rest processing
}

0

我遇到了同样的问题。我记得在我的培训课程中学到了解决方案。 (WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance()); 你可以访问触发侦听器的类中存在的字段。


0

另一种方法可以是(上面也对我有用,顺便说一下 - Suhail的回答)...

public class WhereWebDriverIsDefined {
  public WebDriver webDriver;
  //initialize driver in @BeforeTest or @BeforeClass method
  @BeforeTest
  public void init() {
    System.setProperty("webdriver.chrome.driver","D:\\WebDriverLocation\\chromedriver.exe");
    driver= new ChromeDriver();
}  

在Listener类中尝试访问webDriver(也可以在其他监听器方法中调用)

public void onTestFailure(ITestResult result) {
    WebDriver driver= null;
    try {
        driver= (WebDriver) result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInstance());
    } catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
        e.printStackTrace();
    }
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接