Answer
Parallel Execution Across Multiple Browsers
Method 1 — TestNG Parallel with Browser Parameter
testng.xml:
XML
<suite name="CrossBrowserSuite" parallel="tests" thread-count="3">
<test name="ChromeTest">
<parameter name="browser" value="chrome"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
<test name="FirefoxTest">
<parameter name="browser" value="firefox"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
<test name="EdgeTest">
<parameter name="browser" value="edge"/>
<classes><class name="tests.LoginTest"/></classes>
</test>
</suite>
Base Test Class:
Java
public class BaseTest {
protected WebDriver driver;
@Parameters("browser")
@BeforeMethod
public void setUp(String browser) {
switch (browser.toLowerCase()) {
case "chrome":
WebDriverManager.chromedriver().setup();
driver = new ChromeDriver();
break;
case "firefox":
WebDriverManager.firefoxdriver().setup();
driver = new FirefoxDriver();
break;
case "edge":
WebDriverManager.edgedriver().setup();
driver = new EdgeDriver();
break;
}
driver.manage().window().maximize();
}
@AfterMethod
public void tearDown() {
if (driver != null) driver.quit();
}
}
Method 2 — ThreadLocal for Thread-Safe Driver
Java
public class DriverManager {
private static ThreadLocal<WebDriver> tlDriver = new ThreadLocal<>();
public static WebDriver getDriver() { return tlDriver.get(); }
public static void setDriver(WebDriver driver) { tlDriver.set(driver); }
public static void removeDriver() {
tlDriver.get().quit();
tlDriver.remove();
}
}
Method 3 — Selenium Grid
Bash
# Start Hub
java -jar selenium-server.jar hub
# Register Chrome Node
java -jar selenium-server.jar node --hub http://localhost:4444
Java
DesiredCapabilities caps = new DesiredCapabilities();
caps.setBrowserName("chrome");
WebDriver driver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"), caps
);
Key Rules for Parallel Execution
- ✓Always use ThreadLocal<WebDriver> — never share driver instances between threads
- ✓Each test must create and destroy its own driver in
@Before/@AfterMethod - ✓Use independent test data per thread to avoid conflicts
- ✓Set
thread-countin testng.xml to match available machine cores/nodes
