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