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 drifts. 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 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 (Documentation Index
Fetch the complete documentation index at: https://momentic.ai/docs/llms.txt
Use this file to discover all available pages before exploring further.
assertWithAI, assertNoDefectsWithAI,
extractTextWithAI) are experimental commands that wrap a customer-supplied
LLM.
Speed and caching
| Momentic | Maestro | |
|---|---|---|
| What’s cached | Multi-modal locator data per step (docs). | Nothing. Selectors re-resolve every run. |
| Heal on miss | Re-resolves and updates the entry in place. Heal event on the run. | Not supported. A miss is a test failure. |
| Storage | Managed, git-aware. | N/A. |
| Cost of a UI change | Auto-heal absorbs renamed IDs, localized strings, reordered hierarchies. | One YAML edit per broken selector. |
| Smart waiting | Built-in: navigation, load, screenshots, DOM / view-hierarchy mutations, same-origin requests. 3s default, configurable. | Animation tolerance + extendedWaitUntil. No XHR tracking on WebViews. |
| Per-test execution cap | None. | 15-minute soft limit on Maestro Cloud. |
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 exercises the headline difference. Take a mobile sign-in screen with anemail_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:
tapOn: { id: "email_input" }retries against the device for ~5s.- The retry window elapses with no match. The step fails.
- The test stops; the CI job is red. Someone edits the YAML to use the new ID
or switches the selector to a
textmatch, opens a PR, gets it merged, and re-runs CI.
- The cached locator for the
Emailstep misses on the live UI. - The locator agent re-resolves the original natural-language description
Email. - The new locator binds, the step runs, the test passes.
- The cache entry is updated in place. A heal event is attached to the run for review. Subsequent runs hit the cache normally.
Maestro waiting, for contrast
Maestro waiting, for contrast
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 | Maestro | |
|---|---|---|
| Locator model | Natural-language descriptions resolved by an AI agent against a11y tree + view hierarchy + screenshot. Cached, auto-healed. | Static selectors: text, id, index, point, relational. |
| Visual cues | Color, icon, relative size, position part of the locator. | Not supported. |
| Agentic step | act accepts a multi-step goal; the agent plans and executes. | Not supported. |
| WebView | Bundled Chromium; works inside hybrid apps without setup. | Debugging must be enabled by the app team. |
| AI assert default | First-class step type, fails the test by default. | Experimental. Defaults to optional: true, so a failed AI assertion silently passes unless every call site sets optional: false (Maestro docs). |
| Visual diff | assertVisual, agent-scored against a golden. | assertScreenshot (pixel / hash diff). |
| AI provider | Managed; cross-provider failover handled by the platform. | Bring-your-own LLM, credentials, fallback. |
Technical details
Technical details
Momentic mobile step types
- Action:
act,tap,doubleTap,longPress,type,swipe,scroll,back,dismissKeyboard,launchApp,terminateApp - Assert:
assert,assertVisual,checkElement<...> - Extract:
extract(typed via JSON schema) - Control flow:
if/then/else, modules, parameter inputs
assertWithAI default, for contrast
(source)SinceIn practice this means a team that wants AI assertions to actually fail the test has to rememberassertWithAIis an experimental feature,optionalis set totrueby 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 setoptional: false.
optional: false on every call site, with no project-level
default.Recovery, quarantine, and CI
| Momentic | Maestro | |
|---|---|---|
| Failure recovery | LLM agent proposes test edits in the dashboard. | Not supported. |
| Quarantine | First-class: tests run, results report, exit code unaffected unless --only-quarantined. | Not supported. |
| Sharding | --shard-index <i> / --shard-count <n>, 1-indexed. Deterministic alphabetical partition. | Parallel on Cloud; shard via CI config. |
| Reporters | junit, allure, playwright-json, buildkite-json. | junit, HTML, HTML-detailed; Cloud dashboard. |
| Device fleet | Remote Android 14/15 emulators and iOS 26 simulators with sub-1s provisioning, multi-region. Local AVDs / simulators supported. | Hosted virtual devices on Cloud. Physical hardware via CLI. |
Quarantine semantics
Quarantine semantics
- 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
email_input is renamed or "Sign in" is localized, the YAML breaks until
someone edits it.
Agentic v2:
A more realistic test
The hello-world above doesn’t show the v2 surface. A representative onboarding regression with module reuse, parameter inputs, typed extraction, and a conditional looks like this:onboarding.test.yaml
../modules/sign-in.module.yaml