You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium onTestFailure失败截图报NullPointerException,driver为空如何解决

问题原因

你遇到的空指针异常核心是变量遮蔽问题,具体逻辑如下:

  • 父类Base中定义了public static WebDriver driver静态变量,你的测试监听器CustomListener中截图时调用的是这个静态driver
  • 子类AjoutPanier继承Base后,又重复声明了一个同名的WebDriver driver实例变量,这个子类变量会覆盖父类静态driver的可见性
  • 你在@BeforeTest注解的初始化方法中,只给子类自己的driver实例做了赋值,但父类的静态driver全程没有被赋值,始终为null,所以监听器执行截图逻辑时就会触发空指针。
解决方案

你可以任选以下任意一种方案修复:

  • 方案1(最简便):删除AjoutPanier类中重复声明的WebDriver driver;代码行
    删掉这行后,@BeforeTest方法中赋值的driver会直接指向父类Base的静态driver,监听器调用时就能拿到已初始化的浏览器实例。
  • 方案2:手动给父类静态driver赋值
    如果你需要保留子类的driver变量,就在@BeforeTest的driver初始化逻辑后增加一行赋值代码:
    Base.driver = driver;
    
额外优化建议
  • 截图前增加driver非空判断,同时提前创建截图目录,避免额外异常:
@Override
public void onTestFailure(ITestResult result) {
    System.out.println("TestFailure acces");
    if(driver != null){
        File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        File ScreenshotName = new File(".//ScreenShots//test.png");
        System.out.println("Files done");
        try {
            // 先判断截图目录是否存在,不存在则创建
            File screenshotDir = new File(".//ScreenShots");
            if(!screenshotDir.exists()){
                screenshotDir.mkdirs();
            }
            FileUtils.copyFile(file, ScreenshotName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Reporter.log("</br><img src='"+ ScreenshotName +"'/>");
        System.out.println("*******Screenshot captured********");
    }else{
        System.out.println("driver实例为空,无法捕获截图");
    }
}
  • 建议用测试用例名+时间戳作为截图文件名,避免多次执行覆盖同一文件。

内容的提问来源于stack exchange,提问作者Yan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 01:06:06