Accessibility 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 LoginPageAccessibilityTest(unittest.TestCase): def setUp(self): self.driver = webdriver.Chrome() self.wait = WebDriverWait(self.driver, 10) self.driver.get('https://example.com/login') def test_accessibility(self): driver = self.driver wait = self.wait # Wait for email input and check label email_input = wait.until(EC.visibility_of_element_located((By.ID, 'email'))) email_label = driver.find_element(By.CSS_SELECTOR, 'label[for="email"]') self.assertTrue(email_label.is_displayed(), 'Email label is not displayed') self.assertTrue(email_label.text.strip() != '', 'Email label text is empty') # Wait for password input and check label password_input = wait.until(EC.visibility_of_element_located((By.ID, 'password'))) password_label = driver.find_element(By.CSS_SELECTOR, 'label[for="password"]') self.assertTrue(password_label.is_displayed(), 'Password label is not displayed') self.assertTrue(password_label.text.strip() != '', 'Password label text is empty') # Check login button accessible name (aria-label or text) login_button = wait.until(EC.visibility_of_element_located((By.ID, 'login-button'))) accessible_name = login_button.get_attribute('aria-label') or login_button.text self.assertTrue(accessible_name.strip() != '', 'Login button accessible name is empty') # Check images have alt attribute images = driver.find_elements(By.TAG_NAME, 'img') for img in images: alt_text = img.get_attribute('alt') self.assertIsNotNone(alt_text, 'Image missing alt attribute') self.assertTrue(alt_text.strip() != '', 'Image alt attribute is empty') # Keyboard navigation test # Focus email input email_input.click() self.assertEqual(driver.switch_to.active_element, email_input, 'Focus is not on email input') # Press Tab to move focus to password input from selenium.webdriver.common.keys import Keys email_input.send_keys(Keys.TAB) self.assertEqual(driver.switch_to.active_element, password_input, 'Focus did not move to password input') # Press Tab to move focus to login button password_input.send_keys(Keys.TAB) self.assertEqual(driver.switch_to.active_element, login_button, 'Focus did not move to login button') def tearDown(self): self.driver.quit() if __name__ == '__main__': unittest.main()
This test script uses Selenium with Python's unittest framework to automate accessibility checks on a login page.
First, it opens the login page URL in a Chrome browser.
It waits explicitly for the email and password input fields to be visible, then finds their associated labels using the for attribute. It asserts that these labels are visible and have text, ensuring screen readers can announce them.
Next, it checks the login button for an accessible name, either from the aria-label attribute or visible text.
It then verifies all images on the page have non-empty alt attributes, which is important for screen readers.
For keyboard navigation, it simulates tabbing through the email input, password input, and login button, asserting that the focus moves logically and is on the expected element.
The test uses explicit waits to avoid timing issues and semantic locators like By.ID and By.CSS_SELECTOR for maintainability.
Finally, the browser closes after the test.
Now add data-driven testing with 3 different login page URLs to verify accessibility on multiple environments.
Practice
Solution
Step 1: Understand the purpose of accessibility testing
Accessibility testing focuses on making websites usable for everyone, including people with disabilities.Step 2: Compare options to the goal
Only To ensure the website is usable by people with disabilities matches this goal, while others focus on unrelated aspects like speed or content.Final Answer:
To ensure the website is usable by people with disabilities -> Option CQuick Check:
Accessibility testing = usability for all [OK]
- Confusing accessibility with performance optimization
- Thinking accessibility means adding more content
- Ignoring users with disabilities
Solution
Step 1: Identify attribute for image description
Thealtattribute provides text descriptions for images, helping screen readers.Step 2: Check other attributes
titleshows tooltips,srcis image source,hrefis for links, none describe images for accessibility.Final Answer:
alt -> Option AQuick Check:
Image description attribute = alt [OK]
- Using title instead of alt for image description
- Confusing src with description
- Missing alt attribute entirely
<button>Click me</button>
Which accessibility improvement is best?
Solution
Step 1: Understand button accessibility
Buttons need clear labels for screen readers; addingaria-labelclarifies purpose.Step 2: Evaluate other options
Empty text or removing button removes meaning; styling alone doesn't improve accessibility.Final Answer:
Add aria-label="Submit button" to the button -> Option BQuick Check:
Use aria-label for clear button description [OK]
- Leaving buttons unlabeled
- Removing interactive elements
- Relying only on visual styles
Solution
Step 1: Understand tabindex effect on keyboard navigation
Atabindex="-1"removes the element from keyboard focus order, so users can't tab to it.Step 2: Check other options
Visible label, submit type, and color contrast do not block keyboard focus.Final Answer:
The button has tabindex="-1" -> Option AQuick Check:
tabindex="-1" blocks keyboard focus [OK]
- Confusing label visibility with focusability
- Ignoring tabindex attribute effects
- Assuming color affects keyboard navigation
Solution
Step 1: Understand color contrast testing methods
Automated tools quickly check contrast ratios, but manual testing ensures real user experience.Step 2: Evaluate other options
Relying only on tools misses context; ignoring contrast or random colors do not ensure accessibility.Final Answer:
Use an automated color contrast checker and manually verify with users -> Option DQuick Check:
Combine automated and manual checks for best results [OK]
- Trusting only automated tools
- Ignoring contrast for large text
- Testing colors without standards
Ready to prove it?
Pass the test and this pattern moves unknown
