Excel data reading (Apache POI) in Selenium Java - Build an Automation Script
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.
Now add data-driven testing to run the login field verification with 3 different username/password pairs from the Excel sheet
Practice
Solution
Step 1: Understand Apache POI's role
Apache POI is a library used to handle Microsoft Office files, especially Excel, in Java programs.Step 2: Connect Apache POI with Selenium testing
In Selenium tests, Apache POI helps read and write Excel files to manage test data efficiently.Final Answer:
To read and write Excel files for test data management -> Option AQuick Check:
Apache POI = Excel file handling [OK]
- Confusing Apache POI with Selenium WebDriver functions
- Thinking Apache POI is for web element locating
- Assuming Apache POI generates test reports
Solution
Step 1: Identify correct Workbook creation method
Apache POI uses WorkbookFactory.create(InputStream) to open Excel files safely.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.Final Answer:
Workbook workbook = WorkbookFactory.create(new FileInputStream("file.xlsx")); -> Option BQuick Check:
Use WorkbookFactory.create with FileInputStream [OK]
- Trying to instantiate Workbook directly
- Using wrong constructors or methods
- Assigning FileInputStream to Workbook variable
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();Solution
Step 1: Access the correct cell value
The code accesses row 0, cell 1, which contains the string "TestData".Step 2: Print the string cell value
Calling getStringCellValue() on that cell returns "TestData", which is printed.Final Answer:
TestData -> Option AQuick Check:
Cell value = "TestData" printed [OK]
- Assuming cell is null and causes exception
- Using getNumericCellValue() on string cell
- Confusing row and column indexes
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()Solution
Step 1: Check resource management
The code opens FileInputStream but does not close it, which can cause resource leaks.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.Final Answer:
FileInputStream should be closed after use -> Option CQuick Check:
Always close streams to avoid leaks [OK]
- Forgetting to close FileInputStream
- Assuming WorkbookFactory.create rejects streams
- Confusing sheet access methods
Solution
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.Step 2: Access first column cell and get string value
Get cell at index 0 (first column), call getStringCellValue(), and add to list.Final Answer:
Use a for loop from 1 to sheet.getLastRowNum(), get each row's cell(0) string value, add to list -> Option DQuick Check:
Loop rows from 1, get cell(0) string values [OK]
- Starting loop at 0 and including header
- Using wrong cell index (1 instead of 0)
- Using numeric value for string cells
Ready to prove it?
Pass the test and this pattern moves unknown
