Bird
Raised Fist0
Selenium Javatesting~15 mins

Excel data reading (Apache POI) in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Read login credentials from Excel and verify login page input fields
Preconditions (4)
Step 1: Open the Excel file 'credentials.xlsx'
Step 2: Read the username and password from the second row of sheet 'LoginData'
Step 3: Open browser and navigate to 'https://example.com/login'
Step 4: Find the username input field and enter the username from Excel
Step 5: Find the password input field and enter the password from Excel
Step 6: Verify that the username input field contains the correct username
Step 7: Verify that the password input field contains the correct password
✅ Expected Result: Username and password fields on the login page contain the values read from the Excel file
Automation Requirements - Selenium WebDriver with TestNG and Apache POI
Assertions Needed:
Assert username input field value equals Excel username
Assert password input field value equals Excel password
Best Practices:
Use explicit waits for element visibility
Use Page Object Model for page interactions
Close Excel file and browser after test
Handle exceptions for file reading
Automated Solution
Selenium Java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
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 org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.time.Duration;

public class ExcelDataLoginTest {
    private WebDriver driver;
    private WebDriverWait wait;
    private String username;
    private String password;

    @BeforeClass
    public void setUp() throws IOException {
        // Read Excel file
        try (FileInputStream fis = new FileInputStream("credentials.xlsx")) {
            Workbook workbook = new XSSFWorkbook(fis);
            Sheet sheet = workbook.getSheet("LoginData");
            Row row = sheet.getRow(1); // second row (index 1)
            Cell userCell = row.getCell(0); // Username column
            Cell passCell = row.getCell(1); // Password column
            username = userCell.getStringCellValue();
            password = passCell.getStringCellValue();
            workbook.close();
        }

        // Setup WebDriver
        driver = new ChromeDriver();
        wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    }

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

        // Wait for username field and enter username
        WebElement usernameField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
        usernameField.clear();
        usernameField.sendKeys(username);

        // Wait for password field and enter password
        WebElement passwordField = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("password")));
        passwordField.clear();
        passwordField.sendKeys(password);

        // Assert username field value
        Assert.assertEquals(usernameField.getAttribute("value"), username, "Username input mismatch");

        // Assert password field value
        Assert.assertEquals(passwordField.getAttribute("value"), password, "Password input mismatch");
    }

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

This test reads username and password from an Excel file using Apache POI in the @BeforeClass setup method. It opens the Excel file credentials.xlsx, accesses the sheet LoginData, and reads the second row's first two cells for username and password.

Then it opens the browser and navigates to the login page URL. It waits explicitly for the username and password input fields to be visible before interacting with them. It enters the read username and password into the respective fields.

Assertions check that the input fields contain the exact values read from Excel, ensuring the data was correctly loaded and entered.

The @AfterClass method closes the browser to clean up resources.

This structure follows best practices: explicit waits avoid timing issues, resource cleanup is done, and exceptions during file reading are handled by try-with-resources.

Common Mistakes - 4 Pitfalls
Hardcoding Excel file path without handling exceptions
Using Thread.sleep() instead of explicit waits for elements
Not closing the workbook or file input stream
Using brittle XPath selectors instead of stable IDs or names
Bonus Challenge

Now add data-driven testing to run the login field verification with 3 different username/password pairs from the Excel sheet

Show Hint

Practice

(1/5)
1. What is the main purpose of using Apache POI in Selenium Java testing?
easy
A. To read and write Excel files for test data management
B. To locate web elements on a webpage
C. To execute JavaScript code in the browser
D. To generate HTML reports for test results

Solution

  1. Step 1: Understand Apache POI's role

    Apache POI is a library used to handle Microsoft Office files, especially Excel, in Java programs.
  2. Step 2: Connect Apache POI with Selenium testing

    In Selenium tests, Apache POI helps read and write Excel files to manage test data efficiently.
  3. Final Answer:

    To read and write Excel files for test data management -> Option A
  4. Quick Check:

    Apache POI = Excel file handling [OK]
Hint: Apache POI = Excel data handling in Java tests [OK]
Common Mistakes:
  • Confusing Apache POI with Selenium WebDriver functions
  • Thinking Apache POI is for web element locating
  • Assuming Apache POI generates test reports
2. Which of the following is the correct way to open an Excel workbook using Apache POI in Java?
easy
A. Workbook workbook = new Workbook("file.xlsx");
B. Workbook workbook = WorkbookFactory.create(new FileInputStream("file.xlsx"));
C. Workbook workbook = Workbook.open("file.xlsx");
D. Workbook workbook = new FileInputStream("file.xlsx");

