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

Java Selenium POM模式下WebDriver空指针异常解决咨询

排查并修复Selenium POM模式下的Null Pointer Exception问题

问题根源

  1. LandingPage实例化时机错误:步骤定义类中LandingPage landingPage = new LandingPage(driver);在类加载阶段执行,此时BasePage.driver还未被初始化(@Before方法在场景执行前才会初始化driver),导致传入LandingPage的driver为null。
  2. ConfigureDriver未关联全局driver:configureDesktop方法中创建的是局部WebDriver driver,未将实例赋值给BasePage的静态driver变量,导致全局driver始终为null。
  3. 缺少元素等待机制:直接调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:30:49