乐于分享
好东西不私藏

让 Claude 直接操控 iOS 模拟器!1.8K star 神器 AXe 把 UI 自动化变成一句话

让 Claude 直接操控 iOS 模拟器!1.8K star 神器 AXe 把 UI 自动化变成一句话

这里每天分享一个 iOS 的新知识,快来关注我吧

前言

iOS 模拟器自动化这事,我大概折腾过四种方案:

  1. 写 XCUITest(笨重,绑死 Xcode)
  2. xcrun simctl(命令太少)
  3. 起 Facebook 的 idb(要拉起 server,配置一坨)
  4. 或者直接 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 点击:

# 按 accessibility identifier
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 把树打出来:

axe describe-ui --udid $UDID
# 或者只看某个点位的 a11y 信息
axe describe-ui --point 195,400 --udid $UDID

输出是结构化的 JSON,给 AI Agent 当上下文喂特别合适——它一眼就能看懂当前页面有哪些可交互元素。

第二个亮点:batch 一次跑完整段流程

每个 axe 命令冷启动都要做几件事:连模拟器、初始化 HID 通道、可能还要拉一次 a11y 缓存。如果你写「点搜索框 → 输入 hello → 回车」这种 3 步操作,分 3 次调 axe 会很慢。

batch 子命令把多步打成一次调用:

axe batch --udid $UDID \
  --step "tap --id SearchField" \
  --step "type 'hello world'" \
  --step "key 40"            # Enter

或者把步骤写到文件里,方便版本管理:

axe batch --udid $UDID --file flows/search.txt

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

# 自动检测已安装的 ~/.claude 或 ~/.agents
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-simulatorsaxe describe-ui 找到登录控件 → axe batch 跑完一整套交互 → axe screenshot 把截图回传。整个过程你只动嘴不动手。

这一套以前你要么写 XCUITest(写完还得跑),要么手动操作。现在等于把模拟器的「眼睛」(describe-ui)和「手」(tap/type/swipe)一起给了 Agent。

vs idb / simctl 该怎么选

我把这三者做个并排对比,方便你选:

维度xcrun simctlFacebook idbAXe
安装Xcode 自带brew + Python daemon单二进制(brew)
架构CLIclient/serverCLI
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:

brew install cameroncooke/axe/axe
axe --help

然后启个模拟器、拿到 UDID 就能玩:

axe list-simulators                                   # 拿 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 自动化用的是哪一套?欢迎评论区聊聊~

参考资料

[1]cameroncooke/AXe: https://github.com/cameroncooke/AXe
[2]https://github.com/cameroncooke/AXe: https://github.com/cameroncooke/AXe

这里每天分享一个 iOS 的新知识,快来关注我吧