Java Selenium POM模式下WebDriver空指针异常解决咨询
排查并修复Selenium POM模式下的Null Pointer Exception问题
问题根源
- LandingPage实例化时机错误:步骤定义类中
LandingPage landingPage = new LandingPage(driver);在类加载阶段执行,此时BasePage.driver还未被初始化(@Before方法在场景执行前才会初始化driver),导致传入LandingPage的driver为null。 - ConfigureDriver未关联全局driver:
configureDesktop方法中创建的是局部WebDriver driver,未将实例赋值给BasePage的静态driver变量,导致全局driver始终为null。 - 缺少元素等待机制:直接调用
findElement可能在元素未加载完成时执行,引发空指针或元素未找到异常。
修复步骤及代码示例
1. 修改ConfigureDriver类,关联全局driver
将创建的driver实例赋值给BasePage的静态变量,确保全局driver一致:
package utils; import io.github.bonigarcia.wdm.WebDriverManager; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import java.util.concurrent.TimeUnit; import utils.BasePage; public class ConfigureDriver { public void configureDesktop() { ChromeOptions chromeOptions = new ChromeOptions(); WebDriverManager.chromedriver().setup(); WebDriver driver = new ChromeDriver(chromeOptions); // 将局部driver赋值给BasePage的静态driver BasePage.driver = driver; driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.manage().window().maximize(); driver.get("https://www.page.com/"); } }
2. 调整步骤定义类,延迟LandingPage实例化
在@Before方法初始化driver后,再实例化LandingPage,确保传入非null的driver:
import io.cucumber.java.Before; import io.cucumber.java.Scenario; import io.cucumber.java.en.Given; import pages.LandingPage; import utils.BasePage; import utils.ConfigureDriver; import static utils.BasePage.driver; public class LandingPageStepDefs { LandingPage landingPage; ConfigureDriver configureDriver = new ConfigureDriver(); @Before("not @mobile") public void beforeDesktop(Scenario scenario) { configureDriver.configureDesktop(); // 驱动初始化完成后再实例化页面类 landingPage = new LandingPage(driver); } @Given("Customer is on landing page") public void customer_is_on_landing_page () { landingPage.clickConsent(); } }
3. 优化LandingPage类,添加显式等待
确保元素可点击后再执行操作,避免因元素未加载导致的异常:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; import java.time.Duration; import utils.BasePage; public class LandingPage extends BasePage { public LandingPage (WebDriver driver) { super(driver); } public void clickConsent() { // 显式等待元素可点击,超时时间10秒 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[@id=\"cookie-terms\"]/div/div/button/i"))).click(); } }
修复说明
- 延迟页面类实例化时机,保证传入的driver是已初始化的有效实例。
- 全局driver统一管理,避免局部变量导致的实例隔离问题。
- 显式等待替代直接查找元素,提升代码稳定性,减少因页面加载延迟引发的异常。
内容的提问来源于stack exchange,提问作者javabeginer
相关产品推荐
相关产品推荐

