package net.thucydides.core.webdriver; import net.thucydides.core.annotations.TestCaseAnnotations; import net.thucydides.core.guice.Injectors; import net.thucydides.core.pages.Pages; import net.thucydides.core.steps.StepAnnotations; import net.thucydides.core.steps.StepFactory; import org.apache.commons.lang3.StringUtils; import org.openqa.selenium.WebDriver; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * A utility class that provides services to initialize web testing and reporting-related fields in arbitrary objects. * It is designed to help integrate Thucydides into other testing tools such as Cucumber. */ public class ThucydidesWebDriverSupport { private static final List<WebdriverManager> registeredWebdriverManagers = Collections.synchronizedList(new ArrayList<WebdriverManager>()); private static final ThreadLocal<WebdriverManager> webdriverManagerThreadLocal = new ThreadLocal<WebdriverManager>(); private static final ThreadLocal<Pages> pagesThreadLocal = new ThreadLocal<Pages>(); private static final ThreadLocal<StepFactory> stepFactoryThreadLocal = new ThreadLocal<StepFactory>(); private static final ThreadLocal<String> currentRequestedDriver = new ThreadLocal<String>(); public static void initialize(String requestedDriver) { setRequestedDriverIfPresent(requestedDriver); setupWebdriverManager(); initPagesObjectUsing(getDriver()); initStepFactoryUsing(getPages()); } private static void setRequestedDriverIfPresent(String requestedDriver) { if (StringUtils.isNotEmpty(requestedDriver)) { currentRequestedDriver.set(requestedDriver); } else { currentRequestedDriver.remove(); } } public static void initialize() { initialize(null); } private static boolean webdriversInitialized() { return (webdriverManagerThreadLocal.get() != null); } private static void lazyInitalize() { if (!webdriversInitialized()) { initialize(); } } public static void initializeFieldsIn(final Object testCase) { injectDriverInto(testCase); injectAnnotatedPagesObjectInto(testCase); } public static StepFactory getStepFactory() { lazyInitalize(); return stepFactoryThreadLocal.get(); } public static WebDriver getDriver() { if (currentRequestedDriver.get() != null) { return getWebdriverManager().getWebdriver(currentRequestedDriver.get()); } else { return getWebdriverManager().getWebdriver(); } } public static void closeCurrentDrivers() { if (webdriversInitialized()) { getWebdriverManager().closeAllCurrentDrivers(); } } public static void closeAllDrivers() { if (webdriversInitialized()) { getWebdriverManager().closeAllDrivers(); } } private static void setupWebdriverManager() { setupWebdriverManager(Injectors.getInjector().getInstance(WebdriverManager.class)); } private static void setupWebdriverManager(WebdriverManager webdriverManager) { webdriverManagerThreadLocal.set(webdriverManager); } private static void initStepFactoryUsing(final Pages pagesObject) { stepFactoryThreadLocal.set(new StepFactory(pagesObject)); } private static WebdriverManager getWebdriverManager() { lazyInitalize(); return webdriverManagerThreadLocal.get(); } private static void initPagesObjectUsing(final WebDriver driver) { pagesThreadLocal.set(new Pages(driver)); } public static Pages getPages() { lazyInitalize(); return pagesThreadLocal.get(); } /** * Instantiate the @Managed-annotated WebDriver instance with current WebDriver. */ protected static void injectDriverInto(final Object testCase) { TestCaseAnnotations.forTestCase(testCase).injectDriver(getDriver()); } /** * Instantiates the @ManagedPages-annotated Pages instance using current WebDriver. */ protected static void injectAnnotatedPagesObjectInto(final Object testCase) { StepAnnotations.injectOptionalAnnotatedPagesObjectInto(testCase, getPages()); } }