Accessibility Testing for Mobile Applications
VoiceOver on iPhone reads the button as "Button" instead of "Add to Cart" — because the UIImageView with the shopping cart icon has no accessibilityLabel set. A visually impaired user taps blindly. This is not a theoretical scenario: 2.2 billion people have visual impairments, and Apple/Google have started rejecting applications with severe Accessibility violations during review.
Most Common Issues
Missing or incorrect accessibilityLabels. Custom components—sliders, custom buttons, icons without text—lack automatic labels. VoiceOver reads coordinates or class names. On iOS, you must explicitly set accessibilityLabel and accessibilityHint. On Android—contentDescription in XML or through ViewCompat.setAccessibilityDelegate.
Incorrect focus management. After closing a modal, VoiceOver/TalkBack focus remains on non-existent elements—the user becomes disoriented. On iOS, manage through UIAccessibility.post(notification: .screenChanged, argument: targetView). On Android—ViewCompat.setAccessibilityPaneTitle and sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED).
Insufficient touch targets. Apple HIG requires minimum 44×44 pt. Google Material requires 48×48 dp. Icons at 24dp with minimal padding are a common mistake. Users with motor impairments cannot tap accurately.
Text contrast. WCAG 2.1 Level AA requires 4.5:1 for normal text and 3:1 for large text (18pt+). Gray text on light backgrounds, popular in placeholders and captions, often falls below standards.
Testing Tools
Accessibility Inspector (Xcode). Launch through Xcode → Open Developer Tool → Accessibility Inspector. Audit with one click—finds missing labels, insufficient touch targets, contrast issues. Works on simulator and real devices.
Accessibility Scanner (Android). Google's app scans the screen and reports problems with classification by type. Integrates into Espresso through AccessibilityChecks.enable()—automatically runs checks with each test action:
@Before
fun setup() {
AccessibilityChecks.enable()
.setRunChecksFromRootView(true)
}
Every Espresso test now includes a11y checks—any violation fails the test.
Manual testing with VoiceOver/TalkBack. Run key scenarios: registration, purchase, main user flows—only through screen reader gestures, without visual control. This reveals semantic issues automation won't catch: logical element reading order, unclear label wording, lost focus.
axe DevTools Mobile. Commercial tool with detailed WCAG violation classification. Provides reports with severity levels and specification links. Useful for EU Accessibility Act compliance preparation.
Testing Matrix
| Issue | Automated Test | Manual Test |
|---|---|---|
| Missing accessibilityLabel | Accessibility Scanner / Inspector | VoiceOver |
| Incorrect focus order | — | VoiceOver / TalkBack |
| Touch target < 44pt/48dp | Accessibility Inspector | — |
| Contrast | Colour Contrast Analyser | — |
| Animations on reduce motion | — | Settings → Accessibility |
Workflow
Audit through Accessibility Inspector and Scanner—get a prioritized violation list. Add AccessibilityChecks.enable() to Espresso tests. Run key scenarios manually with VoiceOver and TalkBack. Final report classified by WCAG 2.1 (A/AA) with recommendations.
Timeline—2–3 days for average project. For EU Accessibility Act compliance—full documentation adds 1–2 days.







