Maestro: Agentic Mobile UI Testing

handfuloflight1 pts0 comments

Maestro, End-to-End UI Testing for Mobile and Web<br>AGENTIC UI TESTING<br>Go ahead.Code at 150mph.

Maestro is mobile UI testing at agentic velocity. Open source, human-readable code, easy CI integrations, and powerful CLI and desktop apps.

Download<br>Install MCP<br>appId: com.example.app<br>- launchApp<br>- tapOn: Login<br>- inputText: test@example.com<br>- tapOn: Continue<br>- assertVisible: Welcome back

Maestro in action

Add Tasks.yaml Running

Features

Battle-tested, AI-native<br>Robust, open-source, time-tested - and now fully primed for human+AI development.

Close the agentic loop<br>Unlock high-velocity mobile development by powering up your agents with Maestro's AI toolkit.

> write Maestro tests for the new settings screen, including setting/testing each setting within<br>with full test plan, pls<br>● Let me look at the live screen and existing Maestro tests to understand what needs testing.<br>Read emulator screen hierarchy, searched for 1 pattern, read 4 files, listed 1 directory<br>● Now I have a clear picture of the settings screen. Let me write a suite of focused Maestro tests.<br>Here are the tests I propose:<br>Structure / Smoke<br>1. settings_sections_visible - scroll through the full screen and assert every section header is present

Content Correctness<br>2. settings_about_shows_version - About section shows Version and Build rows<br>3. settings_voice_section_no_api_key - voice section shows no voices loaded

Pickers<br>4. settings_sample_rate_picker - verify sample rate options<br>5. settings_effects_profile_picker - verify effects profile options

Persistence<br>6. settings_toggles_persist - toggle every switch, restart app, verify saved state<br>7. settings_voice_rate_persists - adjust speaking rate and verify value after relaunch<br>8. settings_audio_encoding_persists - choose MP3 and confirm selection survives restart

Reset<br>9. settings_reset_to_defaults - reset all TTS settings and verify confirmation<br>10. settings_reset_cancel - cancel reset flow and verify settings remain unchanged

Navigation<br>11. settings_history_button_navigates - tap History and verify empty state or recent sessions<br>12. settings_back_returns_home - navigate back and assert the home screen is visible

Accessibility<br>13. settings_controls_accessible_labels - verify controls expose stable accessible labels<br>14. settings_dynamic_type_layout - increase text size and verify rows remain tappable<br>15. settings_voiceover_order - assert VoiceOver traversal follows visual order

Generate deterministic E2E tests<br>Maestro tests are human-readable YAML files, not black boxes. Repeatable, auditable, trustworthy.

1# .maestro/ios-settings.yaml<br>2appId: org.wikipedia.wikipedia<br>3---<br>4✓- launchApp<br>5✓- assertVisible: "Welcome to Wikipedia"<br>6✓- runFlow: subflows/onboarding.yaml<br>7✓- tapOn: "Year In Review"<br>8✓- assertNotVisible: "Sign in to edit"<br>9✓- inputText: "qwerty"<br>10✓- assertVisible: "qwerty"<br>11✓- eraseText<br>12✓- inputText: "london"<br>13✓- assertVisible: "London"<br>14✓- tapOn: "London"<br>15✓- assertVisible: "United Kingdom"<br>16✓- tapOn: "Save"<br>17✓- scrollUntilVisible: "History"<br>18✓- assertVisible: "History"<br>19✓- back<br>20✓- assertVisible: "Search"<br>21✓- tapOn: "Settings"<br>22✓- assertVisible: "Language"<br>23✓- tapOn: "Language"<br>24✓- inputText: "English"<br>25✓- assertVisible: "English"<br>26✓- tapOn: "Done"<br>27✓- back<br>28✓- assertVisible: "Home"<br>29✓- tapOn: "Explore"<br>30✓- assertVisible: "Featured article"

Build on open-source integrity<br>Extensible and with no vendor lock-in, Maestro is the foundation for thousands of teams’ mobile testing.

t@macbookpro Code % git clone https://github.com/mobile-dev-inc/Maestro.git<br>Cloning into 'Maestro'...<br>remote: Enumerating objects: 32693, done.<br>remote: Counting objects: 100% (1379/1379), done.<br>remote: Compressing objects: 100% (652/652), done.<br>remote: Total 32693 (delta 1101), reused 743 (delta 723), pack-reused 31314<br>Receiving objects: 100% (32693/32693), 925.09 MiB | 13.99 MiB/s, done.<br>Resolving deltas: 100% (14496/14496), done.<br>t@macbookpro Code %

Surfaces

Build like the wind<br>Write and manage tests wherever you like, however fast you like.

Claude Codex<br>I’m turning that exact proof into an iOS Maestro test now, with the one-time education popups handled so it can run from clean state.<br>Explored 2 files, 2 searches, 1 list<br>I’m adding a dedicated ios-saved-flow.yaml rather than burying this inside the general smoke flow.<br>Created 1 file, edited 1 file<br>The new flow is in place and wired into ios-advanced-flow.yaml. I’m going to syntax-check it, then run the dedicated Saved flow.<br>Used Maestro MCP to inspect emulator hierarchy<br>I can see the onboarding card and the logged-out modal. I’m adding guarded runFlow steps so the test handles either clean or warm app state.<br>Tapped through emulator prompts, ran 1 flow<br>The Saved tab is reachable now. I’m asserting the article appears after restart so the test proves persistence, not just a successful tap.<br>Ask for follow-up changes

SummaryReview+72-0<br>ios-advanced-flow.yaml +1 -0<br>39 unmodified lines<br>40-eraseText<br>41-inputText:...

maestro assertvisible tapon verify flow testing

Related Articles