Create thread-safe frameworks for parallel test execution
Scale tests across multiple machines and cloud platforms
Efficiently manage WebDriver instances and system resources
Solve data isolation, synchronization, and reporting issues
public class ThreadSafeWebDriverManager { private static final ThreadLocal<WebDriver> driverThreadLocal = new ThreadLocal<>(); private static final ThreadLocal<String> sessionIdThreadLocal = new ThreadLocal<>(); public static void setDriver(WebDriver driver) { driverThreadLocal.set(driver); if (driver instanceof RemoteWebDriver) { sessionIdThreadLocal.set(((RemoteWebDriver) driver).getSessionId().toString()); } } public static WebDriver getDriver() { return driverThreadLocal.get(); public static String getSessionId() { return sessionIdThreadLocal.get(); public static void quitDriver() { WebDriver driver = driverThreadLocal.get(); if (driver != null) { driver.quit(); driverThreadLocal.remove(); sessionIdThreadLocal.remove(); } // Parallel test execution with TestNG public class ParallelTestBase { @BeforeMethod public void setUp() { String browserType = System.getProperty("browser", "chrome"); WebDriver driver = createDriver(browserType); ThreadSafeWebDriverManager.setDriver(driver); @AfterMethod public void tearDown() { ThreadSafeWebDriverManager.quitDriver(); private WebDriver createDriver(String browserType) { WebDriverFactory factory = WebDriverFactory.getFactory(browserType); return factory.createDriver(); }
public class CloudWebDriverFactory extends WebDriverFactory { @Override public WebDriver createDriver() { String cloudProvider = System.getProperty("cloud.provider", "local"); switch (cloudProvider.toLowerCase()) { case "browserstack": return createBrowserStackDriver(); case "saucelabs": return createSauceLabsDriver(); case "grid": return createGridDriver(); default: return createLocalDriver(); private WebDriver createBrowserStackDriver() { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("browserName", System.getProperty("browser", "chrome")); caps.setCapability("browserVersion", System.getProperty("browser.version", "latest")); caps.setCapability("os", System.getProperty("os", "Windows")); caps.setCapability("osVersion", System.getProperty("os.version", "10")); caps.setCapability("buildName", System.getProperty("build.name", "Automation Test")); caps.setCapability("sessionName", getTestName()); try { String username = System.getProperty("browserstack.username"); String accessKey = System.getProperty("browserstack.accesskey"); String url = String.format("https://%s:%s@hub-cloud.browserstack.com/wd/hub", username, accessKey); return new RemoteWebDriver(new URL(url), caps); } catch (MalformedURLException e) { throw new RuntimeException("Invalid BrowserStack URL", e); ← Module 5: Data-Driven Architecture Module 6 Complete! 🎉 Module 7: Reporting Architecture →