Bird
Raised Fist0
Selenium Javatesting~15 mins

CSV data reading in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Read login credentials from CSV and verify login functionality
Preconditions (3)
Step 1: Open the login page URL in a browser.
Step 2: Read the first row of username and password from the CSV file.
Step 3: Enter the username into the username input field with id 'username'.
Step 4: Enter the password into the password input field with id 'password'.
Step 5: Click the login button with id 'loginBtn'.
Step 6: Verify that the URL changes to 'https://example.com/dashboard' indicating successful login.
✅ Expected Result: The user is successfully logged in and redirected to the dashboard page.
Automation Requirements - Selenium WebDriver with JUnit 5
Assertions Needed:
Verify the current URL after login matches 'https://example.com/dashboard'.
Best Practices:
Use explicit waits to wait for page elements to be interactable.
Use Page Object Model to separate page interactions.
Use try-with-resources to safely read the CSV file.
Use By.id locators for stable element identification.
Automated Solution
Selenium Java
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.time.Duration;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class LoginTest {
    private WebDriver driver;
    private WebDriverWait wait;

    @BeforeEach
    public void setUp() {
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    }

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

    @Test
    public void testLoginWithCsvData() throws IOException {
        driver.get("https://example.com/login");

        String csvFile = "credentials.csv";
        String username = "";
        String password = "";

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {
            String headerLine = br.readLine(); // Read header
            String dataLine = br.readLine(); // Read first data row
            if (dataLine != null) {
                String[] values = dataLine.split(",");
                username = values[0].trim();
                password = values[1].trim();
            }
        }

        WebElement usernameInput = wait.until(ExpectedConditions.elementToBeClickable(By.id("username")));
        usernameInput.clear();
        usernameInput.sendKeys(username);

        WebElement passwordInput = wait.until(ExpectedConditions.elementToBeClickable(By.id("password")));
        passwordInput.clear();
        passwordInput.sendKeys(password);

        WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("loginBtn")));
        loginButton.click();

        wait.until(ExpectedConditions.urlToBe("https://example.com/dashboard"));

        assertEquals("https://example.com/dashboard", driver.getCurrentUrl(), "User should be redirected to dashboard after login");
    }
}

This test uses Selenium WebDriver with JUnit 5 to automate login using credentials read from a CSV file.

In setUp(), we start the Chrome browser and create an explicit wait.

In the test method, we open the login page URL.

We read the CSV file using BufferedReader inside a try-with-resources block to ensure the file is closed properly.

We read the first data row after the header, split by comma, and extract username and password.

We wait explicitly for the username and password input fields to be clickable, then enter the values.

We click the login button and wait until the URL changes to the dashboard URL.

Finally, we assert that the current URL matches the expected dashboard URL, confirming successful login.

In tearDown(), we close the browser to clean up.

Common Mistakes - 4 Pitfalls
Hardcoding the CSV file path without using relative path or resource folder
Using Thread.sleep() instead of explicit waits
Not closing the BufferedReader after reading the CSV
Using brittle XPath locators instead of stable By.id locators
Bonus Challenge

Now add data-driven testing to run the login test with 3 different username and password pairs from the CSV file.

Show Hint

Practice

(1/5)
1. What is the main benefit of reading test data from a CSV file in Selenium Java tests?
easy
A. It automatically generates test reports.
B. It makes the test run faster by skipping validations.
C. It allows running the same test with multiple data sets easily.
D. It replaces the need for writing test scripts.

Solution

  1. Step 1: Understand the purpose of CSV data reading

    CSV files store multiple sets of data externally, allowing tests to use different inputs without changing code.
  2. Step 2: Identify the benefit in test execution

    Using CSV data lets the same test run repeatedly with different inputs, improving coverage and maintenance.
  3. Final Answer:

    It allows running the same test with multiple data sets easily. -> Option C
  4. Quick Check:

    CSV data = multiple test inputs [OK]
Hint: CSV files separate data from code for easy test reuse [OK]
Common Mistakes:
  • Thinking CSV speeds up test execution
  • Believing CSV auto-generates reports
  • Assuming CSV replaces test scripts
2. Which of the following Java code snippets correctly reads a CSV file line by line using BufferedReader?
easy
A. BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line = br.readLine(); while (line != null) { System.out.println(line); } br.close();
B. BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close();
C. BufferedReader br = new BufferedReader(new FileReader("data.csv")); while (br.readLine() != null) { System.out.println(line); } br.close();
D. BufferedReader br = new BufferedReader(new FileReader("data.csv")); for (int i=0; i<10; i++) { System.out.println(br.readLine()); } br.close();

