使用Selenium PageFactory时出现NullPointerException的问题咨询
根因定位
- 空指针的核心触发点为
PageFactory.initElements调用时传入的Browser.driver为null。 - 测试类中
LoginPage loginPage = PageFactory.initElements(Browser.driver, LoginPage.class)属于类成员变量直接赋值,执行时机远早于父类Base中@BeforeMethod标注的setup方法。此时Browser类的静态driver尚未完成初始化,始终处于null状态,传入initElements后生成的页面对象没有绑定有效WebDriver实例,后续调用sendKeys、click等元素方法时自然抛出空指针,和异常栈的调用链完全匹配。
修正方案
调整PageFactory初始化时机
将页面对象的初始化逻辑移到driver完成初始化之后的位置,不能直接放在类成员变量的赋值语句中。
修正后代码示例
保持原有Browser类、Base类、LoginPage类的逻辑不变,仅调整测试类的实现:
public class LoginPageTest extends Base { LoginPage loginPage; // 该方法的执行时机在父类@BeforeMethod完成之后 @BeforeMethod public void initPageObject() { loginPage = PageFactory.initElements(Browser.driver, LoginPage.class); } @Test public void verifyLoginTest() { loginPage.logIn("user", "pass"); } }
说明:TestNG默认先执行父类的@BeforeMethod方法,再执行子类的@BeforeMethod方法,因此上述代码执行到initPageObject时,Browser.driver已经完成启动、打开目标页面的全流程初始化,传入initElements的实例完全有效
补充优化
- 给Browser类的quit方法增加空值判断,避免驱动异常退出时再次触发空指针:
public static void quit() { if (driver != null) { driver.quit(); driver = null; } }
- 当前静态driver的设计在并行测试场景下会存在线程安全问题,若后续需要并行执行用例,可将driver改造为ThreadLocal类型的实例隔离。
内容的提问来源于stack exchange,提问作者Saito Hadjime
相关产品推荐
相关产品推荐

