Screenshot on failure in Selenium Python - Build an Automation Script
import unittest import time 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 selenium.common.exceptions import TimeoutException class TestLoginScreenshotOnFailure(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://example.com/login') self.wait = WebDriverWait(self.driver, 10) def test_invalid_login_screenshot_on_failure(self): driver = self.driver try: email_input = self.wait.until(EC.presence_of_element_located((By.ID, 'email'))) email_input.clear() email_input.send_keys('wronguser@example.com') password_input = driver.find_element(By.ID, 'password') password_input.clear() password_input.send_keys('wrongpassword') login_button = driver.find_element(By.ID, 'loginBtn') login_button.click() # Wait for error message error_msg = self.wait.until(EC.visibility_of_element_located((By.ID, 'errorMsg'))) # Assert error message is displayed self.assertTrue(error_msg.is_displayed(), 'Error message should be visible') except (AssertionError, TimeoutException) as e: timestamp = time.strftime('%Y%m%d-%H%M%S') screenshot_name = f'screenshot_failure_{timestamp}.png' driver.save_screenshot(screenshot_name) raise e def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
This test uses unittest and Selenium WebDriver for Python.
setUp: Opens the browser and navigates to the login page.
test_invalid_login_screenshot_on_failure: Enters invalid credentials, clicks login, and waits for the error message.
If the error message is not visible or any assertion fails, it catches the exception, takes a screenshot with a timestamped filename, and then re-raises the error to fail the test.
tearDown: Closes the browser after the test.
This approach ensures that if the test fails, you get a screenshot to help understand what went wrong.
Now add data-driven testing with 3 different invalid login inputs to verify screenshots on each failure
Practice
Solution
Step 1: Understand the role of screenshots in testing
Screenshots help testers see what the user saw when the test failed.Step 2: Identify the purpose of capturing screenshots on failure
They provide visual evidence to debug UI problems quickly.Final Answer:
To capture the current state of the web page for debugging -> Option AQuick Check:
Screenshot on failure = capture page state [OK]
- Thinking screenshots speed up tests
- Believing screenshots fix errors automatically
- Confusing screenshots with performance tools
Solution
Step 1: Recall Selenium Python screenshot method
The correct method to save a screenshot issave_screenshot().Step 2: Verify method names and syntax
Onlydriver.save_screenshot('error.png')matches Selenium's API.Final Answer:
driver.save_screenshot('error.png') -> Option AQuick Check:
Correct method name = save_screenshot [OK]
- Using camelCase instead of snake_case
- Using non-existent methods like capture or screenshotSave
- Missing parentheses or quotes
try:
driver.find_element(By.ID, 'submit').click()
except Exception as e:
driver.save_screenshot('fail.png')
print('Screenshot saved on failure')Solution
Step 1: Analyze try-except behavior on element not found
If element is missing, exception triggers except block.Step 2: Check actions in except block
Screenshot is saved and message printed: 'Screenshot saved on failure'.Final Answer:
Screenshot saved on failure -> Option DQuick Check:
Exception triggers screenshot and print [OK]
- Assuming test passes silently on failure
- Confusing syntax errors with runtime exceptions
- Ignoring the print statement inside except
try:
driver.find_element(By.NAME, 'login').click()
except:
driver.save_screenshot(failure.png)Solution
Step 1: Check save_screenshot argument syntax
Filename must be a string in quotes, but here it is unquoted.Step 2: Confirm exception handling and method name
Except syntax and method name are correct; only filename is wrong.Final Answer:
Missing quotes around filename in save_screenshot -> Option CQuick Check:
Filename must be a string in quotes [OK]
- Forgetting quotes around filename string
- Changing method name incorrectly
- Misusing except syntax
Solution
Step 1: Understand when to take screenshots
Screenshots should be taken only on failure, inside except block.Step 2: Use timestamp for unique filenames
Usingtime.time()in filename ensures unique screenshot names.Final Answer:
Use try-except around test steps, call driver.save_screenshot(f"fail_{time.time()}.png") in except -> Option BQuick Check:
Screenshot on failure with timestamp = try-except + formatted filename [OK]
- Taking screenshots before test steps always
- Saving screenshots outside exception handling
- Retrying tests without capturing failure screenshots
Ready to prove it?
Pass the test and this pattern moves unknown
