Skip to main content
Momentic is a managed testing platform for iOS and Android. Tests are YAML, executed on managed remote emulators and simulators. A multi-modal step cache stores locator metadata per step and auto-heals in place when the UI changes. AI primitives cover action, assertion, visual diff, and typed extraction. AI providers route with cross-provider failover. A dashboard captures run videos, view hierarchies, heal events, and AI reasoning. Maestro is an open-source mobile UI automation framework from mobile.dev. Tests are YAML flows that drive the device through its accessibility layer. It’s well-suited to fully-scripted test suites where the app team owns stable resource IDs and there’s a hard requirement for an OSS CLI with no SaaS dependency. AI features (assertWithAI, assertNoDefectsWithAI, extractTextWithAI) are experimental commands that wrap a customer-supplied LLM.

Speed and caching

How the multi-modal cache works

A cached step stores more than one way to find the target: where it sits on screen, what it looks like, what text it contains, and the accessibility and structural attributes around it. Which of those signals matters for a given step is inferred from the natural-language description. “The red Cancel button below the Order Summary header” leans on visual and positional signals; “the Sign in button” leans on accessibility and text. When a step replays, the runner checks the stored signals against the live UI and runs the action without invoking the LLM when there’s a match.

What happens on a UI change

A practical sequence that shows the difference. Take a mobile sign-in screen with an email_input resource ID, after a passing baseline run where the cache is warm. Refactor: the app team renames email_input to email_field and changes the surrounding container hierarchy. Maestro replay:
  1. tapOn: { id: "email_input" } retries against the device for ~5s.
  2. The retry window elapses with no match. The step fails.
  3. The test stops; the CI job fails. Someone edits the YAML to use the new ID or switches the selector to a text match, opens a PR, gets it merged, and re-runs CI.
Momentic replay:
  1. The cached locator for the Email step misses on the live UI.
  2. The locator agent re-resolves the original natural-language description Email.
  3. The new locator binds, the step runs, the test passes.
  4. The cache entry is updated in place. A heal event is attached to the run for review. Subsequent runs hit the cache normally.
Across a test suite, a renamed ID or a localized string requires no test edits in Momentic but a manual PR in Maestro.
Selector commands have a default ~5s retry window with animation tolerance. WebViews require app-side debug enablement; XHR is not tracked. Long flows reach for extendedWaitUntil { visible: ..., timeout: ... }.

Locators and AI primitives

Momentic mobile step types
  • Action: act, tap, doubleTap, longPress, type, swipe, scroll, back, dismissKeyboard, launchApp, terminateApp
  • Assert: assert, assertVisually, checkElement<...>
  • Extract: extract (typed via JSON schema)
  • Control flow: if/then, modules, parameter inputs
Maestro assertWithAI default (source)
Since assertWithAI is an experimental feature, optional is set to true by default to prevent unstable AI responses from breaking your CI/CD pipelines. If you want a failed AI assertion to stop the test, you must explicitly set optional: false.
In practice this means a team that wants AI assertions to actually fail the test has to remember optional: false on every call site, with no project-level default.

Recovery, quarantine, and CI

  • Default: quarantined tests run, results report, exit code unaffected.
  • --skip-quarantined: skipped entirely.
  • --only-quarantined: only quarantined tests run; statuses affect exit code.

Authoring side-by-side

If email_input is renamed or "Sign in" is localized, the YAML breaks until someone edits it. Agentic simplified format:
Explicit simplified format (same flow, step-by-step):

A more realistic test

The hello-world above doesn’t show the full simplified format surface. A representative onboarding regression with module reuse, parameter inputs, typed extraction, and a conditional looks like this:
onboarding.test.yaml
The matching module:
../modules/sign-in.module.yaml

When to pick which

Maestro is the right call if you have a small fully-scripted test suite, your app team maintains stable resource IDs the test relies on, you have a hard requirement for physical hardware in the CLI, or you need an OSS framework with no SaaS dependency. Momentic is the right call if wall-clock run time matters at scale, your test suite is large enough that selector maintenance is a real recurring cost, you want AI assertions that fail the test by default, and you expect healing, recovery, quarantine, sub-second emulator boots, and run videos built in. For the build-it-yourself version of this decision, see Build vs. buy.