Skip to main content
ClaudeWave

Drive the iOS Simulator like a human — from an AI agent. Real HID gestures, a11y-tree + OCR reading, deterministic flows, MCP server. Zero third-party deps.

MCP ServersRegistry oficial1 estrellas0 forksSwiftMITActualizado today
Install in Claude Code / Claude Desktop
Method: Manual
Claude Code CLI
git clone https://github.com/valewnrt/testa
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
💡 Clone https://github.com/valewnrt/testa and follow its README for install instructions.
Casos de uso

Resumen de MCP Servers

<div align="center">

# Testa

**Drive the iOS Simulator like a human — from an AI agent.**

Real HID touches (every gesture), screen reading via the accessibility tree
**or on-device OCR**, token-efficient, fast, and **zero third-party dependencies**.
Test React Native / Expo and native SwiftUI apps end-to-end — **without adding a
single `testID`** — then save the run as a flow file and let CI replay it for free.

[![CI](https://github.com/valewnrt/testa/actions/workflows/ci.yml/badge.svg)](https://github.com/valewnrt/testa/actions/workflows/ci.yml)
[![Xcode beta](https://github.com/valewnrt/testa/actions/workflows/xcode-beta.yml/badge.svg)](https://github.com/valewnrt/testa/actions/workflows/xcode-beta.yml)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
![Platform](https://img.shields.io/badge/platform-macOS%20·%20iOS%2026-lightgrey)
![Swift](https://img.shields.io/badge/swift-6-orange.svg)
![Runtime deps](https://img.shields.io/badge/runtime%20deps-zero-success)
![MCP](https://img.shields.io/badge/MCP-ready-8A2BE2)

<img src="assets/demo.gif" alt="Testa driving the iOS Simulator — tap, pinch, rotate, drag-and-drop, type" width="280">

<sub>An agent tapping, pinching, rotating, dragging-and-dropping, and typing — all verified through the accessibility tree, no screenshots.</sub>

</div>

---

## Why Testa

Agents are great at writing iOS apps and clumsy at the part that comes next:
**actually exercising them in the simulator.** Testa is built for that — and
three things set it apart from the rest of the field: it drives screens that
expose **zero accessibility** (via on-device OCR), it turns an agent session into
a **deterministic flow file that CI replays with no model in the loop**, and it's
a **single, fully-open, dependency-free binary**.

- 🧠 **No app setup required.** Reads the accessibility tree, and falls back to
  **Apple Vision OCR** to tap any *visible text* — so it drives canvas, games,
  WebViews and vibe-coded apps that never added a `testID`.
- 🪙 **Token-efficient.** One compact line per element (`e5 Button "Save" #save @120,300`)
  — a `ui` snapshot of a real screen measures **~203 tokens** against **~1,500**
  for the same screen as an image. [Measure it yourself →](bench/)
- 🔁 **Acting commands answer with the UI diff.** Every `tap`/`type`/`swipe`
  reply ends with `-- ui changes --`, so the loop is *act → read the diff*, not
  *act → full snapshot*.
- 🎬 **Record once, replay forever.** `testa flow record save smoke.flow` writes
  what the agent just did as plain text; `testa flow run smoke.flow` replays it
  deterministically — **zero tokens**, JUnit output, failure artifact bundles.
- ⚡ **Fast.** A warm daemon keeps the connection, accessibility translator and HID
  client hot: **~60 ms** per snapshot (measured 24–39 ms marginal, see [`bench/`](bench/)).
- 👆 **Every gesture, for real.** Tap, long-press, swipe, **drag-and-drop**,
  **pinch/zoom**, **rotate**, multi-touch, hardware buttons, key combos,
  unicode/emoji text — genuine HID events.
- 🌍 **Control the device, not just the app.** Push notifications, GPS location,
  Face ID / Touch ID, dark mode, Dynamic Type, status bar, locale, pasteboard,
  photo library, launch env & args.
- ♿ **`testa audit`** — accessibility audit (missing labels, sub-44 pt tap
  targets, duplicate labels) that fails a CI job.
- 🖼 **`testa vdiff`** — visual regression with an antialiasing-tolerant pixel
  diff, a red heatmap, and **OCR-aware `- lost:` / `+ new:` lines** so a
  percentage becomes a sentence.
- 🔌 **Agent-native.** Ships an **MCP server** (`testa mcp`), a Claude Code skill,
  a Claude Code plugin manifest, and a composite GitHub Action.
- 🔒 **Local & private.** A `0600` per-user Unix socket. No network, no telemetry.
- 📦 **Zero third-party runtime deps.** Talks straight to Apple's `CoreSimulator`,
  `SimulatorKit`, `AccessibilityPlatformTranslation`, Vision and `simctl`.

|  | **Testa** | Argent | idb | Appium | Maestro |
|---|:--:|:--:|:--:|:--:|:--:|
| Agent-native (MCP + token-efficient snapshots) | ✅ | ✅ | ❌ | ❌ | ⚠️ |
| Drives screens with **zero accessibility** (on-device OCR) | ✅ | ❌ | ❌ | ❌ | ❌ |
| Pinch · rotate · drag-and-drop · multi-touch | ✅ | ⚠️ | ✅ | ✅ | ⚠️ |
| Flow files replayed deterministically in CI | ✅ | ⚠️ | ❌ | ⚠️&nbsp;code | ✅ |
| **Record an agent session → flow file** | ✅ | ⚠️ | ❌ | ⚠️ | ⚠️ |
| Visual regression built in (pixel + OCR diff) | ✅ | ⚠️ | ❌ | ⚠️&nbsp;plugin | ⚠️&nbsp;cloud |
| Device environment: push · location · biometrics · appearance | ✅ | ⚠️ | ⚠️ | ✅ | ⚠️ |
| Accessibility audit as a CI gate | ✅ | ❌ | ❌ | ❌ | ❌ |
| Self-contained: one native binary, no Node/SDK runtime | ✅ | ❌ | ❌ | ❌ | ❌ |
| Fully open source, no proprietary parts | ✅&nbsp;MIT | ⚠️ | ✅ | ✅ | ✅ |
| Platforms | iOS | iOS · Android | iOS | iOS · Android · web | iOS · Android |
| Live debugging & profiling (logs · network · RN tree · Instruments) | ❌ | ✅ | ⚠️ | ❌ | ❌ |

<sub>High-level summary, checked against each project's public documentation.
These are all good tools. <b>⚠️ means "partial, plugin-only, commercial-tier, or
not documented"</b> — it is not a criticism, and where a project's docs did not
settle the question we marked it ⚠️ rather than guess. The closest tool is
<a href="https://github.com/software-mansion/argent">Argent</a> (Software
Mansion): broader than Testa (cross-platform, deep debugging & profiling), but
accessibility-only (no OCR), Node-based, and Apache-2.0 source <em>plus
proprietary binaries</em>. <a href="https://maestro.dev">Maestro</a>'s YAML flows
are the reference for declarative mobile flows and are excellent;
<a href="https://appium.io">Appium</a>'s XCUITest driver has the richest device
environment surface of any of these. Testa's niche: fully-open,
dependency-free, OCR-driven, iOS-focused, and the same tool for both the agent
loop and the token-free CI replay. Corrections welcome — open an issue.</sub>

## Quick start

```bash
# Install — builds from source, installs the skill, registers the MCP server
brew tap valewnrt/testa
brew install testa
testa setup

# …or from source
git clone https://github.com/valewnrt/testa && cd testa && ./install.sh
```

```bash
testa boot "iPhone 17 Pro"
testa install ./MyApp.app && testa launch com.example.myapp

testa ui                       # what's on screen (token-efficient)
testa tap "Continue"           # by visible text — falls back to OCR
testa typein "#email" "a@b.co"
testa assert "#welcome" exists # → PASS / FAIL (exit 0/1)
```

> First call boots a background daemon and warms accessibility (a few seconds,
> once). Every call after is ~60 ms. Requires macOS + Xcode 26 (iOS 26 sims), Swift 6.

## The loop

1. **Observe** — `testa ui` (on-screen elements) · `testa see` (OCR every visible
   text) · `testa find <q>` · `testa scrollto <sel>`.
2. **Act** — `tap · typein · setvalue · clear · swipe · drag · dragdrop · pinch ·
   rotate · keycombo · button`. Address things by `eN` ref, `#identifier`,
   `"label"`, or `x y`. **The reply carries the settled UI diff** — no follow-up
   `ui` needed.
3. **Verify** — `testa assert <sel> [exists|gone|value=…|label=…]` (exit 0/1),
   `testa wait <sel> [gone] [timeoutMs]`. Both — and `find` — fall back to OCR
   when the tree has no match, and say which source answered:
   `PASS exists (ocr) "Settings" @200,703`. `--ocr` skips the tree entirely.
4. **Keep it** — `testa flow record save smoke.flow`, then CI replays it forever.

```text
$ testa ui
25 elements (on screen)
e1 Application "Testa Native" @201,437
e5 Button "Tap me" #tapButton @102,171
e16 TextField #textInput =type here @201,673
…

$ testa tap "#tapButton"
tapped e5 Button Tap me
-- ui changes --
~ e2 StaticText "tap:1" #status @197,86
~ e6 StaticText "count: 1" #tapCount @41,205

$ testa pinch "#map" 2.0      →  pinched
$ testa dragdrop "#card" "#trash"  →  drag-and-dropped
$ testa assert "#status" label=done  →  PASS exists e2 …
```

<details>
<summary><b>Full command reference</b></summary>

```
Observe
  ui [diff|full]            on-screen snapshot (diff = changes, full = incl. off-screen)
  see                       OCR every visible text + tap coords (any app)
  find <query> [--ocr]      elements matching label/id/value/role (OCR fallback)
  scrollto <sel>            scroll until an element is visible (vertical or horizontal)
  assert <sel> [exists|gone|value=..|label=..] [--ocr]
  wait <sel> [gone] [timeoutMs] [--ocr]  wait until it appears — or disappears
  audit                     accessibility audit (labels, 44pt targets, dupes)
  vdiff <baseline.png> [tolerancePct]   visual regression, OCR-aware
  screenshot [path.png]

Act   (sel = eN ref · #identifier · "label"; tap falls back to OCR text)
  tap <sel> | tap <x> <y> | tapocr <text>
  typein <sel> <text> | type <text> | setvalue <sel> <text> | clear <sel>
  key <hidUsage> | keycombo <cmd+shift+a> | button <home|lock|siri|apple-pay>
  swipe|drag|dragdrop <x1 y1 x2 y2> [secs]   (also <fromSel> <toSel>)
  longpress <sel | x y> [secs] | pinch <sel | x y> <scale> | rotate <sel | x y> <radians>

App / device
  devices | boot <udid|name> | shutdown <udid|all>
  install <app> | terminate <bundle> | apps | open <url>
  launch <bundle> [--env K=V ...] [--args <a> ...]
  logs [bundle] [seconds] | crashes [bundle]
  permission <grant|revoke|reset> <service> <bundle>
  record <start [path] | stop>

Environment
  push <bundle> <file.json | '{"aps":{"alert":"hi"}}'>
  location <lat> <lon> | location clear
  statusbar time 9:41 [battery 100 charged] [wifi 3] [cell 4] | statusbar clear
  appearance <dark|light> | contentsize <size|increment|decrement>
  locale <en_US> [lang]     (apps need a relaunch to pick it up)
  addmedia <file...> | pbcopy <text> | pbpaste
  biometry <enroll|unenroll|match|nomatch>

Flows / CI   (deterministic replay — no agent, no tokens)
  flow run <file.flow ...> [--junit <out.xml>] [--artifacts <dir>] [--quiet]
  flow record start                         
ai-agentsclaudee2e-testingiosios-simulatormcpmcp-serverreact-nativeswiftuitest-automation

Lo que la gente pregunta sobre testa

¿Qué es valewnrt/testa?

+

valewnrt/testa es mcp servers para el ecosistema de Claude AI. Drive the iOS Simulator like a human — from an AI agent. Real HID gestures, a11y-tree + OCR reading, deterministic flows, MCP server. Zero third-party deps. Tiene 1 estrellas en GitHub y se actualizó por última vez today.

¿Cómo se instala testa?

+

Puedes instalar testa clonando el repositorio (https://github.com/valewnrt/testa) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.

¿Es seguro usar valewnrt/testa?

+

valewnrt/testa aún no ha sido auditado por nuestro agente de seguridad. Revisa el repositorio original en GitHub antes de usarlo en producción.

¿Quién mantiene valewnrt/testa?

+

valewnrt/testa es mantenido por valewnrt. La última actividad registrada en GitHub es de today, con 0 issues abiertos.

¿Hay alternativas a testa?

+

Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.

Despliega testa en tu cloud

Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.

¿Mantienes este repo? Añade un badge a tu README

Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.

Featured on ClaudeWave: valewnrt/testa
[![Featured on ClaudeWave](https://claudewave.com/api/badge/valewnrt-testa)](https://claudewave.com/repo/valewnrt-testa)
<a href="https://claudewave.com/repo/valewnrt-testa"><img src="https://claudewave.com/api/badge/valewnrt-testa" alt="Featured on ClaudeWave: valewnrt/testa" width="320" height="64" /></a>

Más MCP Servers

Alternativas a testa