Предыстория.
Сейчас браузер создается и удаляется каждый тестовый метод. 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 метод.
Буду рад любым подсказкам