Maestro suites
rnx maestro is a drop-in for the real maestro CLI: swap the binary
name and your .maestro/ directory runs against rnx’s in-browser engine.
No Xcode, no .app, no simulator.
Run your existing flows
Start your app’s dev server, open it in rnx, then point the runner at a flow or a directory:
Directory runs mirror Maestro’s workspace behavior: config.yaml discovery,
flows: inclusion globs, and includeTags / excludeTags against each
flow’s frontmatter tags. A multi-flow run prints a per-flow pass/fail summary
and exits nonzero when any flow fails, so CI can gate on the exit code.
Start from scratch
scaffolds .maestro/login.yaml with a runnable starter flow (launch, tap,
type, assert).
What’s supported
The compat matrix is built in:
Supported verbs include tapOn, longPressOn, inputText, assertVisible,
assertNotVisible, waitFor, extendedWaitUntil, scroll,
scrollUntilVisible, swipe, takeScreenshot, repeat, runFlow,
runScript (Maestro JS with http, output, env vars), evalScript,
copyTextFrom, openLink, when: conditions, and ${...} JS-expression
interpolation at step time. Verbs that only make sense on a physical device
(travel, setLocation, setAirplaneMode) fail loudly rather than
pretending to work.
Env interpolation seeds from your full shell environment, and a bare
${NAME} that is undefined fails the step instead of typing the string
undefined into your app:
When a step fails
The runner captures a per-failure bundle next to your run, named by the failing step: a screenshot, the rendered tree, the accessibility tree, console output, and the error. That is usually enough to fix a selector without re-running anything.
The common failures and their fastest fixes:
| symptom | fix |
|---|---|
| selector not found | read the tree in the failure bundle, or rnx describe against the live sim; match on testID over display text where you can |
| ”could not connect” / no sim | start the dev server, then rnx open <port>; rnx list should show a connected sim before you run flows |
| a verb errors as unsupported | rnx maestro --list-compat for the matrix; device-hardware verbs (travel, setLocation) fail loudly by design |
step typed the string undefined | it did not: an undefined ${NAME} fails the step; pass it with --env NAME=value |
| assertion runs before the UI settles | prefer waitFor / extendedWaitUntil on the condition over fixed sleeps |
Recordings
Add --preview and the run records itself and uploads a recording to a preview
link:
The command prints a /preview/<id> link where anyone on your team can watch
the recording and scrub through every step. Runs that uploaded a recording (and
every run in CI) are also registered in your
dashboard with pass/fail, duration, and a
per-step trace.