Authentication testing in Testing Fundamentals - Build an Automation Script
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 import unittest class TestAuthentication(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get('https://example.com/login') self.wait = WebDriverWait(self.driver, 10) def test_valid_and_invalid_login(self): driver = self.driver wait = self.wait # Valid login email_input = wait.until(EC.visibility_of_element_located((By.ID, 'email'))) email_input.clear() email_input.send_keys('validuser@example.com') password_input = driver.find_element(By.ID, 'password') password_input.clear() password_input.send_keys('ValidPass123') login_button = driver.find_element(By.ID, 'login-button') login_button.click() # Wait for dashboard URL wait.until(EC.url_contains('/dashboard')) self.assertIn('/dashboard', driver.current_url, 'Dashboard URL not loaded after valid login') # Log out to return to login page logout_button = wait.until(EC.element_to_be_clickable((By.ID, 'logout-button'))) logout_button.click() wait.until(EC.url_contains('/login')) # Invalid login email_input = wait.until(EC.visibility_of_element_located((By.ID, 'email'))) email_input.clear() email_input.send_keys('invaliduser@example.com') password_input = driver.find_element(By.ID, 'password') password_input.clear() password_input.send_keys('WrongPass') login_button = driver.find_element(By.ID, 'login-button') login_button.click() # Verify error message error_message = wait.until(EC.visibility_of_element_located((By.ID, 'error-message'))) self.assertEqual(error_message.text, 'Invalid email or password', 'Error message text mismatch') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
The setUp method opens the browser and navigates to the login page before each test.
In test_valid_and_invalid_login, we first enter valid credentials and click login. We wait explicitly for the dashboard URL to load and assert the URL contains '/dashboard'.
Then we log out by clicking the logout button and wait to return to the login page.
Next, we enter invalid credentials and click login. We wait for the error message element to appear and assert its text matches the expected error.
The tearDown method closes the browser after the test finishes.
Explicit waits ensure the test waits for elements or page changes before interacting or asserting, making the test stable.
Using IDs for locators keeps selectors simple and reliable.
Now add data-driven testing with 3 different sets of credentials: one valid, two invalid.