子类未继承父类变量: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
相关产品推荐
相关产品推荐

