【问题标题】:NullPointerException in Selenium WebDriver Instance When Using in TestNG在 TestNG 中使用时 Selenium WebDriver 实例中的 NullPointerException
【发布时间】:2026-02-15 00:05:01
【问题描述】:

我使用 TestNG 为我的网站创建了一个 Selenium 测试套件。

我的项目名称是测试我的网站。为了执行我的 Selenium 测试脚本并创建测试报告,我直接从命令提示符执行 TestNG.xml 文件。对于我网站的不同模块,我为不同的模块创建了不同的 Java 类,并将它们保存在一个包中。我的文件的源代码如下:

TestNG.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Test My Website">
    <test name="My Website Test">
        <packages>
            <package name="testmywebsite" />
        </packages>
    </test>
</suite>

TestLogin.java

public class TestLogin {
    public static WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }

    @Test
    void loginTest() {
        //Code to perform the login test
    }

    @AfterClass
    public void setupWorkHistory() {
        TestModule1.driver = driver;
    }

}

TestModule1.java

public class TestModule1 {
    public static WebDriver driver;

    @Test
    void module1Test() {
        //Code to perform the module 1 test
        driver.getTitle();
    }

    @AfterClass
    public void setupModule2() {
        TestModule2.driver = driver;
    }
}

TestModule2.java

public class TestModule2 {
    public static WebDriver driver;

    @Test
    void module2Test() {
        //Code to perform the module 2 test
        driver.getTitle();
    }

    @AfterTest
    public void tearDown() {
        driver.close();
        driver.quit();
    }
}

请注意,在前两个 Java 类中,我添加了 setup&lt;Next Class's name&gt;() 方法来传递我的 driver 实例。

这里的问题是驱动程序实例成功地从 TestLogin.java 传递到了 TestModule1.java。然而,它在module2Test() 方法中抛出了NullPointerException,因此尽管在TestModule1.java 中创建了setupModule2() 方法并添加了@AfterClass 注释,但它显示module2Test() 的TestNG 报告失败。

谁能告诉我为什么会发生这种情况?尽早回复将不胜感激。谢谢。

【问题讨论】:

  • 您是否认为TestModule2 TestModule1 之后运行?
  • 感谢您的回复。如果 TestModule1 可以在 TestLogin 之后运行,为什么不应该运行?
  • 真的,我的意思是说TestModule2 可能在TestModule1 之前运行。这将导致 NPE。因为您正在进行数据耦合,您可能希望创建一个组依赖项,以防止 TestModule2TestModule1 之前运行。
  • 似乎是拼写错误。你能看看你的Test Module Class 2吗?它被命名为“TestModule12”而不是“TestModule2”
  • @BobDalgleish 很明显,TestModule2 在 TestModule1 之后运行,因为 TestModule2 的测试脚本在 TestModule1 之后执行。

标签: java nullpointerexception selenium-webdriver annotations testng


【解决方案1】:

好的,我自己找到了解决问题的方法。

为此,我编辑了我的 TestNG.xml 文件和 Java 类文件的源代码。它们给出如下:

TestNG.xml

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Test RockON">
    <test name="Rockon Test" allow-return-values="true">
        <classes>
            <class name="testmywebsite.TestLogin" />
            <class name="testmywebsite.TestModule1" />
            <class name="testmywebsite.TestModule2" />
        </classes>
    </test>
</suite>

TestLogin.java

public class TestLogin {
    public static WebDriver driver;

    @BeforeTest
    public void setup() {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.manage().window().maximize();
    }

    @Test
    void loginTest() {
        //Code to perform the login test
    }

    public static WebDriver getDriver() {
        return driver;
    }

}

TestModule1.java

public class TestModule1 {
    public static WebDriver driver;

    @BeforeClass
    public void setup() {
        driver = TestLogin.getDriver();
    }

    @Test
    void module1Test() {
        //Code to perform the module 1 test
    }

    public static WebDriver getDriver() {
        return driver;
    }

}

Module2.java

public class TestModule2 {
    public static WebDriver driver;

    @BeforeClass
    public void setup() {
        driver = TestModule1.getDriver();
    }

    @Test
    void module2Test() {
        //Code to perform the module 2 test
    }

    public static WebDriver getDriver() {
        return driver;
    }

}

我所做的是从我的 XML 文件中单独调用类,并将 allow-return-values="true" 属性添加到我的测试中,这允许类允许返回类型。在我的 Java 类中,我在 @BeforeClass 方法中的每个类中实例化了我的 WebDriver 实例。因此,我能够阻止我的 WebDriver 实例抛出 NullPointerException

【讨论】:

    最近更新 更多