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

使用Cucumber+JUnit编写Selenium代码时报错driver为null如何解决?

报错根因分析
  • 核心原因:你当前基于Cucumber编写自动化测试步骤,但初始化driver的@Before、释放资源的@After注解用的是JUnit框架的钩子,Cucumber默认不会执行JUnit的钩子方法,因此startBrowser()从未触发,driver没有完成初始化就被iNavigateToTheHotelBookingFormPage方法调用,直接抛出空指针异常。
  • 次要潜在问题:若后续扩展多个步骤类,全局driver没有做共享处理,也可能出现重复初始化或者空指针问题。
解决方案

1. 替换钩子注解为Cucumber官方版本

将代码中JUnit的@Before、@After替换为Cucumber自带的对应注解,修改后完整代码如下:

package steps;

import io.cucumber.java.en.Given;
// 导入Cucumber的钩子注解,不要使用JUnit的org.junit.Before/After
import io.cucumber.java.Before;
import io.cucumber.java.After;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class hotelBookingFormPage {

    public WebDriver driver;

    @Before
    public void startBrowser() {
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver();
        // 可选配置:窗口最大化
        driver.manage().window().maximize();
    }

    @After
    public void closeBrowser() {
        // 增加非空判断,避免初始化失败时关闭逻辑也抛出空指针
        if (driver != null) {
            driver.quit();
        }
    }

    @Given("I navigate to the hotel booking form page")
    public void iNavigateToTheHotelBookingFormPage() {
        driver.get("http://hotel-test.equalexperts.io/");
    }
}

2. 多步骤类共享Driver扩展(可选)

如果后续你需要拆分多个步骤定义类,避免每个类重复初始化Driver,可以引入Cucumber的依赖注入组件,将Driver封装为公共对象全局共享,避免多实例冲突。

内容的提问来源于stack exchange,提问作者Shafiq Ahmed Khan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:15:09