Answer
Cross-Browser Testing with Cucumber + TestNG
DriverFactory — Browser Selection
Java
package factory;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.*;
import org.openqa.selenium.firefox.*;
import org.openqa.selenium.edge.*;
public class DriverFactory {
public static WebDriver createDriver(String browser, boolean headless) {
return switch (browser.toLowerCase()) {
case "chrome" -> {
WebDriverManager.chromedriver().setup();
ChromeOptions opts = new ChromeOptions();
if (headless) opts.addArguments("--headless=new", "--no-sandbox");
yield new ChromeDriver(opts);
}
case "firefox" -> {
WebDriverManager.firefoxdriver().setup();
FirefoxOptions opts = new FirefoxOptions();
if (headless) opts.addArguments("--headless");
yield new FirefoxDriver(opts);
}
case "edge" -> {
WebDriverManager.edgedriver().setup();
EdgeOptions opts = new EdgeOptions();
if (headless) opts.addArguments("--headless=new");
yield new EdgeDriver(opts);
}
default -> throw new IllegalArgumentException("Unknown browser: " + browser);
};
}
}
Hooks — Read Browser from System Property
Java
public class Hooks {
private final ScenarioContext ctx;
public Hooks(ScenarioContext ctx) { this.ctx = ctx; }
@Before
public void setUp() {
String browser = System.getProperty("browser", "chrome");
boolean headless = Boolean.parseBoolean(System.getProperty("headless", "false"));
ctx.driver = DriverFactory.createDriver(browser, headless);
ctx.driver.manage().window().maximize();
}
@After
public void tearDown(Scenario scenario) {
if (scenario.isFailed()) {
byte[] ss = ((TakesScreenshot) ctx.driver).getScreenshotAs(OutputType.BYTES);
scenario.attach(ss, "image/png", "Failure - " + scenario.getName());
}
ctx.driver.quit();
}
}
testng.xml — Run All Browsers in Parallel
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.9.dtd">
<suite name="Cross-Browser Suite" parallel="tests" thread-count="3">
<test name="Chrome Tests">
<parameter name="browser" value="chrome"/>
<classes>
<class name="runners.TestRunner"/>
</classes>
</test>
<test name="Firefox Tests">
<parameter name="browser" value="firefox"/>
<classes>
<class name="runners.TestRunner"/>
</classes>
</test>
<test name="Edge Tests">
<parameter name="browser" value="edge"/>
<classes>
<class name="runners.TestRunner"/>
</classes>
</test>
</suite>
Read Browser from testng.xml Parameter
Java
// Use @BeforeTest with ITestContext to read testng.xml parameter
// OR read via System.getProperty set by Maven
@Before
public void setUp(Scenario scenario) {
// Tags can indicate browser too
if (scenario.getSourceTagNames().contains("@firefox")) {
ctx.driver = DriverFactory.createDriver("firefox", false);
} else {
String browser = System.getProperty("browser", "chrome");
ctx.driver = DriverFactory.createDriver(browser, false);
}
}
Maven Commands
Bash
# Run on Chrome (default)
mvn test -Dcucumber.filter.tags="@regression"
# Run on Firefox
mvn test -Dbrowser=firefox -Dcucumber.filter.tags="@regression"
# Run all browsers in parallel (via testng.xml)
mvn test -DsuiteXmlFile=cross-browser-testng.xml
# Headless Chrome in CI
mvn test -Dbrowser=chrome -Dheadless=true -Dcucumber.filter.tags="@smoke"
Selenium Grid for Distributed Cross-Browser
Java
@Before
public void setUp() {
String browser = System.getProperty("browser", "chrome");
String gridUrl = System.getProperty("grid.url", "http://localhost:4444");
DesiredCapabilities caps = new DesiredCapabilities();
caps.setBrowserName(browser);
ctx.driver = new RemoteWebDriver(new URL(gridUrl), caps);
}
