Why evidence collection supports debugging in Selenium Python - Automation Benefits in Action
import unittest import os from datetime import datetime 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 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, 'login-btn') self.error_message = (By.ID, 'error-msg') def enter_username(self, username): self.driver.find_element(*self.username_input).clear() self.driver.find_element(*self.username_input).send_keys(username) def enter_password(self, password): self.driver.find_element(*self.password_input).clear() self.driver.find_element(*self.password_input).send_keys(password) def click_login(self): self.driver.find_element(*self.login_button).click() def get_error_message_text(self): return self.driver.find_element(*self.error_message).text class TestLogin(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.get('https://example.com/login') self.wait = WebDriverWait(self.driver, 10) self.login_page = LoginPage(self.driver) if not os.path.exists('evidence'): os.makedirs('evidence') def tearDown(self): self.driver.quit() def save_evidence(self, name_prefix): timestamp = datetime.now().strftime('%Y%m%d_%H%M%S') screenshot_path = f'evidence/{name_prefix}_screenshot_{timestamp}.png' page_source_path = f'evidence/{name_prefix}_page_source_{timestamp}.html' self.driver.save_screenshot(screenshot_path) with open(page_source_path, 'w', encoding='utf-8') as f: f.write(self.driver.page_source) def test_invalid_login_shows_error(self): self.login_page.enter_username('wronguser') self.login_page.enter_password('wrongpass') self.login_page.click_login() try: error_element = self.wait.until(EC.visibility_of_element_located(self.login_page.error_message)) error_text = error_element.text self.assertEqual(error_text, 'Invalid credentials') except Exception as e: self.save_evidence('invalid_login_failure') raise e if __name__ == '__main__': unittest.main()
This test script automates the manual test case to verify the error message on invalid login.
LoginPage class: Encapsulates element locators and actions for the login page, following the Page Object Model for maintainability.
TestLogin class: Sets up the browser, navigates to the login page, and runs the test.
The test enters wrong credentials, clicks login, and waits explicitly for the error message to appear.
If the error message is not found or text does not match, the test catches the exception, saves a screenshot and page source with a timestamped filename in an 'evidence' folder, then re-raises the exception to fail the test.
This evidence collection helps debugging by preserving the exact page state when the failure happened.
Now add data-driven testing with 3 different invalid username/password combinations