Solution

  1. Step 1: Identify correct Workbook creation method

    Apache POI uses WorkbookFactory.create(InputStream) to open Excel files safely.
  2. Step 2: Check each option's syntax

    Workbook workbook = WorkbookFactory.create(new FileInputStream("file.xlsx")); correctly uses WorkbookFactory.create with FileInputStream. Others are invalid or incorrect constructors.
  3. Final Answer:

    Workbook workbook = WorkbookFactory.create(new FileInputStream("file.xlsx")); -> Option B
  4. Quick Check:

    Use WorkbookFactory.create with FileInputStream [OK]
Hint: Use WorkbookFactory.create with FileInputStream to open Excel [OK]
Common Mistakes:
  • Trying to instantiate Workbook directly
  • Using wrong constructors or methods
  • Assigning FileInputStream to Workbook variable
3. Given the following code snippet, what will be printed if the Excel cell at row 0, column 1 contains the string "TestData"?
Workbook workbook = WorkbookFactory.create(new FileInputStream("data.xlsx"));
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(1);
System.out.println(cell.getStringCellValue());
workbook.close();
medium
A. TestData
B. null
C. 0
D. Throws NullPointerException

Solution

  1. Step 1: Access the correct cell value

    The code accesses row 0, cell 1, which contains the string "TestData".
  2. Step 2: Print the string cell value

    Calling getStringCellValue() on that cell returns "TestData", which is printed.
  3. Final Answer:

    TestData -> Option A
  4. Quick Check:

    Cell value = "TestData" printed [OK]
Hint: getStringCellValue() returns cell text directly [OK]
Common Mistakes:
  • Assuming cell is null and causes exception
  • Using getNumericCellValue() on string cell
  • Confusing row and column indexes
4. Identify the error in the following code snippet that reads an Excel file using Apache POI:
FileInputStream fis = new FileInputStream("data.xlsx");
Workbook workbook = WorkbookFactory.create(fis);
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell = row.getCell(0);
System.out.println(cell.getStringCellValue());
// Missing workbook.close()
medium
A. WorkbookFactory.create() cannot accept FileInputStream
B. getSheetAt(0) should be getSheet("Sheet1")
C. FileInputStream should be closed after use
D. getStringCellValue() cannot be called on numeric cells

Solution

  1. Step 1: Check resource management

    The code opens FileInputStream but does not close it, which can cause resource leaks.
  2. Step 2: Confirm correct usage of WorkbookFactory and methods

    WorkbookFactory.create accepts FileInputStream, getSheetAt(0) is valid, and getStringCellValue() is fine if cell is string.
  3. Final Answer:

    FileInputStream should be closed after use -> Option C
  4. Quick Check:

    Always close streams to avoid leaks [OK]
Hint: Always close FileInputStream and Workbook after use [OK]
Common Mistakes:
  • Forgetting to close FileInputStream
  • Assuming WorkbookFactory.create rejects streams
  • Confusing sheet access methods
5. You want to read multiple rows from an Excel sheet and store the first column values into a List<String>. Which approach correctly reads all rows except the header row using Apache POI?
hard
A. Use a for loop from 1 to sheet.getPhysicalNumberOfRows(), get each row's cell(1) string value, add to list
B. Use a for loop from 0 to sheet.getLastRowNum(), get each row's cell(0) numeric value, add to list
C. Use a while loop with sheet.getPhysicalNumberOfRows(), get cell(1) string value, add to list
D. Use a for loop from 1 to sheet.getLastRowNum(), get each row's cell(0) string value, add to list

Solution

  1. Step 1: Skip header row and loop through rows

    Start loop at 1 to skip header (row 0), loop until sheet.getLastRowNum() to cover all rows.
  2. Step 2: Access first column cell and get string value

    Get cell at index 0 (first column), call getStringCellValue(), and add to list.
  3. Final Answer:

    Use a for loop from 1 to sheet.getLastRowNum(), get each row's cell(0) string value, add to list -> Option D
  4. Quick Check:

    Loop rows from 1, get cell(0) string values [OK]
Hint: Start loop at 1 to skip header, get cell(0) string values [OK]
Common Mistakes:
  • Starting loop at 0 and including header
  • Using wrong cell index (1 instead of 0)
  • Using numeric value for string cells
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