Skip to content

Support restricting by_role queries by accessible name - #18

Merged
ealmloff merged 7 commits into
DioxusLabs:mainfrom
hovinen:support-accessible-name-with-by-role
Sep 4, 2026
Merged

Support restricting by_role queries by accessible name#18
ealmloff merged 7 commits into
DioxusLabs:mainfrom
hovinen:support-accessible-name-with-by-role

Conversation

@hovinen

@hovinen hovinen commented Aug 17, 2026

Copy link
Copy Markdown
Collaborator

This adds a method having_name to QueryByRole and makes that visible to library consumers. It implements the
W3C accessible name algorithm to obtain the accessible name.

Thus this adds support for the equivalent of getByRole(<role>, {name: "<name>"}) from Playwright.

To do this, this introduces a new module query::aria_tree which implements a very rudimentary subset of the W3C spec for accessible name. The implementation is limited by what the build_accessibility_tree method in Blitz can do. It already suffices for some basic use cases, though.

I could not find another usable implementation of the W3C spec; otherwise I would have used that.

This PR builds on top of #17.

Previously, effects would not execute and cause re-rendering of the DOM
after the initial render or after processing an event. As a result, a
test would have to run ane extra `pump()` in some cases, expecially when
an effect performed some kind of initialization which an event handler
needs to run correctly. This is not the best developer experience.

This adds some calls to both the initial render and the event handler so
that effects are processed and the DOM re-rendered based on those. The
tests then get a more stable state after each DOM interaction.

This modifies two of the doctests to make the event handlers (which were
claimed to be asynchronous but actually fall under the above rule) truly
asynchronous.
Previously, tests would have to invoke `build()` on `DocumentTester` to
trigger the initial DOM render before they could interact with the DOM.
This is easy to forget and can lead to confusion.

This makes the call to `build()` implicit and changes the method to be
private. Tests can now interact with `DocumentTester` immediately after
invoking `render()`.
This uses a new function `synthetic_form_event` in the dioxus-native-dom
crate to generate the event data. It works analogously to the existing
`click()` method.
This adds a method `having_name` to `QueryByRole` and makes that visible
to library consumers. It implements the
[W3C accessible name algorithm](https://w3c.github.io/aria/accname/#computation-steps)
to obtain the accessible name.

Thus this adds support for the equivalent of
`getByRole(<role>, {name: "<name>"})` from Playwright.

To do this, this introduces a new module `query::aria_tree` which
implements a very rudimentary subset of the
[W3C spec](https://w3c.github.io/aria/accname/#computation-steps) for
accessible name. The implementation is limited by what the
`build_accessibility_tree` method in Blitz can do. It already suffices
for some basic use cases, though.

I could not find another usable implementation of the W3C spec; otherwise
I would have used that.
@ealmloff
ealmloff merged commit 7f48732 into DioxusLabs:main Sep 4, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants