TestNG代码报错:driver为null,无法调用WebDriver.findElement
问题原因分析
你遇到的空指针错误,核心原因是**InvoiceCreationSanity类中的driver变量从未被初始化,始终为null**,当你调用createinvoicepom.createinvoice(driver)时,传入的是null值,导致driver.findElement()方法无法执行。
具体来说:
TestNG_Demo类中确实初始化了自己的静态driver变量,但这个变量属于TestNG_Demo类本身,和InvoiceCreationSanity中定义的driver是完全独立的两个变量,后者并没有获取到前者初始化后的实例。- 你直接实例化
TestNG_Demo并调用其方法时,只是执行了方法逻辑,但没有将初始化好的driver传递到InvoiceCreationSanity中。
修复方案
方案一:直接引用TestNG_Demo的静态driver
因为TestNG_Demo的driver是public static修饰的,可以直接在InvoiceCreationSanity中使用这个已初始化的实例:
修改InvoiceCreationSanity的代码:
package pages; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import org.openqa.selenium.By; import io.github.bonigarcia.wdm.WebDriverManager; import pages.createinvoicepom; public class InvoiceCreationSanity { @BeforeTest public void SetUp() throws InterruptedException { TestNG_Demo Setupobject = new TestNG_Demo(); Setupobject.SetUp(); Setupobject.signin(); } @Test public void invoicecreation() { // 直接传入TestNG_Demo中已初始化的静态driver createinvoicepom.createinvoice(TestNG_Demo.driver).click(); } public void result() { System.out.println("Test Completed Successfully"); } }
方案二:重构代码,传递driver实例(推荐)
静态driver会导致线程安全问题,更规范的做法是将TestNG_Demo的driver改为实例变量,并提供获取方法:
- 修改
TestNG_Demo类:
package pages; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.WebDriverWait; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.dashloginpagepom; import pages.createinvoicepom; import io.github.bonigarcia.wdm.WebDriverManager; public class TestNG_Demo { private WebDriver driver; public void SetUp() { System.setProperty("webdriver.http.factory", "jdk-http-client"); WebDriverManager.chromedriver().setup(); driver = new ChromeDriver(); driver.manage().window().maximize(); } // 添加获取driver的方法 public WebDriver getDriver() { return driver; } public void signin() throws InterruptedException { driver.get("https://zolvitdash.vakilsearch.com/login"); dashloginpagepom.Phone_number(driver).sendKeys("8825892445"); dashloginpagepom.continue_button(driver).click(); Thread.sleep(6000); dashloginpagepom.otpone(driver).sendKeys("0"); dashloginpagepom.otptwo(driver).sendKeys("0"); dashloginpagepom.otpthree(driver).sendKeys("0"); dashloginpagepom.otpfour(driver).sendKeys("0"); dashloginpagepom.cont(driver).click(); Thread.sleep(6000); } public void result() { driver.close(); System.out.println("Test Completed Successfully"); } }
- 修改
InvoiceCreationSanity类:
package pages; import org.openqa.selenium.WebDriver; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import pages.createinvoicepom; public class InvoiceCreationSanity { private WebDriver driver; @BeforeTest public void SetUp() throws InterruptedException { TestNG_Demo Setupobject = new TestNG_Demo(); Setupobject.SetUp(); Setupobject.signin(); // 获取TestNG_Demo中初始化好的driver实例 driver = Setupobject.getDriver(); } @Test public void invoicecreation() { createinvoicepom.createinvoice(driver).click(); } public void result() { System.out.println("Test Completed Successfully"); } }
额外优化建议
createinvoicepom中的静态element变量存在线程安全风险,建议改为方法内局部变量:
public static WebElement createinvoice(WebDriver driver){ WebElement element = driver.findElement(By.xpath("//span[@class='styles_btnContent__7MVVu']")); return element; }
- 避免使用
Thread.sleep(),改用WebDriverWait实现显式等待,提升测试稳定性。
内容的提问来源于stack exchange,提问作者Fayaz
相关产品推荐
相关产品推荐

