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

