BaseTest类未初始化WebDriver实例致空指针异常求助
解决Cucumber+Selenium中WebDriver为Null的问题
核心问题原因
你的BaseTests类里的@Before和@After钩子没有被Cucumber识别执行——TestRunner的glue配置只包含了com/stepDefinitions包,未覆盖com.supportiveTests包,导致setUpDriver()方法从未运行,driver变量始终为null,最终触发NullPointerException。
分步解决方案
1. 修正TestRunner的glue配置
将com.supportiveTests加入glue路径,让Cucumber能扫描到钩子类:
package com.supportiveTests; import io.cucumber.junit.Cucumber; import io.cucumber.junit.CucumberOptions; import org.junit.runner.RunWith; @RunWith(Cucumber.class) @CucumberOptions(features = "src/test/Features", glue = {"com.stepDefinitions", "com.supportiveTests"}, // 新增钩子类所在包 monochrome = true, plugin = { "pretty", "html:target/HTMLReports/report.html", "json:target/JSONReports/report.json", "junit:target/JUnitReports/report.xml" } ) public class TestRunner { }
2. 调整LoginPageSteps类
- 移除无用的
@Test注解(Cucumber通过feature文件绑定步骤,不需要TestNG的@Test) - 移除手动调用的
driver.quit()(交给@After钩子统一处理,避免重复quit引发异常) - 补充断言验证页面跳转结果:
package com.stepDefinitions; import com.pageObjects.LoginPage; import com.supportiveTests.BaseTests; import io.cucumber.java.en.Given; import io.cucumber.java.en.Then; import io.cucumber.java.en.When; import org.testng.Assert; public class LoginPageSteps extends BaseTests { LoginPage obj_login; @Given("User is on Google Home page") public void user_is_on_google_home_page() { BaseTests.driver.navigate().to("https://www.google.com/"); } @Given("User is navigated to SwagLabs Login page") public void user_is_navigated_to_swag_labs_login_page() { BaseTests.driver.navigate().to("https://www.saucedemo.com/"); } @When("^User enters valid (.*) and (.*)$") public void user_enters_valid_standard_user_and_secret_sauce(String username, String password) { obj_login = new LoginPage(driver); obj_login.enterUserName(username); obj_login.enterPassword(password); } @When("clicks on LOGIN button") public void clicks_on_login_button() { obj_login.clickOnLogin(); } @Then("User is navigated to SwagLAbs Home page") public void user_is_navigated_to_swag_l_abs_home_page() throws InterruptedException { // 用断言验证跳转是否成功 Assert.assertTrue(BaseTests.driver.getCurrentUrl().contains("https://www.saucedemo.com/inventory.html")); Thread.sleep(2000); // 移除手动quit,交给@After钩子处理 } }
3. 优化BaseTests的@After方法
增加空指针判断,避免driver未初始化时执行quit报错:
package com.supportiveTests; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import io.cucumber.java.After; import io.cucumber.java.Before; public class BaseTests { public static WebDriver driver; @Before public void setUpDriver() { System.setProperty("webdriver.chrome.driver", "src/main/resources/Drivers/chromedriver.exe"); driver = new ChromeDriver(); } @After public void quitDriver() { if(driver != null){ driver.quit(); System.out.println("done AfterTest"); } } }
额外提示
- 确保chromedriver版本与本地Chrome浏览器版本匹配,否则会出现驱动初始化失败问题
- 实际测试中建议用**显式等待(WebDriverWait)**替代
Thread.sleep(),提升用例稳定性
内容的提问来源于stack exchange,提问作者DUSHAN ANURADHA
相关产品推荐
相关产品推荐

