import unittest
import csv
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
class TestLoginWithCSV(unittest.TestCase):
def setUp(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.wait = WebDriverWait(self.driver, 10)
def test_login_from_csv(self):
driver = self.driver
wait = self.wait
driver.get('https://example.com/login')
with open('login_data.csv', newline='') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
username = row['username']
password = row['password']
# Enter username
username_field = wait.until(EC.visibility_of_element_located((By.ID, 'username')))
username_field.clear()
username_field.send_keys(username)
# Enter password
password_field = wait.until(EC.visibility_of_element_located((By.ID, 'password')))
password_field.clear()
password_field.send_keys(password)
# Click login button
login_button = wait.until(EC.element_to_be_clickable((By.ID, 'loginBtn')))
login_button.click()
# Verify URL changed to dashboard
wait.until(EC.url_to_be('https://example.com/dashboard'))
self.assertEqual(driver.current_url, 'https://example.com/dashboard')
# Verify logout button is clickable
logout_button = wait.until(EC.element_to_be_clickable((By.ID, 'logoutBtn')))
self.assertTrue(logout_button.is_displayed())
# Click logout to prepare for next test
logout_button.click()
# Wait for login page to load again
wait.until(EC.visibility_of_element_located((By.ID, 'username')))
def tearDown(self):
self.driver.quit()
if __name__ == '__main__':
unittest.main()This test script uses Python's unittest framework and Selenium WebDriver.
In setUp, we open the browser and prepare a wait object for explicit waits.
The test test_login_from_csv reads the CSV file using Python's csv.DictReader to get username and password pairs.
For each row, it:
- Waits for username and password fields to be visible, clears them, and enters the data.
- Waits for the login button to be clickable and clicks it.
- Waits until the URL changes to the dashboard URL and asserts it is correct.
- Waits for the logout button to be clickable and asserts it is displayed.
- Clicks logout to return to the login page for the next iteration.
Finally, tearDown closes the browser after all tests.
This approach uses explicit waits to avoid timing issues and reads test data cleanly from CSV, making the test easy to maintain and extend.