[ Documentation ]
Maestro suites

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:

terminal
rnx open 8081
rnx maestro test .maestro/login.yaml
rnx maestro test .maestro/

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

terminal
rnx maestro init

scaffolds .maestro/login.yaml with a runnable starter flow (launch, tap, type, assert).

What’s supported

The compat matrix is built in:

terminal
rnx maestro --list-compat

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:

terminal
rnx maestro --env USERNAME=alice test .maestro/login.yaml

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:

symptomfix
selector not foundread 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 simstart the dev server, then rnx open <port>; rnx list should show a connected sim before you run flows
a verb errors as unsupportedrnx maestro --list-compat for the matrix; device-hardware verbs (travel, setLocation) fail loudly by design
step typed the string undefinedit did not: an undefined ${NAME} fails the step; pass it with --env NAME=value
assertion runs before the UI settlesprefer waitFor / extendedWaitUntil on the condition over fixed sleeps

Recordings

Add --preview and the run records itself and uploads a recording to a preview link:

terminal
rnx maestro test .maestro/checkout.yaml --preview

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.

Next