Solution

  1. Step 1: Check correct BufferedReader usage

    BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); correctly initializes BufferedReader, reads each line into 'line', checks for null, and prints it inside the loop.
  2. Step 2: Identify errors in other options

    BufferedReader br = new BufferedReader(new FileReader("data.csv")); while (br.readLine() != null) { System.out.println(line); } br.close(); uses 'line' without assignment; BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line = br.readLine(); while (line != null) { System.out.println(line); } br.close(); never updates 'line' inside loop; BufferedReader br = new BufferedReader(new FileReader("data.csv")); for (int i=0; i<10; i++) { System.out.println(br.readLine()); } br.close(); reads fixed 10 lines without null check.
  3. Final Answer:

    BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); -> Option B
  4. Quick Check:

    Assign line inside while condition [OK]
Hint: Assign line inside while condition to avoid null errors [OK]
Common Mistakes:
  • Not assigning line inside the loop condition
  • Forgetting to update line inside the loop
  • Not checking for null before printing
3. Given the following code snippet, what will be the output if the CSV file contains:
name,age John,30 Jane,25

BufferedReader br = new BufferedReader(new FileReader("data.csv")); String line; while ((line = br.readLine()) != null) { String[] data = line.split(","); System.out.println(data[0] + " is " + data[1] + " years old."); } br.close();
medium
A. name is age years old. John is 30 years old. Jane is 25 years old.
B. John is 30 years old. Jane is 25 years old.
C. name,age John,30 Jane,25
D. Error: ArrayIndexOutOfBoundsException

Solution

  1. Step 1: Understand CSV content and reading loop

    The CSV has a header line 'name,age' and two data lines. The code reads each line and splits by comma.
  2. Step 2: Analyze output for each line

    For the header line, data[0] = 'name', data[1] = 'age', so prints 'name is age years old.' Then for John and Jane lines, prints their names and ages accordingly.
  3. Final Answer:

    name is age years old. John is 30 years old. Jane is 25 years old. -> Option A
  4. Quick Check:

    Header line included in output [OK]
Hint: CSV header line is read like data unless skipped [OK]
Common Mistakes:
  • Assuming header line is skipped automatically
  • Expecting only data lines output
  • Ignoring split results causing errors
4. Identify the error in this CSV reading code snippet:
BufferedReader br = new BufferedReader(new FileReader("data.csv"));
String line = br.readLine();
while (line != null) {
  String[] values = line.split(",");
  System.out.println(values[0]);
}
medium
A. The code is correct and will print the first column.
B. The split method is used incorrectly; it should be split(';').
C. BufferedReader should be replaced with Scanner for CSV files.
D. The loop never updates 'line', causing an infinite loop.

Solution

  1. Step 1: Review loop condition and update

    The variable 'line' is assigned once before the loop but never updated inside the loop, so the condition never changes.
  2. Step 2: Consequence of missing update

    Without updating 'line' inside the loop, it causes an infinite loop printing the first line repeatedly.
  3. Final Answer:

    The loop never updates 'line', causing an infinite loop. -> Option D
  4. Quick Check:

    Update line inside loop to avoid infinite loop [OK]
Hint: Always update loop variable inside while to avoid infinite loops [OK]
Common Mistakes:
  • Forgetting to update 'line' inside the loop
  • Confusing split delimiter with semicolon
  • Thinking Scanner is mandatory for CSV
5. You want to read a CSV file with test data and run a Selenium test for each row. Which approach correctly integrates CSV reading with a test method in Java?
hard
A. Read the CSV in a separate method that returns a List; then loop over this list in the test method to run tests with each data set.
B. Hardcode all test data inside the test method and ignore CSV files.
C. Read the CSV file inside the test method but do not loop; only use the first line.
D. Use BufferedReader to read CSV but do not close it after reading.

Solution

  1. Step 1: Separate data reading from test logic

    Reading CSV in a separate method improves code reuse and clarity by returning all data as a list.
  2. Step 2: Loop over data in test method

    The test method loops over the list of data arrays, running the test for each data set, enabling data-driven testing.
  3. Final Answer:

    Read the CSV in a separate method that returns a List; then loop over this list in the test method to run tests with each data set. -> Option A
  4. Quick Check:

    Separate data reading and loop in test [OK]
Hint: Separate CSV reading method returns data list for test loops [OK]
Common Mistakes:
  • Hardcoding data inside tests reduces flexibility
  • Using only first CSV line ignores other data
  • Not closing BufferedReader causes resource leaks
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard