</>

Technology

Cucumber

Difficulty

Advanced

Interview Question

How do you implement cross-browser testing with Cucumber and TestNG?

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);
}

Follow AutomateQA

Related Topics