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

无ChromeDriver.exe时Maven集成Selenium-Chrome-Driver出现NullPointerException

解决LocalTestRunner中的NullPointerException及WebDriver路径问题

首先咱们先聚焦直接导致报错的NullPointerException,这是当前最紧急的问题:

一、定位NPE的根源

报错发生在LocalTestRunner.getDriver()方法的第27行:

WebDriver currentWebDriver = drivers.get(Thread.currentThread().getId());

这里的drivers Map对象是null,说明@BeforeClass注解的初始化代码没有执行,或者执行时机晚于getDriver()的调用。

可能的原因及解决办法:

  1. 子类覆盖了@BeforeClass但未调用父类方法
    你的子类LocalAdminTestRunner如果自己定义了@BeforeClass方法,必须显式调用父类的初始化逻辑:

    @BeforeClass
    public void beforeClass(ITestContext context) {
        super.beforeClass(context); // 必须先调用父类方法初始化drivers
        // 子类自己的初始化代码
    }
    

    如果子类没有@BeforeClass,那可以在父类的beforeClass里加一句日志验证是否执行:

    @BeforeClass
    public void beforeClass(ITestContext context) {
        System.out.println("Initializing drivers map..."); // 验证方法是否执行
        drivers = new HashMap<>();
        // 其余参数初始化代码
    }
    

    如果日志没打印,检查你的TestNG XML配置,确保LocalAdminTestRunner被正确包含,且没有禁用@BeforeClass的执行。

  2. TestNG执行顺序异常
    确保测试类继承关系正确(LocalAdminTestRunner extends LocalTestRunner),且使用的TestNG是7.x以上的稳定版本,避免旧版本的执行顺序bug。


二、WebDriver路径相关的疑问

你提到的test-classes目录是Maven的默认编译输出目录,位于项目根目录的target文件夹下(不是src目录),${project.build.directory}就是Maven的target目录,所以你的<installationDirectory>配置是正确的,WebDriverManager会把下载的chromedriver放到target/test-classes里。

但还有几个细节需要确认:

  1. WebDriverManager依赖是否正确引入
    确保pom.xml里有完整的WebDriverManager依赖:
    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>5.3.0</version> <!-- 建议使用最新稳定版 -->
        <scope>test</scope>
    </dependency>
    
  2. Chrome浏览器与驱动版本匹配
    你指定的chromedriver版本是80.0.3987.106,必须确保本地安装的Chrome浏览器版本和这个驱动版本大版本一致(比如Chrome 80.x)。如果不想手动指定版本,可以去掉<url>配置,让WebDriverManager自动检测本地Chrome版本并下载对应驱动:
    <driver>
        <name>chromedriver</name>
        <platform>${os.detected.name}</platform>
        <bit>32</bit>
        <!-- 移除手动指定的url,让WebDriverManager自动匹配 -->
    </driver>
    
  3. WebDriverManager的setup是否生效
    你在@BeforeSuite里调用的WebDriverManager.chromedriver().setup();是正确的,这一步会确保驱动路径被正确配置。

三、额外的优化建议

  1. 给drivers变量添加空安全检查
    为了避免类似NPE,可以在getDriver()方法开头加个判断:
    public WebDriver getDriver() {
        if (drivers == null) {
            throw new IllegalStateException("Drivers map not initialized! Did @BeforeClass execute?");
        }
        WebDriver currentWebDriver = drivers.get(Thread.currentThread().getId());
        // 其余代码
    }
    
  2. @AfterClass中的空安全处理
    在afterClass里遍历drivers之前,先判断drivers是否为null:
    @AfterClass(alwaysRun = true)
    public void afterClass() {
        if (drivers == null) {
            return;
        }
        for (Map.Entry<Long, WebDriver> currentWebDriver : drivers.entrySet()) {
            if (currentWebDriver.getValue() != null) {
                currentWebDriver.getValue().quit();
            }
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:37:52