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

