argent-test-ui-flow
software-mansion/argent
Autonomously test iOS/Android app UI flows with interact-screenshot-verify loops using argent MCP tools.
What is argent-test-ui-flow?
Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing UI flows, verifying login works, testing navigation, running end-to-end UI test scenarios, manual QA steps, visible UI changes, or visual behavior.
- Interact with app UI elements (tap, swipe, keyboard input) on iOS simulators or Android emulators
- Capture screenshots and compare against baselines to detect visual changes
- Describe UI structure (accessibility tree on iOS, uiautomator tree on Android) to locate elements
- Wait for UI elements to appear or disappear (spinners, modals, navigation transitions)
- Verify test results using visual diffs, structural inspection, and runtime logs
How to install argent-test-ui-flow
npx skills add https://github.com/software-mansion/argent --skill argent-test-ui-flow- iOS simulator or Android emulator running and accessible
- For React Native apps: resolve argent-react-native-app-workflow skill and run adb reverse for Metro access
- For permission dialogs: optionally use argent-settings-permissions skill to pre-grant/deny before launch
How to use argent-test-ui-flow
- 1.Call list-devices to identify which device to test on (iOS simulator or Android emulator)
- 2.If no device is running, use boot-device with the appropriate udid (iOS) or avdName (Android)
- 3.Call screenshot to capture the baseline UI state
- 4.Use describe or debugger-component-tree to locate target elements and get tap coordinates
- 5.Perform interactions (gesture-tap, gesture-swipe, keyboard) and verify results with auto-screenshots
- 6.For visual changes, use screenshot-diff against the baseline to detect pixel-level differences
- 7.For structural changes, use describe or debugger-component-tree to verify element state and hierarchy
- 8.Repeat the interact-verify cycle for each step in the test flow
Use cases
- Test login flows end-to-end with credential entry and navigation verification
- Verify UI navigation and screen transitions work as expected
- Check visual behavior and layout changes in response to user interactions
- Run manual QA steps and acceptance tests for visible UI changes
- Test permission prompts, modals, and system overlays in app flows
- QA engineers automating UI test scenarios
- Mobile app developers verifying visual and functional behavior
- Teams running end-to-end acceptance tests on iOS or Android
- Developers testing React Native apps with component-level inspection
argent-test-ui-flow FAQ
Use describe to get the accessibility tree (iOS) or uiautomator tree (Android) with element coordinates. For React Native apps, use debugger-component-tree which returns component names with (tap: x,y) coordinates. Fall back to screenshot estimation only if needed.
Try describe first to see if the prompt is in the accessibility/uiautomator tree. If it is, interact with it as part of the real flow. To remove the prompt from the flow entirely, use the argent-settings-permissions skill during setup to pre-grant or pre-deny permissions before launching the app.
Prefer await-ui-element with a selector you trust (text, identifier, or role) to block until a loading spinner hides or an expected element appears. Only use fixed delays when you cannot reliably identify the element to wait for.
Capture a baseline screenshot at scale 1.0 with includeImageInContext: false before making changes. After the action, use screenshot-diff with the baseline path to detect pixel-visible changes. For structural or runtime verification, use describe, debugger-component-tree, or view-network-logs instead.
iOS uses argent-ios-simulator-setup and list-devices returns udid (UUID format); Android uses argent-android-emulator-setup and list-devices returns avdName. The interaction tool names (gesture-tap, describe, screenshot, etc.) are identical; the tool-server auto-dispatches based on the udid you pass.
Full instructions (SKILL.md)
Source of truth, from software-mansion/argent.
name: argent-test-ui-flow description: Autonomously test an app UI (iOS or Android) by running interact-screenshot-verify loops using argent MCP tools. Use when testing UI flows, verifying login works, testing navigation, running end-to-end UI test scenarios, manual QA steps, visible UI changes, or visual behavior.
Platform-agnostic
Physical iPhone (kind: "device"): read argent-ios-device-interact first. launch-app before anything; describe fails while the app is backgrounded.
The interaction tool names are identical on iOS and Android — gesture-tap, gesture-swipe, describe, screenshot, launch-app, etc. — and the tool-server auto-dispatches based on the udid you pass (UUID-shape → iOS, adb serial → Android).
Before testing, resolve which device to test on. Call list-devices and follow <device_selection_rule>: prefer a running device on any platform;
Once a platform is chosen, the per-platform setup skill takes over:
| Platform | Setup skill | Find devices with |
|---|---|---|
| iOS | argent-ios-simulator-setup | list-devices → boot-device with udid if none booted |
| Android | argent-android-emulator-setup | list-devices → boot-device with avdName if none ready |
1. Workflow
All interactions go through argent MCP tools. Ensure the simulator/emulator is ready before starting.
For implementation tasks that modify visible UI, this workflow can also serve as a visual acceptance path.
- Baseline screenshot: Call
screenshotto see the current UI state. For visual regression comparison or UI change verification, capture the baseline atscale: 1.0withincludeImageInContext: falseand keep the returnedpathbefore editing whenever feasible. - Find target: Before tapping, use a discovery tool to get element coordinates:
- React Native apps: use
debugger-component-tree— it returns component names with (tap: x,y) coordinates. This is the preferred tool for RN apps on either platform. To use it, resolve theargent-react-native-app-workflowskill for setup; on Android you must also runadb -s <serial> reverse tcp:8081 tcp:8081so Metro is reachable from the device. - Standard app screens and in-app modals: use
describe. On iOS this returns the AX tree (falls back to native-devtools when AX is empty); on Android it returns the uiautomator tree in the same DescribeNode shape. - Permission prompts / system modal overlays: try
describefirst. Fall back toscreenshotonly if the overlay is not exposed reliably. When the app raises its own permission dialog, answer it here — that's the real flow under test. To take a prompt out of the flow (pre-grant/deny before launch, re-enable a permission the user already denied, or reset it so the dialog reappears), use theargent-settings-permissionsskill during setup instead of interacting with the dialog. - Fallback: use
screenshotto estimate where the desired component is, then verify immediately after the action.
- React Native apps: use
- Interact: Perform the action (
gesture-tap,gesture-swipe,keyboard,button, ...) — you receive a screenshot automatically. - Verify: Check the returned screenshot for expected results. If it shows a loading/transitional state, prefer blocking until it settles with
await-ui-element(expected elementvisible, or a spinnerhidden) over a guessed delay — but only with a selector you can trust (text/identifier/role) that the screen is known to have or that you saw in a priordescribe; a guessed one just times out. Otherwise use a short fixed wait. Pick evidence by what's being asserted:- Visual (layout, spacing, color, typography, image/icon rendering, clipping, overflow, text rendering): prefer
screenshot-diffagainst the baseline captured in step 1 — it surfaces pixel-visible changes the auto-screenshot might miss. Fall back to visual inspection of the auto-screenshot only when a stable baseline isn't available. - Structural (navigation state, element existence, accessibility labels/values, selection, hierarchy, route): verify with
describe,debugger-component-tree, ornative-describe-screen. - Runtime / log / network (console errors, API calls, persistence, timing): verify with
view-network-logs,debugger-log-registry,debugger-evaluate, or targeted tests. Notedebugger-log-registryreturns{ status: "not_connected", reason, guidance }with no log file when the debugger is unreachable — that is not evidence about the app; follow itsguidanceto reconnect, then re-verify. - Mixed: collect evidence for each relevant class.
- Report the combined verdict: expected behavior, observed behavior, evidence used, and any blocker for requested visual diffing.
- Visual (layout, spacing, color, typography, image/icon rendering, clipping, overflow, text rendering): prefer
- Repeat for each step in the flow.
2. Template
Goal: Test [feature name]
Steps:
1. Classify expected result: visual / structural / runtime-log-network / mixed → choose evidence
2. [Navigate / tap / type to reach stable comparable starting point] → verify auto-screenshot
3. screenshot { scale: 1.0, includeImageInContext: false } → save baseline path when visual or mixed evidence needs diffing
4. [Perform the action to test] → verify auto-screenshot
5. Use screenshot-diff when requested or when comparable images add useful visual evidence
6. Report: pass / fail with combined visual, structural, runtime/log/network evidence as applicable
3. Examples
Login flow
1. screenshot → see login screen
2. gesture-tap { x: 0.5, y: 0.4 } → tap email field
3. keyboard { text: "user@example.com" }
4. gesture-tap { x: 0.5, y: 0.55 } → tap password field
5. keyboard { text: "{{secret:APP_PASSWORD}}" }
6. gesture-tap { x: 0.5, y: 0.7 } → tap Login button
7. screenshot → verify home screen appeared
Credentials: never type plaintext credentials — use a
{{secret:<NAME>}}placeholder inkeyboard, resolved server-side so the value never enters agent context. It comes from theARGENT_SECRET_<NAME>environment variable or an argent secrets file (.argent/secrets.envin the project,~/.argent/secrets.env, or anARGENT_SECRET_-prefixed key in the project's.env/.env.local). If the name is not defined, the failure lists the available names and every path it checked — ask the user to add it to one of those files (which applies immediately) instead of pasting the secret into the conversation. Never invent credentials or echo secret values into reports or saved files.
Scroll and navigation
1. screenshot → see list at top
2. gesture-swipe { fromY: 0.7, toY: 0.3 } → scroll down
3. gesture-tap item at visible position → verify auto-screenshot
4. screenshot → verify detail view opened
5. button { button: "back" }
6. screenshot → verify returned to list
Visual behavior check
1. Classify expected result as visual or mixed.
2. Navigate to the stable starting state.
3. screenshot { scale: 1.0, includeImageInContext: false } → save baseline path.
4. describe / debugger-component-tree → find the control and use its returned tap coordinates.
5. gesture-tap → perform the visual behavior under test.
6. screenshot-diff { baselinePath, captureCurrent: true, udid, outputDir } → inspect visible change or stability.
7. describe / debugger-component-tree → verify selected state, label, route, or attributes if relevant.
8. Report combined verdict from expected behavior, visual inspection, diff summary, and structural evidence.
Wait for a loading spinner
1. gesture-tap { x: 0.5, y: 0.7 } → trigger an action that fetches data
2. screenshot → loading spinner is showing
3. await-ui-element { condition: hidden, selector: { text: "Loading" } } → block until the fetch finishes and the spinner disappears
4. describe / screenshot → verify the fetched content rendered
4. Recovery Pattern
- If a screen is mid-transition or loading: block until it settles with
await-ui-element(wait for the target element to bevisible, or the spinner/placeholder to behidden) instead of a blind fixed delay, then re-check. Fall back to a fixed wait +screenshotonly when no element reliably marks the transition. - If tap misses target: re-run discovery tool (
describe/debugger-component-tree), retry once with new coordinates. - If a permission dialog or modal is visible: re-run
describefirst. Stay in screenshot-driven navigation only when the overlay is not exposed reliably, then switch back todescribe/debugger-component-treeas soon as it is dismissed. - If tap fails twice at same coordinates: stop, re-discover, report if element not found.
- If a saved flow fails during
flow-executereplay (as opposed to live test steps above): followargent-create-flow's Diagnose a replay failure — classify the failure, inspect the actual screen, repair the smallest justified unit, then replay the full flow.
Tips
- Wait on the UI, don't poll. When a step needs the screen to change first, gate it with
await-ui-element(block until an element isvisible/hiddenor containstext) rather than repeatedscreenshotcalls with fixed sleeps. See theawait-ui-elementsection ofargent-device-interact. - Use
gesture-customfor long-press context menus (800ms hold). - Report clearly: state what you expected, what you saw, and the verdict.
- Permission modals: try
describefirst. Usescreenshotonly as fallback, tap one visible button at a time, and verify with the returned screenshot before continuing. - Record for replay: If a tested flow is likely to be repeated, use the
argent-create-flowskill to record it as a.yamlscript. This lets you replay the entire sequence later with a singleflow-executecall instead of re-running each step manually.
Related Skills
| Skill | When to use |
|---|---|
argent-device-interact | Tool usage for tapping, swiping, typing (iOS + Android) |
argent-screenshot-diff | Visual regression and before/after screenshot comparison |
argent-ios-simulator-setup | Booting and connecting an iOS simulator |
argent-android-emulator-setup | Booting and connecting an Android emulator |
argent-react-native-app-workflow | Starting the app, Metro, build issues |
argent-metro-debugger | Console logs, JS evaluation, component inspection |
argent-create-flow | Record a test sequence as a replayable flow |
Related skills
More from software-mansion/argent and the wider catalog.

argent-tv-interact
Control Apple TV, Android TV, and Fire TV apps via focus-driven remote navigation and debugging.

argent-android-emulator-setup
Set up and connect to Android emulators for UI automation and testing.

argent-create-flow
Create, record, edit, replay, or repair reusable Argent flow YAML files for repeatable device interactions.

argent-device-interact
Control iOS simulators, Android emulators, and Chromium apps with unified gesture and interaction tools.

solana-dev
Build, test, and deploy Solana dApps with Anchor programs, Kit clients, and transaction v1 support.

integration-privy
Add Privy authentication to Solana Expo Android apps with Sign-In-With-Solana and Mobile Wallet Adapter.