Testing with screen readers
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.
Enabling the accessibility layer (WASM)
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
AutoEnableAccessibility materializes 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 in App.xaml.cs before MainWindow is 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.
Browser and screen reader pairing (WASM)
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. |
Using the SamplesApp
The AccessibilityScreenReaderPage sample in the Uno SamplesApp includes test sections for common control types:
- Build and run the SamplesApp (
SamplesApp.Skia.Generic) - Navigate to the
Accessibility_ScreenReadersample - Enable your screen reader and Tab into the app
- On WASM, activate the "Enable accessibility" button first
Debugging the accessibility tree
WASM — inspecting the semantic DOM
On 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:
- Chrome: DevTools → Elements → Accessibility pane (right sidebar)
- Firefox: DevTools → Accessibility tab
- Safari: Develop → Show Web Inspector → Elements → Node → Accessibility
Common issues
| 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 |