You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于POM的Selenium登录测试抛出NullPointerException,求协助解决

解决Selenium POM中的java.lang.NullPointerException问题

咱们先定位问题的根源:你的NullPointerException是因为BaseClass里的WebDriver实例WD没有被正确赋值,导致后续传给LandingClass的driver是null,PageFactory无法初始化页面元素,最终调用LoginButton.click()时触发空指针。

问题具体分析

  1. BaseClassSetup()方法中,你调用BrowserFactory.BrowserStart()返回了初始化好的WebDriver,但没有把这个返回值赋值给类成员WD。所以BaseClass里的WD始终是null。
  2. 子类LoginScenarios继承了BaseClass,它的WD自然也是null。在@BeforeTest方法里,你把这个null的WD传给了LandingClass的构造函数,导致PageFactory.initElements(driver, this)用null的driver执行,页面元素LoginButton没有被初始化,还是null。
  3. 最后在@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

火山引擎 最新活动