如何在侦听器中获取驱动程序实例 class

How get driver instance in listener class

我有一个测试 class,它通过从 TestNG 文件中获取驱动程序参数来运行。这是框架的流程。

<parameter name="browser" value="chrome"/> 已在 TestNG 文件中提供。

这被 logintest class 使用。

public class LoginLogoutTest extends Base{
  @Test
  @Parameters("browser")
  public void initializeBrowser(String browser) throws IOException{
      super.initializeBrowser(browser);
      driver.get("https://www.google.com")
      Assert.assertEquals(xpath_to_get_header, "Invalid_header_name");
  }

initializeBrowser 在 Base class.

中声明
public class Base {
public WebDriver driver;

public void initializeBrowser(String browser) throws IOException {
    if (browser.equalsIgnoreCase("chrome")) {
        System.setProperty("webdriver.chrome.driver", currentDir + "\src\main\java\resources\chromedriver.exe");
        driver = new ChromeDriver();
    } 
     else { //do something }

现在,我如何实现侦听器 class 以便在失败时截取屏幕截图?这就是我尝试的方式,但我不知道如何从我的 logintest class.

中获取驱动程序实例
public void onTestFailure(ITestResult result) {
    File Src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    try {
        FileUtils.copyFile(Src, new File("C://test//" + result + "screen.jpg"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

您可以在测试 class 中应用侦听器 class 方法,方法是在您的测试 class.

中添加 <listener> 参数

所以,假设你写 onTestFailure(ITestResult result) 的 class 名称是 ListenerClass 而这个 class 正在实现 ITestListener,所以在在这种情况下,您只需要在 testng 文件中提及侦听器 class 名称,它就会将您的侦听器 class 中提到的所有方法应用到您的测试 class 中。

实现类似于:

监听器Class:

public class ListenerClass implements ITestListener{

@Override
public void onTestFailure(ITestResult result) {
File Src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
    FileUtils.copyFile(Src, new File("C://test//" + result + "screen.jpg"));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
  }
}

测试文件:

<suite name="TestSuite" parallel="tests" preserve-order="true">

<listeners>
    <listener class-name="packageName.ListenerClass"></listener> (Add your listener class path here)
</listeners>

    <test name="Testing" preserve-order="true">
    <classes>
        <class name="packageName.LoginLogoutTest"/> (Add your test class path here)
    </classes>
</test>

快答

您需要在TestNG.xml中添加监听器标签。请看下面的截图以供参考

在 Listners class 中,我们得到具有 ItestResult 的任何对象的实例,如下所示

内部监听器class我们在 onTestfailure

上采取行动
public coid onTestfailure(ItestResult result){
    
 Webdriver driver; 

driver=(WebDriver)result.getTestClass().getRealClass().getDeclaredField("driver").get(result.getInatnce())

//method from your utility class

getScrrensot(result.getMethod().getMethodName(),driver)
}