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

子类未继承父类变量:Selenium自动化测试Driver为空问题排查

问题分析与解决方案

核心问题原因

  • 测试类继承错误:你的TestHomePage继承的是utility而非BaseTest,导致BaseTest中的@BeforeTest方法完全没有执行,浏览器根本没初始化,Driver自然是null。
  • 实例隔离问题:BaseTest中创建了一个独立的utility实例并调用setDriver,但HomePage继承的是另一个全新的utility实例,两者的udriver变量完全无关,所以HomePage里的udriver始终未被赋值。
  • 页面元素未初始化:HomePage使用了@FindBy注解,但没有通过PageFactory初始化WebElement,即便Driver正常,点击操作也会抛出空指针异常。

修复步骤与代码调整

1. 修正测试类的继承关系

让TestHomePage继承BaseTest,确保@BeforeTest能被TestNG执行,完成浏览器初始化:

package tests;

import org.testng.annotations.Test;
import Pages.HomePage;

public class TestHomePage extends BaseTest {
    HomePage homePage;

    @Test
    public void TitleTest() {
        // 在测试方法内初始化HomePage并传入Driver
        homePage = new HomePage(driver);
        System.out.println(homePage.homePageTitle());
        homePage.clickOnGmailBtn();
    }
}

2. 重构HomePage与utility的关系

不要让HomePage直接继承utility,改为通过构造方法接收Driver,同时用PageFactory初始化元素:

package Pages;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import utilities.utility;

public class HomePage {
    private WebDriver driver;
    private utility util;

    // 构造方法接收Driver并初始化元素、工具类
    public HomePage(WebDriver driver) {
        this.driver = driver;
        this.util = new utility();
        util.setDriver(driver);
        PageFactory.initElements(driver, this);
    }

    @FindBy(xpath = "//a[normalize-space()='Gmail']")
    WebElement gmailBtn;

    public String homePageTitle() {
        return util.getTitle();
    }

    public void clickOnGmailBtn() {
        util.clickEl(gmailBtn);
    }
}

3. 保持BaseTest的原有逻辑

BaseTest的初始化逻辑无需修改,只要测试类继承它,@BeforeTest就会正常执行:

package tests;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;

public class BaseTest {
    protected WebDriver driver;
    
    @BeforeTest
    public void initializeBrowser() {
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.google.com/");
    }
    
    @AfterTest
    public void tearDown() {
        driver.quit();
    }
}

4. utility类保持不变(可选优化)

如果想避免重复创建utility实例,可以把它改成单例模式,但当前修复后已经能正常运行:

package utilities;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class utility {
    public WebDriver udriver;
    
    public void setDriver(WebDriver driver) {
        udriver = driver;
    }
    
    public String getTitle() {
        return udriver.getTitle();
    }
    
    public void clickEl(WebElement element) {
        element.click();
    }
}

额外优化建议

  • 把utility改名为Utility(遵循Java类名首字母大写的规范)
  • 创建BasePage类,统一处理Driver传递和PageFactory初始化,所有页面类继承BasePage,避免重复代码
  • 可将utility中的方法改为静态方法(如果不需要保存状态),无需每次创建实例

内容的提问来源于stack exchange,提问作者Cameron Winter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:56:05