Я уверен, что это должно быть легко решить, но в данный момент мне ничего не приходит в голову, вот ситуация.
У меня есть один класс Singleton (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>
Консольный вывод
class testParallel.FirstTestClass THREAD ID: 22 Имя: TestNG
class testParallel.SecondTestClass Идентификатор резьбы: 23 Имя: TestNG
class testParallel.testSetup THREAD ID: 23 Имя: TestNG
java.lang.NullPointerException в
testParallel.testSetup.onTestFailure (testSetup.java:21) в
org.testng.internal.Invoker.runTestListeners (Invoker.java:1895) в
org.testng.internal.Invoker.runTestListeners (Invoker.java:1879) в
org.testng.internal.Invoker.invokeMethod (Invoker.java:778) в
org.testng.internal.Invoker.invokeTestMethod (Invoker.java:901) в
org.testng.internal.Invoker.invokeTestMethods (Invoker.java:1231) в
org.testng.internal.TestMethodWorker.invokeTestMethods (TestMethodWorker.java:127)
в
org.testng.internal.TestMethodWorker.run (TestMethodWorker.java:111)
в org.testng.TestRunner.privateRun (TestRunner.java:767) в
org.testng.TestRunner.run (TestRunner.java:617) в
org.testng.SuiteRunner.runTest (SuiteRunner.java:334) в
org.testng.SuiteRunner.access $ 000 (SuiteRunner.java:37) в
org.testng.SuiteRunner $ SuiteWorker.run (SuiteRunner.java:368) в
org.testng.internal.thread.ThreadUtil $ 2.call (ThreadUtil.java:64) в
java.util.concurrent.FutureTask.run (FutureTask.java:266) в
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) ТЕКУЩИЙ URL
: https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna