TestNG中的非静态驱动程序和屏幕截图侦听器

Dam*_*men 5 java testng selenium selenium-webdriver

我有一个测试用例,它将驱动程序作为非静态变量调用.我还在我的测试用例中添加了屏幕截图监听器.当测试用例失败时控件会自动发送到屏幕截图监听器...但是由于我的驱动程序是非STATIC变量,因此无法在屏幕截图监听器中访问它.所以我得到了nullpointer异常.

有没有办法在屏幕截图监听器中全局访问非静态驱动程序?

我的测试用例:

@Test
public void testCase() {
     //non-static driver is initialized
}
Run Code Online (Sandbox Code Playgroud)

我的屏幕截图监听器:

public class ScreenshotListener extends TestListenerAdapter
{
    @Override
    public void onTestFailure(ITestResult testResult) {
        //driver needs to be accessed here
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ham 12

你不必在测试中传递驱动程序或调用testfailure(事实上这会破坏测试听众的意义);

以下将在不通过驱动程序的情况下在侦听器中实现屏幕截图;

  1. 所有测试类都必须扩展一个简单的基础测试类;

    public asbtract baseTestCase() {
    
        private WebDriver driver;
    
        public WebDriver getDriver() {
                return driver;
    }
    
        @BeforeMethod
        public void createDriver() {
                Webdriver driver=XXXXDriver();
        }
    
        @AfterMethod
            public void tearDownDriver() {
            if (driver != null)
            {
                    try
                    {
                        driver.quit();
                    }
                    catch (WebDriverException e) {
                        System.out.println("***** CAUGHT EXCEPTION IN DRIVER TEARDOWN *****");
                        System.out.println(e);
                    }
    
            }
        }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在您的侦听器中,您需要访问基类;

public class ScreenshotListener扩展TestListenerAdapter {

@Override
public void onTestFailure(ITestResult result)
{
        Object currentClass = result.getInstance();
        WebDriver webDriver = ((BaseTest) currentClass).getDriver();

        if (webDriver != null)
        {

           File f = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);

           //etc.
        }
}
Run Code Online (Sandbox Code Playgroud)

您的测试现在还没有意识到屏幕碎片甚至被捕获,并且可以通过添加监听器来控制.


Kar*_*yan -3

如果您在任何地方访问驱动程序意味着什么,那么您必须在执行流程进行时将驱动程序引用作为参数传递到任何地方,

// i assume onTestFailure method has been called explicitly.

@Test
public void testCase() 
{
  Webdriver driver=XXXXDriver();
  try
  {
       // your tests
  }
  catch(Exception e)
  {
      onTestFailure(new ITestResult (),driver)
  }

public class ScreenshotListener extends TestListenerAdapter
{

   @Override
   public void onTestFailure(ITestResult testResult,Webdriver driver) 
   {
      // you can access your driver here
   }
}
Run Code Online (Sandbox Code Playgroud)