The iOS counterpart to android-tester — boot a simulator, launch an app, drive its UI, and verify what actually rendered.
Simulator lifecycle (create_sim, boot,
install, launch) · sensing (screenshot,
ui_dump, find, logs) · interaction
(tap, type_text, swipe, wait_for) ·
a read-only physical-device tier
Ask a vision model where an element is and it answers confidently. It is also wrong in a way iOS will never report back to you.
tap resolves a selector against a fresh tree before acting.
Raw-coordinate tapping exists as a separate tap_xy that always warns.
| Source | Center y |
|---|---|
| accessibility tree | 1210 |
| vision model | 1080 |
| delta | −130 px |
| row spacing | 156 px |
iOS raises no error. The tap succeeds, the wrong thing happens, and the screenshot still looks entirely plausible.
Mixing them is a silent 3× coordinate error. Every
geometric field comes back in both spaces, explicitly labelled —
frame_points / frame_pixels,
center_points / center_pixels — plus the measured scale.
The tool never returns a bare coordinate whose unit is ambiguous.
node "General" frame_points [16.0, 380.33, 370.0, 52.0]
tap → points (201.0, 406.33)
pixels (603.0, 1219.0)
201.0 × 3.0 = 603.0 406.33 × 3.0 = 1219.0
| Tier | Setup cost | Can see | Can tap |
|---|---|---|---|
| Simulator | Xcode only | yes — labels + frames | yes · proven |
| Device — free | cable + Developer Mode | yes — screenshot, elements, syslog | no |
| Device + WebDriverAgent | + Apple Developer account, signing | yes | deferred · unproven |
The simulator tier needs no Apple Developer account, no code signing, and no physical device. That is the tier nearly everyone will run.
The free-tier device element list returns exactly four keys:
caption · estimated_uid · platform_identifier · spoken_description
No frame. No rect. No bounds. Nothing positional at all.
tap on the device backend returns a structured refusal explaining
why — rather than guessing a coordinate and reporting success.xcode-select points at CommandLineTools, simctl
appears missing. Setting DEVELOPER_DIR fixes it — no sudo required.
doctor detects this and tells you.type_text cannot confirm focus was gained. iOS exposes no
focused attribute. It asserts readback and warns, rather than implying certainty.Everything above is a known boundary, surfaced by the tool at the moment you hit it — not a surprise discovered halfway through a test run.
Proven end-to-end against macOS 26.6 / Xcode 26.6 and a physical iPhone X on iOS 16.7.16 — not only unit-tested.
doctor.amplifier bundle add \ git+https://github.com/microsoft/amplifier-bundle-ios-tester@main#subdirectory=behaviors/ios-tester.yaml \ --app
doctor reports every host problem at once — Xcode,
simctl, runtimes, simulators, devices, Developer Mode — each with its own fix.