TestNG - 并行测试执行,WebDriver nullpointer



我相信这必须很容易解决,但此刻我什么都没有想到,这就是情况。

我有一个单例类(DriverFactory.class(来设置和检索ThreadLocal对象。 并行运行的两个测试类(FirstTestClass(,(SecondTestClass( 和第三个 TestListenerAdapter 类,其中包含我想使用实际运行的 WebDriver 实例的方法(它应该绑定到线程(,但在这里我得到空指针异常,即使,这是代码

import config.DriverFactory;
import org.junit.Assert;
import org.testng.annotations.Test;
import org.openqa.selenium.WebDriver;
public class SecondTestClass {
WebDriver driver;
public SecondTestClass()throws Exception{
DriverFactory.getInstance().setDriver();
driver = DriverFactory.getInstance().getDriver();;
}
@Test
public void testInSecondClass() {
System.out.println("n THREAD ID: " + Thread.currentThread().getId() + " " + "n Name: " + Thread.currentThread().getName());
driver.get("https://www.allsaints.com");
System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());
Assert.assertTrue(false);
}
}
package testParallel;
import config.DriverFactory;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Test;
public class FirstTestClass {
WebDriver driver;
public FirstTestClass()throws Exception{
DriverFactory.getInstance().setDriver();
driver = DriverFactory.getInstance().getDriver();;
}
@Test
public void testInFirstClass() throws Exception{
System.out.println("n THREAD ID: " + Thread.currentThread().getId() + " " + "n Name: " + Thread.currentThread().getName());
DriverFactory.getInstance().setDriver();
driver = DriverFactory.getInstance().getDriver();;
driver.get("https://pl.wikipedia.org");
System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());
}
}
package config;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class DriverFactory {
private static DriverFactory instance = null;
public ThreadLocal<WebDriver> webDriver = new ThreadLocal<WebDriver>();
private DriverFactory() {}
@SuppressWarnings("varargs")
public static DriverFactory getInstance() {
if (instance == null) {
instance = new DriverFactory();
}
return instance;
}
public final void setDriver() throws Exception {
System.setProperty("webdriver.gecko.driver", "E:\Projects\allsaints\tess\drivers\geckodriver.exe");
webDriver.set(new FirefoxDriver());
}
public WebDriver getDriver() throws Exception {
return webDriver.get();
}
}
import config.DriverFactory;
import org.openqa.selenium.WebDriver;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
public class testSetup extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult tr) {
System.out.println(
"n THREAD ID: " + Thread.currentThread().getId() + " " +
"n Name: " + Thread.currentThread().getName()
);
WebDriver driver;
try {
driver = DriverFactory.getInstance().getDriver();
System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());
} catch (Exception e) {
e.printStackTrace();
}
super.onTestFailure(tr);
}
}
<?xml version="1.0"?>
<suite name="All Test Suite" parallel="tests" thread-count="5">
<listeners>
<listener class-name="testParallel.testSetup"/>
</listeners>
<test verbose="3" preserve-order="true" name="test1">
<classes>
<class name="testParallel.FirstTestClass"/>
</classes>
</test>
<test name="test2">
<classes>
<class name="testParallel.SecondTestClass"/>
</classes>
</test>
</suite>

控制台输出

测试并行。第一测试类 线程 ID: 22 名称: 测试NG

类测试并行.第二测试类 线程 ID: 23 名称: 测试NG

类测试并行测试设置 线程 ID: 23 名称: TestNG java.lang.NullPointerException at testParallel.testSetup.onTestFailure(testSetup.java:21( at org.testng.internal.Invoker.runTestListeners(Invoker.java:1895( at org.testng.internal.Invoker.runTestListeners(Invoker.java:1879( at org.testng.internal.Invoker.invokeMethod(Invoker.java:778( at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901( at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231( at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127( 在 org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111( at org.testng.TestRunner.privateRun(TestRunner.java:767( at org.testng.TestRunner.run(TestRunner.java:617( at org.testng.SuiteRunner.runTest(SuiteRunner.java:334( at org.testng.SuiteRunner.access$000(SuiteRunner.java:37( at org.testng.SuiteRunner$SuiteWorker.run(SuiteRunner.java:368( at org.testng.internal.thread.ThreadUtil$2.call(ThreadUtil.java:64( at java.util.concurrent.FutureTask.run(FutureTask.java:266( at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142( 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617( at java.lang.Thread.run(Thread.java:745( 当前网址是 :https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna

在侦听器中,我们不能直接访问其他类实例。因为,它将在执行开始时开始侦听。如果我们需要获取一些特定的类实例,那么我们可以通过 TestNG 侦听器(ITestResult(访问,如下所示,并且您的所有测试类都应该继承DriverFactory类。

侦听器类代码:

public class testSetup extends TestListenerAdapter {
@Override
public void onTestFailure(ITestResult tr) {
System.out.println(
"n THREAD ID: " + Thread.currentThread().getId() + " " +
"n Name: " + Thread.currentThread().getName()
);
Object currentClass=tr.getInstance();
WebDriver driver;
try {
driver =((DriverFactory) currentClass).getDriver();
System.out.println("CURRENT URL IS :" + driver.getCurrentUrl());
} catch (Exception e) {
e.printStackTrace();
}
super.onTestFailure(tr);
}
}

测试等级 1:

public class FirstTestClass extends DriverFactory {
WebDriver driver;

测试类 2:

public class SecondTestClass extends DriverFactory {
WebDriver driver;

相关内容

最新更新