Introduction to Selenium
Selenium WebDriver Basics
WebDriver Commands
Synchronization in Selenium
Working with Different Browsers
Setting up WebDriver for different browsers
Handling Advanced User Interactions
Page Object Model (POM)
Introduction to POM
TestNG Framework
Creating and Running TestNG Tests

Cross-browser testing in Selenium using Java is essential to ensure that your web application works correctly across different browsers. Here are the best practices for cross-browser testing using Selenium Java, described in detail with examples:

1. Setting Up WebDriver for Different Browsers

To perform cross-browser testing, you need to set up WebDriver for different browsers. The most common browsers are Chrome, Firefox, and Internet Explorer (or Edge).

Example: Setting up WebDriver for Chrome, Firefox, and Edge

				
					import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class BrowserSetup {
    public static void main(String[] args) {
        // Set up Chrome driver
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver chromeDriver = new ChromeDriver();
        chromeDriver.get("http://www.example.com");
        chromeDriver.quit();

        // Set up Firefox driver
        System.setProperty("webdriver.gecko.driver", "path/to/geckodriver");
        WebDriver firefoxDriver = new FirefoxDriver();
        firefoxDriver.get("http://www.example.com");
        firefoxDriver.quit();

        // Set up Edge driver
        System.setProperty("webdriver.edge.driver", "path/to/edgedriver");
        WebDriver edgeDriver = new EdgeDriver();
        edgeDriver.get("http://www.example.com");
        edgeDriver.quit();
    }
}

				
			

2. Using WebDriver Manager for Simplified Driver Management

Manually managing WebDriver binaries can be cumbersome. The WebDriverManager library automates the management of binary files.

Example: Using WebDriverManager

				
					import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;

public class BrowserSetupWithWebDriverManager {
    public static void main(String[] args) {
        // Set up Chrome driver
        WebDriverManager.chromedriver().setup();
        WebDriver chromeDriver = new ChromeDriver();
        chromeDriver.get("http://www.example.com");
        chromeDriver.quit();

        // Set up Firefox driver
        WebDriverManager.firefoxdriver().setup();
        WebDriver firefoxDriver = new FirefoxDriver();
        firefoxDriver.get("http://www.example.com");
        firefoxDriver.quit();

        // Set up Edge driver
        WebDriverManager.edgedriver().setup();
        WebDriver edgeDriver = new EdgeDriver();
        edgeDriver.get("http://www.example.com");
        edgeDriver.quit();
    }
}

				
			

3. Using a Configuration File

Store browser configurations in a properties file to make it easier to switch between different browsers without changing the code.

Example: Configuration File (config.properties)

				
					browser=chrome

				
			

Example: Reading Configuration File

				
					import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.edge.EdgeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

public class BrowserSetupFromConfig {
    public static void main(String[] args) {
        Properties prop = new Properties();
        WebDriver driver = null;

        try {
            FileInputStream fis = new FileInputStream("path/to/config.properties");
            prop.load(fis);
            String browser = prop.getProperty("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;
                default:
                    throw new IllegalArgumentException("Browser not supported");
            }

            driver.get("http://www.example.com");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (driver != null) {
                driver.quit();
            }
        }
    }
}

				
			

4. Using Page Object Model (POM) for Maintainability

The Page Object Model is a design pattern that helps create object repositories for web UI elements. It enhances test maintenance and reduces code duplication

Example: Page Object Model

LoginPage.java

				
					import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;

public class LoginPage {
    WebDriver driver;

    @FindBy(id = "username")
    WebElement username;

    @FindBy(id = "password")
    WebElement password;

    @FindBy(id = "login")
    WebElement loginButton;

    public LoginPage(WebDriver driver) {
        this.driver = driver;
        PageFactory.initElements(driver, this);
    }

    public void login(String usr, String pwd) {
        username.sendKeys(usr);
        password.sendKeys(pwd);
        loginButton.click();
    }
}

				
			

LoginTest.java

				
					import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

public class LoginTest {
    public static void main(String[] args) {
        WebDriverManager.chromedriver().setup();
        WebDriver driver = new ChromeDriver();
        driver.get("http://www.example.com/login");

        LoginPage loginPage = new LoginPage(driver);
        loginPage.login("testuser", "testpassword");

        driver.quit();
    }
}

				
			

5. Using TestNG for Parallel Execution

TestNG allows you to run tests in parallel, which is crucial for cross-browser testing.

Example: TestNG Parallel Execution

testng.xml

				
					<!DOCTYPE suite SYSTEM "https://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="tests" thread-count="3">
    <test name="ChromeTest">
        <parameter name="browser" value="chrome" />
        <classes>
            <class name="tests.CrossBrowserTest" />
        </classes>
    </test>
    <test name="FirefoxTest">
        <parameter name="browser" value="firefox" />
        <classes>
            <class name="tests.CrossBrowserTest" />
        </classes>
    </test>
    <test name="EdgeTest">
        <parameter name="browser" value="edge" />
        <classes>
            <class name="tests.CrossBrowserTest" />
        </classes>
    </test>
</suite>

				
			

CrossBrowserTest.java

				
					package tests;

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.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import io.github.bonigarcia.wdm.WebDriverManager;

public class CrossBrowserTest {
    WebDriver driver;

    @BeforeMethod
    @Parameters("browser")
    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;
            default:
                throw new IllegalArgumentException("Browser not supported");
        }
    }

    @Test
    public void testCrossBrowser() {
        driver.get("http://www.example.com");
        // Add assertions here
    }

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

				
			

6. Handling Browser-Specific Issues

Each browser might have specific quirks. You need to handle these within your tests.

Example: Handling Browser-Specific Issues

				
					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.By;
import org.openqa.selenium.NoSuchElementException;
import io.github.bonigarcia.wdm.WebDriverManager;

public class BrowserSpecificIssues {
    public static void main(String[] args) {
        WebDriver driver = null;

        try {
            String browser = "chrome"; // This could be read from a config file or environment variable

            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;
                default:
                    throw new IllegalArgumentException("Browser not supported");
            }

            driver.get("http://www.example.com");

            // Example of handling browser-specific issue
            try {
                if (browser.equals("chrome")) {
                    driver.findElement(By.id("chrome-specific-element")).click();
                } else if (browser.equals("firefox")) {
                    driver.findElement(By.id("firefox-specific-element")).click();
                } else if (browser.equals("edge")) {
                    driver.findElement(By.id("edge-specific-element")).click();
                }
            } catch (NoSuchElementException e) {
                System.out.println("Element not found for browser: " + browser);
            }
        } finally {
            if (driver != null) {
                driver.quit();
            }
        }
    }
}

				
			

7. Using Cloud-Based Testing Platforms

For a broader range of browser and OS combinations, use cloud-based testing platforms like Selenium Grid, BrowserStack, or Sauce Labs.

Example: Using BrowserStack

				
					import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.URL;

public class BrowserStackTest {
    public static void main(String[] args) throws Exception {
        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("browser", "chrome");
        caps.setCapability("browser_version", "latest");
        caps.setCapability("os", "Windows");
        caps.setCapability("os_version", "10");
        caps.setCapability("name", "BrowserStack Test");

        WebDriver driver = new RemoteWebDriver(new URL("https://YOUR_USERNAME:YOUR_ACCESS_KEY@hub-cloud.browserstack.com/wd/hub"), caps);
        driver.get("http://www.example.com");
        
        // Add assertions here

        driver.quit();
    }
}

				
			

By following these best practices, you can ensure your web application is tested thoroughly across different browsers and platforms. The key is to automate the setup process, handle browser-specific issues, and make use of parallel execution to speed up the testing process.

Scroll to Top