- element-based taps
- visibility assertions
Selector resolution
If a target string has no prefix, visor treats it as an accessibility identifier. Example:Supported selector prefixes
| Prefix | Meaning | Notes |
|---|---|---|
accessibility= | Accessibility identifier | Default when no prefix is present |
id= | Element id | Uses the driver id selector |
text= | Exact text match | Implemented as XPath equality across multiple common text-like attributes |
text~= | Contains-style text match | Use when merged or multi-line semantics need substring matching |
first-in-section= | First tappable item below a section heading | Mapped execution only |
xpath= | Raw XPath | Most flexible and most fragile |
uiautomator= | Android UiSelector expression | Android only |
predicate= | iOS predicate string | iOS only |
classchain= | iOS class chain query | iOS only |
How text= works
text= performs an exact match against common text-like attributes.
Visor builds an XPath selector that checks whether the provided value equals any of these attributes:
textcontent-desclabelnamevalue
text~= when you intentionally want substring matching across those same attributes. In mapped execution, broad numeric contains targets such as text~=$100 are only treated as live/current-screen taps; they are not used to route to an off-screen destination.
Section-relative mapped targets
Usefirst-in-section= when the request is relative to a visible section rather than a specific label.
Example:
See all controls, bottom navigation, back controls, static text, images, form fields, and hidden or zero-size elements.
Choosing the right selector type
Use selectors in this order when possible:- accessibility identifiers
- stable ids
- platform-specific selectors
- XPath
- coordinates
Coordinate taps
Coordinates are appropriate when:- there is no reliable selector
- the target is a canvas-like region or custom-drawn control
- you need a specific screen location rather than an element
| Mode | Example | Meaning |
|---|---|---|
| Absolute | x=120, y=640 | Raw screen coordinates |
| Normalized | x=0.91, y=0.94, normalized=true | Fraction of current screen width and height |
Assertion targets use the same syntax
Thevisible assertion uses the same target parser as tap.
That means these assertion targets are valid:
Incrementaccessibility=Incrementtext=Checkouttext~=Settingsid=primary-ctaxpath=//*[@text='Checkout']uiautomator=new UiSelector().text("OK")predicate=label == 'Done'classchain=**/XCUIElementTypeButton[`label == "Done"`]
Known tradeoffs
Important tradeoffs in the current selector system:- plain text defaults to accessibility ids, not visible text
text~=is intentionally broad and may over-matchfirst-in-section=needs mapped execution and source geometry for the section item- XPath is flexible but tends to be the least stable option
- coordinate taps are sensitive to layout shifts and device differences