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
相关产品推荐
相关产品推荐

