Advanced Chapter 17 · 12 min read

Cross-Browser Testing

Run tests across Chrome, Firefox, Edge, and Safari. Use Selenium Grid for distributed execution and Docker containers for consistency.

Cross-Browser Testing

Real users use different browsers. Cross-browser testing ensures your app works consistently across Chrome, Firefox, Edge, and Safari. Selenium supports all major browsers through interchangeable drivers.

Selenium Grid

Selenium Grid distributes tests across multiple machines and browsers. Selenium 4 Grid is fully redesigned with Docker support, a modern UI, and GraphQL API.

CrossBrowserTest.java
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.testng.Assert;
import org.testng.annotations.*;
import java.net.URL;
import java.time.Duration;

public class CrossBrowserTest {

    WebDriver driver;

    @Parameters({"browser"})
    @BeforeMethod
    public void setup(@Optional("chrome") String browser) {
        switch (browser.toLowerCase()) {
            case "firefox":
                driver = new FirefoxDriver();
                break;
            case "edge":
                driver = new EdgeDriver();
                break;
            default:
                driver = new ChromeDriver();
        }
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
        driver.manage().window().maximize();
    }

    @Test
    public void testAcrossBrowsers() {
        driver.get("https://www.selenium.dev/");
        String title = driver.getTitle();
        Assert.assertTrue(title.contains("Selenium"));
        System.out.println("Browser: "
            + ((RemoteWebDriver) driver).getCapabilities().getBrowserName()
            + " - Title: " + title);
    }

    @AfterMethod
    public void teardown() { if (driver != null) driver.quit(); }
}

// testng.xml for cross-browser parallel:
// <suite name="CrossBrowser" parallel="tests" thread-count="3">
//   <test name="Chrome">
//     <parameter name="browser" value="chrome"/>
//     <classes><class name="CrossBrowserTest"/></classes>
//   </test>
//   <test name="Firefox">
//     <parameter name="browser" value="firefox"/>
//     <classes><class name="CrossBrowserTest"/></classes>
//   </test>
//   <test name="Edge">
//     <parameter name="browser" value="edge"/>
//     <classes><class name="CrossBrowserTest"/></classes>
//   </test>
// </suite>
docker-compose.yml
# Selenium Grid 4 with Docker
# Run: docker-compose up -d
# Grid UI: http://localhost:4444/ui

version: "3"
services:
  selenium-hub:
    image: selenium/hub:4.27.0
    ports:
      - "4444:4444"
      - "4443:4443"
      - "4442:4442"

  chrome:
    image: selenium/node-chrome:4.27.0
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - SE_NODE_MAX_SESSIONS=4

  firefox:
    image: selenium/node-firefox:4.27.0
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443

  edge:
    image: selenium/node-edge:4.27.0
    depends_on:
      - selenium-hub
    environment:
      - SE_EVENT_BUS_HOST=selenium-hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
test_cross_browser.py
from selenium import webdriver
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver
import pytest


@pytest.fixture(params=["chrome", "firefox"])
def browser_driver(request):
    """Parameterized fixture — runs each test on each browser"""
    browser = request.param

    if browser == "firefox":
        driver = webdriver.Firefox()
    elif browser == "edge":
        driver = webdriver.Edge()
    else:
        driver = webdriver.Chrome()

    driver.implicitly_wait(10)
    driver.maximize_window()

    yield driver
    driver.quit()


def test_across_browsers(browser_driver):
    browser_driver.get("https://www.selenium.dev/")
    title = browser_driver.title
    assert "Selenium" in title

    browser_name = browser_driver.capabilities.get("browserName", "unknown")
    print(f"Browser: {browser_name} - Title: {title}")


# Remote Grid execution
def test_on_grid():
    """Run on Selenium Grid (docker-compose up first)"""
    options = webdriver.ChromeOptions()

    driver = webdriver.Remote(
        command_executor='http://localhost:4444/wd/hub',
        options=options
    )

    try:
        driver.get("https://www.selenium.dev/")
        assert "Selenium" in driver.title
        print(f"Grid browser: {driver.capabilities['browserName']}")
    finally:
        driver.quit()

Selenium Advanced Cross-Browser Testing

Written by PV

© 2026 All Rights Reserved