Reading test data from Excel in Selenium Python - Build an Automation Script
import unittest from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from openpyxl import load_workbook class LoginPage: def __init__(self, driver): self.driver = driver self.username_input = (By.ID, 'username') self.password_input = (By.ID, 'password') self.login_button = (By.ID, 'loginBtn') def load(self): self.driver.get('https://example.com/login') def login(self, username, password): WebDriverWait(self.driver, 10).until( EC.visibility_of_element_located(self.username_input)) self.driver.find_element(*self.username_input).clear() self.driver.find_element(*self.username_input).send_keys(username) self.driver.find_element(*self.password_input).clear() self.driver.find_element(*self.password_input).send_keys(password) self.driver.find_element(*self.login_button).click() class TestLoginWithExcel(unittest.TestCase): @classmethod def setUpClass(cls): cls.driver = webdriver.Chrome() cls.driver.maximize_window() cls.wait = WebDriverWait(cls.driver, 10) # Load Excel workbook and sheet cls.workbook = load_workbook('testdata.xlsx') cls.sheet = cls.workbook['LoginData'] def test_login_data_driven(self): login_page = LoginPage(self.driver) # Iterate over rows starting from row 2 (assuming row 1 is header) for row in self.sheet.iter_rows(min_row=2, values_only=True): username, password = row login_page.load() login_page.login(username, password) # Wait for URL to change to dashboard self.wait.until(EC.url_to_be('https://example.com/dashboard')) current_url = self.driver.current_url self.assertEqual(current_url, 'https://example.com/dashboard', f'Login failed for user {username}') # For simplicity, navigate back to login page to reset state self.driver.get('https://example.com/login') @classmethod def tearDownClass(cls): cls.driver.quit() if __name__ == '__main__': unittest.main()
This script uses unittest as the test framework and Selenium WebDriver to automate the browser.
The LoginPage class is a simple Page Object Model that encapsulates the login page elements and actions.
We use openpyxl to read the Excel file testdata.xlsx and get username and password pairs from the sheet LoginData.
In the test method, we loop through each row of data, open the login page, enter credentials, click login, and then wait explicitly for the URL to become the dashboard URL.
Assertions check that the URL is correct after login, indicating success.
After each login, we navigate back to the login page to reset the state for the next test data.
Finally, the browser is closed after all tests run.
This approach follows best practices: explicit waits, page objects, and clean test structure.
Now add data-driven testing with 3 different username and password pairs in the Excel file and verify all logins.
Practice
Solution
Step 1: Understand test data usage
Test data from Excel allows running the same test with many inputs without changing code.Step 2: Identify the benefit
This makes tests flexible and easier to maintain.Final Answer:
To run tests with many different inputs easily -> Option CQuick Check:
Reading Excel data = flexible inputs [OK]
- Thinking Excel makes tests faster
- Believing Excel replaces test code
- Confusing data reading with file creation
Solution
Step 1: Recall Excel reading libraries
openpyxl is a popular library to read/write Excel files in Python.Step 2: Differentiate from other libraries
pandas can read Excel but is heavier; requests is for web calls; selenium is for browser automation.Final Answer:
openpyxl -> Option DQuick Check:
Excel reading = openpyxl [OK]
- Choosing selenium which automates browsers
- Picking requests which handles HTTP
- Confusing pandas with openpyxl
from openpyxl import load_workbook
wb = load_workbook('data.xlsx')
sheet = wb.active
print(sheet['A2'].value)
Assuming cell A2 contains the text "TestUser".Solution
Step 1: Understand openpyxl cell access
sheet['A2'].value reads the content of cell A2 in the active sheet.Step 2: Check given cell content
Cell A2 contains "TestUser", so print outputs this string.Final Answer:
TestUser -> Option BQuick Check:
sheet['A2'].value = "TestUser" [OK]
- Printing the cell object instead of its value
- Confusing filename with cell content
- Expecting None if cell has text
from openpyxl import load_workbook
wb = load_workbook('testdata.xlsx')
sheet = wb['Sheet1']
for row in sheet.iter_rows(min_row=2, values_only=True):
print(row[0])Solution
Step 1: Check sheet access
wb['Sheet1'] correctly accesses the sheet named 'Sheet1'.Step 2: Analyze iter_rows usage
iter_rows with min_row=2 and values_only=True returns tuples of cell values from second row onward.Step 3: Confirm print statement
Printing row[0] prints the first column value of each row starting from row 2.Final Answer:
No error; code reads first column from second row correctly -> Option AQuick Check:
Code reads data correctly [OK]
- Using sheet['Sheet1'] instead of wb['Sheet1']
- Forgetting values_only=True to get cell values
- Thinking wb.save() is needed before reading
Solution
Step 1: Understand data safety
Empty cells in Excel return None, which can cause errors if not checked.Step 2: Use iter_rows with values_only=True and check for None
This approach reads all rows and allows safe validation before using data in tests.Step 3: Avoid unsafe assumptions
Skipping checks or reading only one cell risks test failures or incomplete coverage.Final Answer:
Use iter_rows with values_only=True and check if each cell is None before using -> Option AQuick Check:
Check None in cells to avoid errors [OK]
- Ignoring empty cells causing test crashes
- Reading only one cell missing data
- Converting to CSV losing Excel features
Ready to prove it?
Pass the test and this pattern moves unknown
