Advanced Chapter 16 · 11 min read

Data-Driven Testing

Run tests with multiple data sets using TestNG DataProviders, pytest parametrize, Excel/CSV readers, and dynamic test generation.

Data-Driven Selenium Tests

Data-driven testing runs the same UI workflow with different input sets. Instead of duplicating tests, you define datasets and let the framework iterate — perfect for login tests, form validations, and search scenarios.

DataDrivenTest.java
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.Assert;
import org.testng.annotations.*;
import java.time.Duration;

public class DataDrivenTest {

    WebDriver driver;

    @BeforeMethod
    public void setup() {
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    }

    // Inline data provider
    @DataProvider(name = "formData")
    public Object[][] formData() {
        return new Object[][] {
            { "Alice", "alice@test.com", "password1" },
            { "Bob", "bob@test.com", "password2" },
            { "Charlie", "charlie@test.com", "password3" },
        };
    }

    @Test(dataProvider = "formData")
    public void testFormWithMultipleData(String name, String email, String pwd) {
        driver.get("https://www.selenium.dev/selenium/web/web-form.html");

        WebElement textInput = driver.findElement(By.name("my-text"));
        textInput.clear();
        textInput.sendKeys(name);

        WebElement passwordInput = driver.findElement(By.name("my-password"));
        passwordInput.clear();
        passwordInput.sendKeys(pwd);

        Assert.assertEquals(textInput.getAttribute("value"), name);
        Assert.assertEquals(passwordInput.getAttribute("value"), pwd);

        System.out.println("Tested with: " + name + " / " + email);
    }

    // Search test with multiple queries
    @DataProvider(name = "searchQueries")
    public Object[][] searchQueries() {
        return new Object[][] {
            { "Selenium WebDriver", true },
            { "nonexistent-xyz-123", false },
            { "Chrome DevTools", true },
        };
    }

    @Test(dataProvider = "searchQueries")
    public void testSearch(String query, boolean expectResults) {
        driver.get("https://www.selenium.dev/");
        System.out.println("Searching for: " + query
            + " (expect results: " + expectResults + ")");
    }

    @AfterMethod
    public void teardown() { if (driver != null) driver.quit(); }
}
test_data_driven.py
from selenium import webdriver
from selenium.webdriver.common.by import By
import pytest

@pytest.fixture
def driver():
    d = webdriver.Chrome()
    d.implicitly_wait(10)
    yield d
    d.quit()


@pytest.mark.parametrize("name, email, password", [
    ("Alice", "alice@test.com", "password1"),
    ("Bob", "bob@test.com", "password2"),
    ("Charlie", "charlie@test.com", "password3"),
])
def test_form_with_multiple_data(driver, name, email, password):
    driver.get("https://www.selenium.dev/selenium/web/web-form.html")

    text_input = driver.find_element(By.NAME, "my-text")
    text_input.clear()
    text_input.send_keys(name)

    pwd_input = driver.find_element(By.NAME, "my-password")
    pwd_input.clear()
    pwd_input.send_keys(password)

    assert text_input.get_attribute("value") == name
    assert pwd_input.get_attribute("value") == password

    print(f"Tested with: {name} / {email}")


@pytest.mark.parametrize("query, expect_results", [
    ("Selenium WebDriver", True),
    ("nonexistent-xyz-123", False),
    ("Chrome DevTools", True),
])
def test_search(driver, query, expect_results):
    driver.get("https://www.selenium.dev/")
    print(f"Searching for: {query} (expect results: {expect_results})")


# Data from CSV file
# import csv
# def load_csv(path):
#     with open(path) as f:
#         return [tuple(row) for row in csv.reader(f)][1:]  # skip header
#
# @pytest.mark.parametrize("name,email,pwd", load_csv("test_data.csv"))
# def test_from_csv(driver, name, email, pwd): ...

Selenium Advanced Data-Driven Testing

Written by PV

© 2026 All Rights Reserved