Предыстория.
Сейчас браузер создается и удаляется каждый тестовый метод. BaseTest класс выглядел следующим образом (добавил @BeforeClass @AfterClass, чтобы было наглядней) и тесты работали корректно, пробовал запускать тесты параллельно: два потока в двух классах - все отрабатывало корректно.
public abstract class BaseTest {
private static final ThreadLocal<WebDriver> DRIVER_CONTAINER = new ThreadLocal<>();
public static WebDriver getDriver() {
return DRIVER_CONTAINER.get();
}
protected HomePage openHomePage(){
getDriver().get(ReadXMLFile.takeConstantFromXML("URL", "Landing Page", "url"));
return new HomePage();
}
@BeforeClass
public static void BeforeClass(){
System.out.println(getDriver() + " Before Class\n");
}
@Before
public void setupDriver(){
ChromeDriverManager.getInstance().setup();
DRIVER_CONTAINER.set(new ChromeDriver());
System.out.println(getDriver() + " Before\n");
}
@After
public void cleanUp(){
ofNullable(getDriver()).ifPresent(WebDriver::quit);
DRIVER_CONTAINER.remove();
System.out.println(getDriver() + " After\n");
}
@AfterClass
public static void afterClass(){
System.out.println(getDriver() + " After Class\n");
}
}
Вот что вижу в консоле:
null Before Class
Starting ChromeDriver 2.29.461591 (62ebf098771772160f391d75e589dc567915b233) on port 18301
Only local connections are allowed.
квіт. 24, 2017 12:12:44 AM org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: OSS
ChromeDriver: chrome on XP (3aee0cc2089d69a337cec2c04f11e3ca) Before
null After
null After Class
То есть я вижу что все отрабатывает так как и ожидалось: Before Class драйвера еще нет, Before метод драйвер уже есть, After метод и After Class драйвера нет.
После преобразования получается такой класс:
public abstract class BaseTest {
private static final ThreadLocal<WebDriver> DRIVER_CONTAINER = new ThreadLocal<>();
public static WebDriver getDriver() {
return DRIVER_CONTAINER.get();
}
protected HomePage openHomePage(){
return new HomePage();
}
@BeforeClass
public static void setupDriver(){
ChromeDriverManager.getInstance().setup();
DRIVER_CONTAINER.set(new ChromeDriver());
System.out.println(getDriver() + "BeforeClass\n");
}
@Before
public void Before() {
System.out.println(getDriver() + "Before\n");
getDriver().get(ReadXMLFile.takeConstantFromXML("URL", "Landing Page", "url"));
}
@After
public void cleanUp() {
getDriver().manage().deleteAllCookies();
System.out.println(getDriver() + "After\n");
}
@AfterClass
public static void printAfter(){
ofNullable(getDriver()).ifPresent(WebDriver::quit);
DRIVER_CONTAINER.remove();
System.out.println(getDriver() + "AfterClass\n");
}
}
В консоле:
ChromeDriver: chrome on XP (dc1941851efef3ccae72bc169026de5f)BeforeClass
nullBefore
goToSingleReviewPage(tests.Navigation_TestCase): run 1 failed.
nullBefore
goToSingleReviewPage(tests.Navigation_TestCase): run 2 failed.
nullBefore
goToSingleReviewPage(tests.Navigation_TestCase): run 3 failed.
goToSingleReviewPage(tests.Navigation_TestCase): giving up after 3 failures.
java.lang.NullPointerException
at wrappers.BaseTest.Before(BaseTest.java:36)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
nullAfterClass
Драйвер как и ожидалось создался Before Class, но я не могу понять почему его уже нет в Before метод.
Буду рад любым подсказкам 