Every feature on every kind of application
What each case of the shared contract said on each kind of application, as SPART-Desk's own contract runs last saw
it. Each run drives one application of its kind, carrying the same form, tree, list and dialog (and, with --more,
the same further controls); app-coverage.md rates the kinds of application as a whole. This page
is rendered from those runs, and a run on one application updates its column.
| Mark | Meaning |
|---|---|
| ✓ | passes |
| ✓ˢ | passes, with a control found on the screen (read text or a picture) rather than in an accessibility tree |
| gap | not done by SPART-Desk on this kind of application: the application gives what it would need |
| limit | the application gives nothing to do it with, and SPART-Desk says so: it refuses at once, or says why it found nothing |
| silent | the application gives nothing to do it with, in a way SPART-Desk cannot tell (a wrong state, input it ignores) |
| n/a | the application has no such control |
| ✗ | failed |
| ! | passed, though declared a gap, a limit or silent: the case should not run here |
| (blank) | not run |
Summary
| Application | ✓ | gap | limit | silent | n/a | ✗ | ! | not run | Last run |
|---|---|---|---|---|---|---|---|---|---|
| Win32 | 86 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 2026-11-03 |
| Win32 (RichEdit20W) | 84 | 0 | 0 | 0 | 1 | 0 | 0 | 2 | 2026-10-30 |
| VCL | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| VCL (32-bit) | 84 | 0 | 1 | 0 | 0 | 0 | 0 | 2 | 2026-11-02 |
| WinForms | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| WinForms .NET 10 | 85 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 2026-10-30 |
| Krypton | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| WPF | 85 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 2026-11-03 |
| WPF suite | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| WinUI 3 | 84 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 2026-11-03 |
| WinUI 3 (packaged) | 82 | 0 | 0 | 0 | 3 | 0 | 0 | 2 | 2026-11-02 |
| MAUI | 68 | 0 | 2 | 0 | 17 | 0 | 0 | 0 | 2026-11-03 |
| Avalonia | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Qt | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Qt Quick | 77 | 0 | 2 | 0 | 8 | 0 | 0 | 0 | 2026-11-03 |
| wx | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Tk | 82 | 0 | 5 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Swing | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Swing (Java 8, 32-bit) | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-02 |
| JavaFX | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| SWT | 86 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| Electron | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| CEF | 87 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2026-11-03 |
| WebView2 | 84 | 0 | 0 | 0 | 3 | 0 | 0 | 0 | 2026-11-04 |
| IE WebBrowser | 84 | 0 | 1 | 0 | 2 | 0 | 0 | 0 | 2026-11-03 |
| Flutter | 68 | 0 | 13 | 0 | 6 | 0 | 0 | 0 | 2026-11-03 |
| React Native (Windows) | 66 | 0 | 0 | 0 | 19 | 0 | 0 | 2 | 2026-11-03 |
A form
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
form.submit getByLabel · fill · selectOption · check · click | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.value toHaveValue · textContent | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.clear clear | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.type pressSequentially | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.key press(key) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.chord press(chord) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.focus focus · toBeFocused · isFocused | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.check check · uncheck · toBeChecked · isChecked | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.set-checked setChecked | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.option selectOption · toHaveValue | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
form.state toBeVisible · toBeEnabled · isEnabled · toHaveCount(0) · toBeHidden | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | ✓ |
form.read toHaveText · toContainText · textContent | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
- ¹ Flutter: a disabled Flutter button does not report itself disabled
Saying which control
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
loc.and and | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
loc.or or | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
loc.filter filter({ hasText }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
loc.relative rightOf | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | ✓ |
loc.string locator('role=…[name=…]') | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
loc.automation-id getByAutomationId | ✓ | ✓ | limit² | limit² | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | limit³ | limit⁴ | limit⁵ | limit⁶ | limit⁶ | limit⁷ | limit⁸ | ✓ | ✓ | ✓ | ✓ | limit⁹ | ✓ |
loc.image screenshot · getByImage | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ |
- ¹ Flutter: a Flutter text field's label is drawn inside it: no text lies to its left
- ² VCL, VCL (32-bit): VCL gives every window its own handle as its control id, new from run to run: no identifier stays
- ³ Qt, Qt Quick: Qt reports a label whose accessible name is set by that name alone: its text shows only on the screen
- ⁴ wx: wxWidgets gives the status line no identifier of its own
- ⁵ Tk: Tk 9.0 shows UI Automation nothing: a painted widget has no role, state or value to read
- ⁶ Swing, Swing (Java 8, 32-bit): the Java Access Bridge gives a control no identifier
- ⁷ JavaFX: JavaFX reports no node's id as its AutomationId: the status line's id is set, and not seen
- ⁸ SWT: SWT gives a control no identifier of its own
- ⁹ Flutter: Flutter's semantics give a widget no identifier
The window's input devices
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
input.keyboard window.keyboard.type · press | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
input.mouse window.mouse.click · move · down · up | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
input.touchscreen window.touchscreen.tap | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
input.tap tap | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
input.pen window.pen.tap | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
A modal dialog
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
modal.answer click a dialog's button | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
modal.wait-for waitFor · waitFor({ state: hidden }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
modal.window waitForWindow · toHaveTitle | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | n/a¹ | n/a¹ | n/a¹ | ✓ | ✓ | n/a¹ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | n/a¹ | n/a¹ |
modal.on-window onWindow | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | n/a¹ | n/a¹ | n/a¹ | ✓ | ✓ | n/a¹ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | n/a¹ | n/a¹ |
modal.close window({ title }).close | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | n/a¹ | n/a¹ | n/a¹ | ✓ | ✓ | n/a¹ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | n/a¹ | n/a¹ |
- ¹ WinUI 3, WinUI 3 (packaged), MAUI, Qt Quick, WebView2, Flutter, React Native (Windows): the modal dialog shows inside the window, with no window of its own
The clipboard
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
clipboard.paste clipboard.writeText · press(Control+V) | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | |||||
clipboard.copy press(Control+C) · clipboard.readText | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
A tree
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
tree.choose expand · click | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | n/a² | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ |
tree.selected isSelected | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | n/a² | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ |
tree.expanded expand · collapse · toBeExpanded | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | n/a² | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ |
tree.items count · allTextContents | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | n/a² | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ |
tree.path tree().node().node() | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | n/a² | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ |
- ¹ MAUI: MAUI has no tree control
- ² Qt Quick: Qt Quick Controls have no tree control
- ³ Flutter: Flutter has no tree: an ExpansionTile reports a text with no tree item role or expand state
A list
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
list.selected isSelected | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.nth first · nth | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.filter filter({ hasText }) · filter({ has }) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.api list() · item().named().find() · toContainItems | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.wheel scroll({ wheel }) · window.mouse.wheel | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.scroll scroll({ direction }) · scroll({ to }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.into-view scrollIntoView | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
list.far-item click, paged into view | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
- ¹ Qt Quick: Qt Quick reports a highlighted list item unselected: only a delegate's Accessible.selected reports the selection
A form with nothing tied to its labels
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
plain.form getByLabel by the text beside · getByText | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ |
plain.select getByLabel(…).selectOption by the text beside | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | n/a² |
plain.near near | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ |
- ¹ Flutter: Flutter reports its drop-down as a button named by its choice, which the label beside it does not name
- ² React Native (Windows): React Native's drop-down is a button named by its value, which the screen's reader does not take for one
Resolution strategies
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
resolution.read read() · getByOcr | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
A control's further properties
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
props.details details | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
props.drop-down-click expand · click an item · closed after | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
- ¹ Tk: Tk 9.0 shows UI Automation nothing: a painted widget has no role, state or value to read
What a pointer pad hears
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
pad.buttons click({ button: middle | back | forward }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
pad.touch tap | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
pad.pen window.pen.tap({ pressure, tilt }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
- ¹ MAUI: the application has no pointer pad
The window
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
window.bounds setBounds · currentBounds | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.title toHaveTitle · currentTitle | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.idle waitForIdle | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.screenshot window.screenshot · locator.screenshot | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.golden toHaveScreenshot · toMatchTreeSnapshot | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.snapshot app.snapshot · window.snapshot | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.recommend candidatesFor · recommended locator | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.min-restore minimize · restore | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.max-restore maximize · restore | n/a¹ | n/a¹ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.front bringToFront | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
window.title-changes toHaveTitle after a change | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a² | n/a³ |
window.close app.close · isOpen | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
- ¹ Win32, Win32 (RichEdit20W): the window cannot be resized, so it cannot be maximized
- ² Flutter: Flutter has no way to rename its window on Windows
- ³ React Native (Windows): React Native has no way to rename its window from JavaScript
Further controls (--more)
| Feature | Win32 | Win32 (RichEdit20W) | VCL | VCL (32-bit) | WinForms | WinForms .NET 10 | Krypton | WPF | WPF suite | WinUI 3 | WinUI 3 (packaged) | MAUI | Avalonia | Qt | Qt Quick | wx | Tk | Swing | Swing (Java 8, 32-bit) | JavaFX | SWT | Electron | CEF | WebView2 | IE WebBrowser | Flutter | React Native (Windows) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
more.radio radio check · toBeChecked | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
more.radio-group group >> radio · toHaveCount · last | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹ | ✓ˢ | ✓ |
more.slider slider fill · toHaveValue | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | limit² | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a⁴ |
more.slider-keys slider press(End) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit⁵ | n/a⁴ |
more.spinner spinbutton fill · toHaveValue | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | n/a⁶ | ✓ | ✓ | ✓ | limit⁷ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a⁸ | n/a⁹ | n/a¹⁰ |
more.spinner-keys spinbutton press(ArrowUp) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | n/a⁶ | ✓ | ✓ | ✓ | limit⁷ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a⁸ | n/a⁹ | n/a¹⁰ |
more.tabs tab click · isSelected | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹¹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
more.menu menuitem click | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹² | n/a¹³ |
more.menu-shortcut window.keyboard.press(shortcut) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹³ |
more.context-menu click({ button: right }) · menuitem click | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹² | n/a¹⁴ |
more.dblclick dblclick | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
more.click-modifiers click({ modifiers }) · click({ position }) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a¹⁵ |
more.hover hover | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ |
more.tooltip hover · tooltip | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | n/a¹⁶ |
more.drag dragTo | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | n/a¹⁷ |
more.mouse-drag window.mouse.drag | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | n/a¹⁷ |
more.disabled toBeDisabled · isEnabled · click times out | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit³ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | limit¹⁸ | ✓ |
more.keys press(Control+Shift+K) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹⁹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
more.function-key press(F2) | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a¹⁹ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
more.grid table().columns · toHaveRowCount | ✓ | ✓ | ✓ˢ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a²⁰ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a²¹ |
more.grid-row row().where().equals().find() · getByColumn · toContainRows | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a²⁰ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a²¹ |
more.grid-select row click | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | n/a²⁰ | ✓ | ✓ | ✓ | ✓ | ✓ˢ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | n/a²¹ |
- ¹ IE WebBrowser: Internet Explorer reports an HTML fieldset as nothing: its legend is a text beside the radio buttons, and no group holds them
- ² Krypton: Krypton paints the control itself: it has no element with a role or a state
- ³ Tk: Tk 9.0 shows UI Automation nothing: a painted widget has no role, state or value to read
- ⁴ React Native (Windows): React Native's core has no slider
- ⁵ Flutter: Flutter's slider takes the arrow keys only
- ⁶ WPF: WPF has no spin box of its own
- ⁷ MAUI: MAUI's Stepper is two buttons, with no spin box and no field
- ⁸ IE WebBrowser: Internet Explorer shows an as a plain text field: there is no spin box
- ⁹ Flutter: Flutter has no spin box widget
- ¹⁰ React Native (Windows): React Native's core has no spin box
- ¹¹ MAUI: a TabbedPage replaces the page: MAUI has no tabs inside one
- ¹² Flutter: a Flutter menu's items are buttons to UI Automation, not menu items
- ¹³ React Native (Windows): React Native has no menu bar
- ¹⁴ React Native (Windows): a right click reaches no React Native for Windows component
- ¹⁵ React Native (Windows): a React Native for Windows press carries no modifier keys
- ¹⁶ React Native (Windows): React Native for Windows' tooltip lies outside the application's accessibility tree
- ¹⁷ React Native (Windows): React Native's core has no drag and drop
- ¹⁸ Flutter: a disabled Flutter button does not report itself disabled
- ¹⁹ MAUI: a MAUI view raises no key events
- ²⁰ MAUI: MAUI has no data grid
- ²¹ React Native (Windows): React Native's core has no data grid