在onTestFailureMethod中,由于驱动程序实例导致的空指针异常为null

时间:2014-12-30 07:55:31

标签: selenium-webdriver testng

需要帮助 - 我在onTestFailure方法中得到空指针异常。如果我的任何@Test方法失败,则控制转到onTestFailure,但该方法中的驱动程序为null。我的代码就像 -

import statements...
@Listeners(ScreenShot.class)
public class ScreenShot implements ITestListener{
    WebDriver driver;
    @BeforeClass
    public void launch(){
        System.setProperty("webdriver.ie.driver", "D:\\Jars\\Drivers\\IEDriverServer.exe");
        driver = new InternetExplorerDriver();
        driver.get("url");
    }

    @Test
    public void test1(){
        //driver.findElement(By.id("Email")).sendKeys("E@E.COM");
        System.out.println("Method1 begins");
        //some code here - exception occurs here
        System.out.println("Method ended");
    }

    public void onTestFailure(ITestResult result){
        File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);  //Getting exception here as driver is null
        try {
            FileUtils.copyFile(scrFile, new File("C:\\snaps\\"+result.getMethod().getMethodName()+".png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }

我通过右键单击运行此课程 - >以testng身份运行。

1 个答案:

答案 0 :(得分:0)

您获得NullPointerException的原因是因为Testng为每个侦听器创建了一个新实例。所以新实例的驱动程序没有初始化。

在您的情况下,运行@Test方法的Screenshot类的对象和作为TestNG调用的侦听器的Screenshot类的实例是不同的。

有几种方法可以解决这个问题。

  1. 将代码从onTestFailure移动到@AfterMethod,并将ITestResult作为方法参数。处理结果数据以截取屏幕截图。

    @AfterMethod
    public void afterMet(ITestResult res){
            if(res.isSuccess())
    
  2. 将驱动程序设为全局静态。 - 如果您打算只运行顺序测试

  3. 如果您计划并行运行,请考虑使用threadlocal。