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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 17:02:25