让 Claude 直接操控 iOS 模拟器!1.8K star 神器 AXe 把 UI 自动化变成一句话
这里每天分享一个 iOS 的新知识,快来关注我吧
前言
iOS 模拟器自动化这事,我大概折腾过四种方案:
-
写 XCUITest(笨重,绑死 Xcode) -
调 xcrun simctl(命令太少) -
起 Facebook 的 idb(要拉起 server,配置一坨) -
或者直接 AppleScript 控鼠标键盘(脏到不能上线)
每一种都有点不对劲。直到最近看到 GitHub 上一个 1.8K star 的小工具——cameroncooke/AXe[1]:单一 Swift 写的 CLI 二进制,无 server,覆盖 tap / swipe / type / 硬件按键 / 截图 / 录屏 / accessibility 树查询,全功能能在一个命令里跑完。
更骚的是它直接支持装成 Claude Code 的 skill——也就是说你的 AI Agent 现在能像人一样操作模拟器,写测试、做回归、自动化 demo 录制都顺手了。
这篇就把它讲清楚。

它能干啥
先看一眼 demo:

核心命令我列一下,基本覆盖了 iOS 模拟器上你能想到的所有人类操作:
| 类别 | 命令示例 | |
|---|---|---|
| 点击 | axe tap -x 100 -y 200(坐标)/ axe tap --id "Safari"(按 a11y ID) |
|
| 滑动 | axe swipe --start-x 100 --start-y 300 --end-x 300 --end-y 100 |
|
| 手势预设 | axe gesture scroll-up / swipe-from-left-edge(边缘返回) |
|
| 输入文本 | axe type 'Hello World!' / `echo “…” \ |
axe type –stdin` |
| 硬件按键 | axe button home / lock / siri / apple-pay |
|
| 键盘组合 | axe key-combo --modifiers 227 --key 4(Cmd+A) |
|
| 截图 | axe screenshot --output ~/Desktop/shot.png |
|
| 录屏 | axe record-video --fps 15 --output recording.mp4 |
|
| 视频流 | `axe stream-video –fps 30 –format ffmpeg \ | ffmpeg …` |
| Accessibility 树 | axe describe-ui --point 100,200 |
|
| 批量操作 | axe batch --step "..." --step "..." |
底层走的是 Apple 私有 Accessibility API + HID(Human Interface Device)通道,所以不需要在被测 App 里集成任何 SDK,纯外部驱动。
第一个亮点:按 accessibility ID 直接 tap
写过 UI 自动化的都知道,按坐标点是一切恶心 bug 的源头——换个屏幕尺寸、换个 iOS 版本、动态布局微调一下,所有坐标全废。
AXe 直接复用 Accessibility Tree,让你按 ID 或 Label 点击:
axe tap –id “search_button” –udid $UDID
# 按 label(更适合中文 / 系统控件)
axe tap –label “Safari” –udid $UDID
这等于把 XCUITest 里 app.buttons["search_button"].tap() 这一套体验搬到了 CLI 外面。你的脚本、CI、AI Agent 都能直接用,不用再写 XCUITest target、不用 build for testing。
不知道目标控件的 ID?就先 describe-ui 把树打出来:
# 或者只看某个点位的 a11y 信息
axe describe-ui –point 195,400 –udid $UDID
输出是结构化的 JSON,给 AI Agent 当上下文喂特别合适——它一眼就能看懂当前页面有哪些可交互元素。
第二个亮点:batch 一次跑完整段流程
每个 axe 命令冷启动都要做几件事:连模拟器、初始化 HID 通道、可能还要拉一次 a11y 缓存。如果你写「点搜索框 → 输入 hello → 回车」这种 3 步操作,分 3 次调 axe 会很慢。
batch 子命令把多步打成一次调用:
–step “tap –id SearchField” \
–step “type ‘hello world'” \
–step “key 40” # Enter
或者把步骤写到文件里,方便版本管理:
batch 默认 fail-fast(任一步失败就停),加 --continue-on-error 切到 best-effort 模式。a11y 缓存复用 --ax-cache perBatch,长文本输入自动 chunk 防截断。这一套配下来,整段流程的延迟基本被打平到接近”原生”水平——仓库里有个 scripts/benchmark_batch.sh,你可以自己跑下对比。
第三个亮点:直接装成 Claude Code 的 skill
这条是我觉得 AXe 在 2026 年之所以能站稳的关键。
它内置了一个 axe init 命令,能一键把自己注册成 AI 编码工具的 skill:
axe init
# 显式指定客户端
axe init –client claude
axe init –client agents
# 装到自定义目录
axe init –dest ~/.claude/skills
# 卸载
axe init –uninstall –client claude
装完之后,你在 Claude Code 里就能直接说:
“帮我跑一下 App,进入登录页,输入测试账号 admin/123456,截个图给我看看”
Agent 会自己 axe list-simulators → axe describe-ui 找到登录控件 → axe batch 跑完一整套交互 → axe screenshot 把截图回传。整个过程你只动嘴不动手。
这一套以前你要么写 XCUITest(写完还得跑),要么手动操作。现在等于把模拟器的「眼睛」(describe-ui)和「手」(tap/type/swipe)一起给了 Agent。
vs idb / simctl 该怎么选
我把这三者做个并排对比,方便你选:
| 维度 | xcrun simctl |
Facebook idb | AXe |
|---|---|---|---|
| 安装 | Xcode 自带 | brew + Python daemon | 单二进制(brew) |
| 架构 | CLI | client/server | CLI |
| Tap by a11y ID | ❌ | ✅ | ✅ |
| Gesture preset | ❌ | 部分 | ✅(scroll/edge swipe) |
| 视频录制 | ✅ 基础 | ✅ | ✅ MP4 + 多种流格式 |
| Batch 多步 | ❌ | 通过 RPC | ✅ 原生 |
| AI Agent skill | ❌ | ❌ | ✅ 一键装 |
| 维护活跃度 | Apple | 半停滞 | 活跃 |
简单说:只是开关模拟器、装卸 App、看 log,simctl 够了;重型分布式自动化、跨设备调度,上 idb;单机 CLI 自动化 + AI Agent 驱动,AXe 是当前最顺手的。
怎么开始
最快的方式是 brew:
axe –help
然后启个模拟器、拿到 UDID 就能玩:
UDID=B34FF305-5EA8-412B-943F-1D0371CA17FF
axe screenshot –udid $UDID –output ~/Desktop/s.png
axe tap –label “Settings” –udid $UDID
axe gesture scroll-down –udid $UDID
5 分钟内你就能感觉到「模拟器是可以被 CLI 像玩偶一样操控的」这件事多爽。
后面要接 AI Agent,就 axe init --client claude,让 Claude Code 自动识别这个 skill。
仓库地址:https://github.com/cameroncooke/AXe[2],MIT License,Swift 写的,1.8K star,issue 响应也活跃,可以放心入。
最后
AI 时代下,你团队 iOS 自动化用的是哪一套?欢迎评论区聊聊~
参考资料
这里每天分享一个 iOS 的新知识,快来关注我吧
夜雨聆风