doc/articles/features/accessibility/testing-with-screen-readers.md
[!TIP] For general screen reader setup, navigation shortcuts, and testing methodology, see Accessibility testing (Microsoft Learn).
This guide covers Uno-specific steps for verifying accessibility in your application.
On WASM Skia targets, the accessibility layer activates when the user first presses the Tab key. A visually hidden "Enable accessibility" element becomes reachable via Tab or screen reader — activate it (click, Enter, or Space) before the full semantic tree becomes available.
To activate manually from browser DevTools:
document.getElementById('uno-enable-accessibility').click();
For automated testing scenarios where you need the accessibility layer ready before any user interaction, you can force it on at startup:
FeatureConfiguration.AutomationPeer.AutoEnableAccessibility = true;
[!WARNING]
AutoEnableAccessibilitymaterializes and continuously maintains the full semantic DOM for the lifetime of the app, which has a significant runtime cost (every visual-tree change updates the semantic overlay). It is intended for testing and debugging — leave it disabled in production so the cost is only paid when an assistive technology actually requests accessibility. Set it before the host is built (typically inApp.xaml.csbeforeMainWindowis created); it is read once during accessibility subsystem initialization. [!NOTE] On Windows (Win32) and macOS, the accessibility tree is always active — no manual activation is required.
When testing WASM apps with a screen reader, the browser choice affects results:
| Browser | Screen Reader | Notes |
|---|---|---|
| Chrome | NVDA (Windows) | Best overall support for ARIA in Chromium-based browsers. |
| Firefox | NVDA (Windows) | Good alternative; Firefox has its own accessibility engine. |
| Safari | VoiceOver (macOS) | Best VoiceOver experience. |
| Chrome | VoiceOver (macOS) | Works, but Safari is recommended. Enable Full Keyboard Access in System Settings → Keyboard. |
The AccessibilityScreenReaderPage sample in the Uno SamplesApp includes test sections for common control types:
SamplesApp.Skia.Generic)Accessibility_ScreenReader sampleOn WASM, look for the #uno-semantics-root container in the DOM. It contains hidden semantic overlay elements (buttons, inputs, headings, etc.) that the screen reader interacts with. Each element has aria-label and the appropriate role attribute.
Inspect using browser DevTools:
| Problem | Possible cause | Fix |
|---|---|---|
| Nothing is announced (WASM) | Accessibility layer not activated | Press Tab, then activate the "Enable accessibility" button |
| Wrong label announced | AutomationProperties.Name not set or wrong LabeledBy target | Check aria-label in the semantic DOM |
| Headings not in Rotor | Missing HeadingLevel property | Verify AutomationProperties.HeadingLevel is set; on WASM check for <h1>–<h6> elements |
| Landmarks not listed | Missing LandmarkType property | Verify AutomationProperties.LandmarkType is set; on WASM check for role="navigation" etc. |
| Live region not announcing | LiveSetting not set or content not changing | On WASM, verify aria-live attribute exists on the semantic element |
| VoiceOver silent in Chrome | Known Chrome limitation | Test in Safari for best VoiceOver support; in Chrome, enable Full Keyboard Access in System Settings → Keyboard |