基于POM的Selenium登录测试抛出NullPointerException,求协助解决
解决Selenium POM中的java.lang.NullPointerException问题
咱们先定位问题的根源:你的NullPointerException是因为BaseClass里的WebDriver实例WD没有被正确赋值,导致后续传给LandingClass的driver是null,PageFactory无法初始化页面元素,最终调用LoginButton.click()时触发空指针。
问题具体分析
- 在
BaseClass的Setup()方法中,你调用BrowserFactory.BrowserStart()返回了初始化好的WebDriver,但没有把这个返回值赋值给类成员WD。所以BaseClass里的WD始终是null。 - 子类
LoginScenarios继承了BaseClass,它的WD自然也是null。在@BeforeTest方法里,你把这个null的WD传给了LandingClass的构造函数,导致PageFactory.initElements(driver, this)用null的driver执行,页面元素LoginButton没有被初始化,还是null。 - 最后在
@Test方法里调用LC.Openlgin()时,执行LoginButton.click()就抛出了空指针异常。
修复步骤及代码修改
1. 修复BaseClass的Setup方法
需要把BrowserFactory返回的WebDriver赋值给类成员WD,而不是只返回它:
package Com.selenium.pages; import org.openqa.selenium.WebDriver; import Com.selenium.utils.BrowserFactory; public class BaseClass implements IClass { public WebDriver WD; public WebDriver Setup() { // 把返回的driver赋值给类成员WD WD = BrowserFactory.BrowserStart(WD, "chrome", "https://www.udemy.com/"); return WD; } }
2. (可选)优化TestNG的BeforeTest方法
虽然上面的修改已经能解决问题,但可以让代码更清晰,明确接收Setup的返回值:
package Com.selenium.tests; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import Com.selenium.pages.BaseClass; import Com.selenium.pages.LandingClass; public class LoginScenarios extends BaseClass { LandingClass LC; @BeforeTest public void setup() { // 显式接收返回值,代码逻辑更直观 WD = super.Setup(); LC = new LandingClass(WD); } @Test(priority = 0) public void OpenLogin() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } LC.Openlgin(); } }
3. 额外建议:替换硬等待为显式等待
你现在用Thread.sleep(5000)是硬等待,不够灵活还容易浪费时间,建议换成Selenium的显式等待,确保元素可点击后再操作:
// 在LandingClass中添加相关导入并修改Openlgin方法 import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedConditions; import java.time.Duration; public class LandingClass { public WebDriver WD = null; public LandingClass(WebDriver driver) { this.WD = driver; PageFactory.initElements(driver, this); } @FindBy(xpath=".//button[@class='btn btn-quaternary']") public WebElement LoginButton; public void Openlgin() { WebDriverWait wait = new WebDriverWait(WD, Duration.ofSeconds(10)); wait.until(ExpectedConditions.elementToBeClickable(LoginButton)).click(); } }
这样修改后,WebDriver实例就能被正确初始化,页面元素也能被PageFactory正常加载,就不会再出现NullPointerException了。
内容的提问来源于stack exchange,提问作者Santu Ghosh




