从 xml 文件将测试用例作为组运行时出现 NullPointer 异常

NullPointer Exception when running testcases as groups from xml file

提问人:Kaiser 提问时间:10/15/2023 最后编辑:Kaiser 更新时间:10/16/2023 访问量:40

问:

我是硒的新手。我尝试从XML文件运行两个类。我把测试分组在这两类中。但是当我在XML文件中添加标签时,它给出了一个nullpointer异常。但是当我运行它时,它工作正常。

XML 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Annotation running">

    <test name="Annotation Test Runner With Group!" >
        <groups>
            <run>
                <include name="smoke"/>
            </run>
        </groups>
        <classes>
            <class name="DemoPractise.Annotation"/>
            <class name="DemoPractise.annotation2"/>

        </classes>
    </test>

</suite>

Erro 日志

java.lang.NullPointerException
    at DemoPractise.Annotation.test2_BtsListBox(Annotation.java:31)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    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:1541)
    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 com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105)


java.lang.NullPointerException
    at DemoPractise.annotation2.test4_JQueryListBox(annotation2.java:32)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    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:1541)
    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 com.intellij.rt.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:66)
    at com.intellij.rt.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:105)


===============================================
Annotation running
Total tests run: 2, Passes: 0, Failures: 2, Skips: 0
===============================================


Process finished with exit code 0

我尝试在 @BeforeMethod 中设置驱动程序。但是,当使用标记来命名 xml 文件中的组时,它不会初始化。

selenium-webdriver intellij-idea selenium-chromedriver testng testng .xml

评论


答:

0赞 Nael Marwan 10/15/2023 #1

在测试类中遇到的 NullPointerException 可能是由于初始化 WebDriver 实例的方式和类中的测试方法所致。问题是 WebDriver 实例在任何测试方法之外进行初始化,导致它在执行测试方法时为 null。 若要解决此问题,应在每个测试方法中或使用 TestNG 的@BeforeMethod注释初始化 WebDriver 实例。

WebDriver driver;

    @BeforeSuite
    public void browserSetup() {
        WebDriverManager.chromedriver().setup(); // You should setup WebDriverManager for Chrome
        driver = new ChromeDriver();
        driver.manage().window().maximize();
    }

    @Test(groups = "original")
    public void test1_BtsDatePicker() {
        driver.get("https://www.lambdatest.com/selenium-playground/");
        driver.findElement(By.linkText("Bootstrap Date Picker")).click();
    }

    @Test(groups = {"regression", "smoke"})
    public void test2_BtsListBox() {
        driver.get("https://www.lambdatest.com/selenium-playground/");
        driver.findElement(By.linkText("Bootstrap List Box")).click();
    }

    @AfterSuite
    public void tearDown() {
        if (driver != null) {
            driver.quit(); // Use quit to close the browser and release resources
        }
    }

评论

0赞 Kaiser 10/15/2023
我也尝试过@BeforeMethod注释,但结果是一样的!虽然,如果我在每个测试方法中初始化一个 webdriver 实例,它就会起作用。但我想创建一个 Web 驱动程序实例一次,并将其用于所有其他测试方法。当我在 XML 文件中运行带有“<exclude>标签的测试方法时,上面的代码有效。只有当我使用“<include>”标签时才会发生问题。
0赞 Nael Marwan 10/15/2023
因此,将 webDriver 声明为静态。
0赞 Kaiser 10/16/2023
我的问题是代码工作正常,但是当它使用“exclude”标签从XML运行时!为什么它不使用“include”标签运行?为什么 include 标签的 nullpointer 异常?
0赞 Kaiser 10/16/2023 #2

发生此问题的原因是我没有将 @BeforeSuite 和 @AfterSuite 方法添加到组并将它们添加到 XML 文件中。我以为无论我是否将它们包含在 XML 文件中,这两个方法都会运行!仅使用“exclude”,它就会运行,因为它运行除所提供组中的方法之外的所有技术。