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
相关产品推荐
相关产品推荐

