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

Selenium POM架构改造报错:this.driver为空(空指针异常)

解决Selenium POM模式拆分BaseClass与测试类后Driver空指针问题

问题根源

你遇到的NullPointerException是因为JUnit的@BeforeClass注解规则被忽略了:

  • @BeforeClass要求被修饰的方法必须是静态方法,你当前的setup()是普通实例方法,JUnit不会执行这个初始化逻辑,导致driver始终为null。
  • 同时,@BeforeClass是类级别的初始化钩子,只会在类加载时执行一次,若要配合它使用,driver必须定义为静态变量——静态方法无法访问实例变量。

修复方案

方案1:保留实例Driver,每个测试方法独立初始化(适配@Before/@After)

如果希望每个测试方法都启动新浏览器(隔离测试环境),把BaseClass的注解改回@Before和@After,确保每个测试执行前都初始化Driver:

public class BaseClass {
    WebDriver driver;

    @Before
    public void setup() {
        driver = new ChromeDriver();
    }

    @After
    public void teardown() {
        // 加空判断避免销毁时的额外异常
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}

测试类无需修改:

public class TC1LoginRegisterUser extends BaseClass {
    @Test
    public void test1() {
        HomePage homePage = new HomePage(driver);
        homePage.navigateToUrl(); 
     }
}

方案2:静态Driver,全局只初始化一次(适配@BeforeClass/@AfterClass)

如果希望浏览器仅启动关闭一次(提升测试速度),需要把driver改为静态变量,同时将setup和teardown改为静态方法:

public class BaseClass {
    static WebDriver driver;

    @BeforeClass
    public static void setup() {
        driver = new ChromeDriver();
    }

    @AfterClass
    public static void teardown() {
        if (driver != null) {
            driver.close();
            driver.quit();
        }
    }
}

测试类保持不变,此时静态Driver会在测试类加载时初始化,子类可以直接访问。


额外提示

  • 无论哪种方案,都建议在销毁Driver前加空指针判断,避免因初始化失败导致的二次异常。
  • 如果你使用的是TestNG而非JUnit,@BeforeClass不需要是静态方法,但JUnit的规则严格要求静态,注意区分测试框架。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:46:21