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

TestNG中Selenium WebDriver空指针问题:DriverUtils.getDriver()返回null

TestNG自动化测试空指针异常排查与解决

在使用TestNG进行自动化测试时遭遇空指针异常,相关代码及报错信息如下:

DriverUtils文件

package Utils;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class DriverUtils {
    static WebDriver driver;
    
    public static void createDriver() {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Rohit Nagar\\eclipse-workspace\\Hexaware_OrangeHRM\\src\\test\\resources\\Driver\\chromedriver.exe");
        
        WebDriver driver=new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://demowebshop.tricentis.com/login");
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
    }
    
    public static WebDriver getDriver() {
        if(driver==null) {
            createDriver();
        }
        
        return driver;
    }
    
}

BasePage代码

package POM;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.PageFactory;

import Utils.DriverUtils;

public class BasePage {
    WebDriver driver;
    BasePage(){
        driver = DriverUtils.getDriver();
        PageFactory.initElements(driver, this);
    }
}

LoginPage代码

package POM;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

public class LoginPages extends BasePage {
    //Declaration
    @FindBy(xpath = "//input[@id = 'Email']")
    private WebElement txtUser;
    
    @FindBy(xpath = "//input[@id = 'Password']")
    private WebElement txtPassword;
    
    @FindBy(xpath = "//input[@class= 'button-1 login-button']")
    private WebElement buttonLogin;
    
    public void enterUsername(String str) {
        txtUser.sendKeys(str);
    }
    
    public void enterPassword(String str) {
        txtPassword.sendKeys(str);
    }
    
    public void loginClick() {
        buttonLogin.click();
    }
}

测试类LoginTestOne代码

package Test;

import org.testng.annotations.Test;

import POM.LoginPages;
import Utils.DriverUtils;

public class LoginTestOne {
    @Test
    public void verifyLogin() throws InterruptedException {
        DriverUtils.getDriver().get("https://demowebshop.tricentis.com/login");
        
        Thread.sleep(10000);
        LoginPages lp = new LoginPages();
        
        Thread.sleep(10000);
        
        lp.enterUsername("");
        
        lp.enterPassword("");
        lp.loginClick();
        
    }
}

Eclipse报错信息

FAILED: Test.LoginTestOne.verifyLogin
java.lang.NullPointerException: Cannot invoke "org.openqa.selenium.WebDriver.get(String)" because the return value of "Utils.DriverUtils.getDriver()" is null
    at Test.LoginTestOne.verifyLogin(LoginTestOne.java:11)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:568)
    at org.testng.internal.invokers.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:139)
    at org.testng.internal.invokers.TestInvoker.invokeMethod(TestInvoker.java:664)
    at org.testng.internal.invokers.TestInvoker.invokeTestMethod(TestInvoker.java:227)
    at org.testng.internal.invokers.MethodRunner.runInSequence(MethodRunner.java:50)
    at org.testng.internal.invokers.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:957)
    at org.testng.internal.invokers.TestInvoker.invokeTestMethods(TestInvoker.java:200)
    at org.testng.internal.invokers.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:148)
    at org.testng.internal.invokers.TestMethodWorker.run(TestMethodWorker.java:128)
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
    at org.testng.TestRunner.privateRun(TestRunner.java:848)
    at org.testng.TestRunner.run(TestRunner.java:621)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:443)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:437)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:397)
    at org.testng.SuiteRunner.run(SuiteRunner.java:336)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:95)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1280)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1200)
    at org.testng.TestNG.runSuites(TestNG.java:1114)
    at org.testng.TestNG.run(TestNG.java:1082)
    at org.testng.remote.AbstractRemoteTestNG.run(AbstractRemoteTestNG.java:115)
    at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:251)
    at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:77)

异常原因分析

  • DriverUtils类的createDriver方法中,重新声明了局部变量WebDriver driver,这会覆盖类的静态成员变量driver。方法执行完毕后,静态成员变量依然为null,导致getDriver返回null,调用get方法时触发空指针异常。

解决方案

修改DriverUtils类的createDriver方法,去掉局部变量的声明,直接给静态成员变量赋值:

package Utils;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class DriverUtils {
    static WebDriver driver;
    
    public static void createDriver() {
        System.setProperty("webdriver.chrome.driver", "C:\\Users\\Rohit Nagar\\eclipse-workspace\\Hexaware_OrangeHRM\\src\\test\\resources\\Driver\\chromedriver.exe");
        
        // 去掉局部变量声明,直接给静态成员变量赋值
        driver=new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://demowebshop.tricentis.com/login");
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
        
    }
    
    public static WebDriver getDriver() {
        if(driver==null) {
            createDriver();
        }
        
        return driver;
    }
    
}

另外,测试类中createDriver方法已经打开了目标页面,可去掉重复的get调用,简化代码:

package Test;

import org.testng.annotations.Test;

import POM.LoginPages;
import Utils.DriverUtils;

public class LoginTestOne {
    @Test
    public void verifyLogin() throws InterruptedException {
        // createDriver里已打开页面,无需重复调用
        DriverUtils.getDriver();
        
        Thread.sleep(10000);
        LoginPages lp = new LoginPages();
        
        Thread.sleep(10000);
        
        lp.enterUsername("your-test-email");
        lp.enterPassword("your-test-password");
        lp.loginClick();
        
    }
}

内容的提问来源于stack exchange,提问作者Rohit Nagar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:55:02