使用PageFactory初始化页面对象时遇NullPointerException,求排查
问题根源分析
你遇到的NullPointerException核心原因是WebDriver初始化顺序错误,导致PageFactory.initElements()调用时,driver对象还是null,无法完成页面元素的初始化。
具体执行流程的问题点:
- 测试类
FlightBookingTest的setup()方法里,先执行FBPage = new FlightBookingPage(); - 此时触发
FlightBookingPage的构造方法,里面执行PageFactory.initElements(driver, this); - 但
testBase里的driver还没被初始化(setDriverPath()是在创建页面对象之后才调用的),所以driver为null,PageFactory无法定位任何元素 - 当测试方法调用
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; // 其余代码不变 }
修改后的执行流程验证
setup()方法先调用setDriverPath(),完成driver实例化和浏览器初始化- 打开目标URL后,创建
FlightBookingPage对象并传入已初始化的driver PageFactory.initElements()使用有效的driver完成所有页面元素的定位初始化- 测试方法调用页面对象的方法时,元素已被正确初始化,不会再触发空指针异常
内容的提问来源于stack exchange,提问作者Harish Kannan
相关产品推荐
相关产品推荐

