【问题标题】:How to get the current class driver in ItestListener如何在 ItestListener 中获取当前的类驱动程序
【发布时间】:2018-05-15 10:27:53
【问题描述】:

我正在为我的 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));
}

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

【问题讨论】:

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

标签: java selenium-webdriver testng extentreports


【解决方案1】:

很简单,你可以在你的测试类中设置属性,然后在你的监听类中调用这个属性

例如

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
}

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

【讨论】:

    【解决方案2】:

    我有一个解决方案,对于非静态驱动程序,当您有多个具有自己的驱动程序并运行自己的功能的类时,可以设置一个具有驱动程序初始化的基类和一个 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
    }
    

    【讨论】:

      【解决方案3】:

      另一种方式可以是(上面也为我工作,顺便说一句-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();
          }
        }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-08
        • 2012-04-22
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 2014-04-14
        • 1970-01-01
        相关资源
        最近更新 更多