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