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

使用PageFactory初始化页面对象时遇NullPointerException,求排查

问题根源分析

你遇到的NullPointerException核心原因是WebDriver初始化顺序错误,导致PageFactory.initElements()调用时,driver对象还是null,无法完成页面元素的初始化。

具体执行流程的问题点:

  1. 测试类FlightBookingTest的setup()方法里,先执行FBPage = new FlightBookingPage();
  2. 此时触发FlightBookingPage的构造方法,里面执行PageFactory.initElements(driver, this);
  3. 但testBase里的driver还没被初始化(setDriverPath()是在创建页面对象之后才调用的),所以driver为null,PageFactory无法定位任何元素
  4. 当测试方法调用FBPage.clickOneWayBtn()时,oneWayRdBtn因未被正确初始化而处于null状态,直接触发空指针异常

另外还有个冗余设计问题:页面类FlightBookingPage不需要继承testBase,继承会导致不必要的属性冗余,页面类只需要持有WebDriver实例即可。


解决步骤

1. 调整测试类的初始化顺序

把setDriverPath()的调用放在创建页面对象之前,确保driver实例化完成后,再初始化页面元素:

public class FlightBookingTest extends testBase {
    @BeforeMethod
    public void setup() {
        // 先初始化driver并打开页面
        setDriverPath();
        driver.get(prop.getProperty("url"));
        // 再创建页面对象,此时driver已有效
        FBPage = new FlightBookingPage(driver);
    }
    // 其余代码保持不变
}

2. 修改页面类,移除不必要的继承,通过构造方法传入Driver

页面类改为通过构造方法接收WebDriver实例,遵循单一职责原则:

public class FlightBookingPage {
    // 持有WebDriver实例
    private WebDriver driver;

    // Page Factory - 元素定位
    @FindBy(id = "OneWay")
    public WebElement oneWayRdBtn;
    @FindBy(id = "FromTag")
    public WebElement fromCitytxtbox;
    @FindBy(xpath = "//*[@id='ui-id-1']/li")
    public List<WebElement> originOptionList;
    @FindBy(id = "toTag")
    public WebElement toCitytxtbox;
    @FindBy(xpath = "//*[@id='ui-id-2']/li")
    public List<WebElement> destinOptionList;
    @FindBy(xpath = "//*[@id='ui-datepicker-div']/div[1]/table/tbody/tr[3]/td[7]/a")
    public WebElement date;
    @FindBy(id = "SearchBtn")
    public WebElement searchBtn;
    @FindBy(className = "searchSummary")
    public WebElement searchResultsHeadertxt;

    // 构造方法传入driver,完成元素初始化
    public FlightBookingPage(WebDriver driver){
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    // 其余业务方法保持不变
}

3. 可选优化:调整TestBase中driver的访问修饰符

把testBase里的driver从public改为protected,避免不必要的外部直接访问:

public class testBase {
    protected WebDriver driver; // 修改为protected
    public static Properties prop;
    // 其余代码不变
}

修改后的执行流程验证
  1. setup()方法先调用setDriverPath(),完成driver实例化和浏览器初始化
  2. 打开目标URL后,创建FlightBookingPage对象并传入已初始化的driver
  3. PageFactory.initElements()使用有效的driver完成所有页面元素的定位初始化
  4. 测试方法调用页面对象的方法时,元素已被正确初始化,不会再触发空指针异常

内容的提问来源于stack exchange,提问作者Harish Kannan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:56:14