ARTICLE · 1125136
把 iOS 模拟器交给脚本:Baguette 想补上自动化开发的操作入口
做 iOS 开发时,写完代码只是开始。
你还得启动模拟器,打开应用,点进目标页面,检查按钮有没有被遮住,再截一张图留给同事。换个屏幕尺寸,往往还要再做一遍。
这些操作并不难,但重复起来很消耗注意力。尤其当代码已经能由 AI 辅助生成时,界面验证如果依然全靠人手,整个流程还是会在这里停下来。
最近看到的开源项目 Baguette,就在尝试把这一段接起来:让 iOS 模拟器拥有浏览器界面和命令行控制入口,供开发者、脚本以及外部自动化程序使用。项目主页
01|一个模拟器,也可以有两种操作入口
Baguette 的主体是一个 Swift 命令行工具,同时提供自带的 Web 界面。按照项目介绍,启动服务后,可以在浏览器里查看和操控模拟器,不必打开 Simulator.app 的窗口。
对日常调试来说,浏览器入口让设备管理更集中;对自动化来说,命令行入口则让操作能够写进脚本。开发者可以根据任务,在手动观察和程序控制之间切换。
这里有个前提:不打开 Xcode 窗口,不等于不需要 Xcode 环境。 README 标注的安装条件是 Apple Silicon Mac 与 Xcode 26,工具依赖 Xcode 自带的私有模拟器框架。安装与运行说明
02|更值得关注的是:程序能读到界面结构
对于自动化程序,看到一张截图之后,还要解决“应该点哪里”的问题。
Baguette 提供的 describe-ui 可以读取当前应用的无障碍树,返回元素标签、标识符、层级和位置。调用方拿到按钮的矩形区域后,就可以计算中心点,再发送点击操作。无障碍树文档
这意味着,接入它的程序有机会把操作串成一个循环:读取界面,寻找目标,执行动作,再检查新状态。

示意图:循环由接入 Baguette 的外部程序组织,图中不代表项目自带完整的智能测试系统。
假设要检查“设置页能否打开”,程序可以先读取界面,找到设置入口,再点击并重新读取结果。如果预期标题出现,继续下一步;如果没有出现,就保存截图供排查。
这是基于接口能力可以设计的工作流。它是否稳定,仍取决于应用提供的无障碍信息、页面加载时间,以及调用方如何判断成功和处理失败。
文档也写明:无障碍树是一次性的状态快照,操作后需要重新读取;它主要反映前台应用,部分系统覆盖层和节点存在限制。因此,实际接入时仍需要截图与状态检查配合。接口限制
03|设备农场,让多屏检查更直观
如果你要检查同一个页面在不同设备上的显示效果,逐个切换窗口会很繁琐。
Baguette 的 /farm 页面把多台已启动的模拟器放在同一个浏览器标签页里,提供网格、墙面和列表视图。选择其中一台后,可以在聚焦区域进行点击、滑动和缩放,也有按条件筛选、批量启动和截图等入口。设备农场文档
它适合拿来观察多种屏幕下的布局差异:长标题是否换行,底部按钮是否完整,某个弹窗是否遮挡内容。浏览器把画面集中起来,能够减少来回找窗口的时间。
性能设计也有取舍:文档给出的配置是,未聚焦设备使用 8 fps 缩略图,聚焦设备使用 60 fps 全质量预览。实际表现仍受 Mac 性能和设备数量影响。
当前设备农场还有未完成的部分,例如一些遥测指标是占位内容,部分按钮尚未接通。把它作为本地多设备检查工具,预期会更准确。当前限制
04|截图可以成为每次验证的交付物
自动化操作完成后,最好留下能让人复核的结果。
Baguette 支持通过命令行或 HTTP 获取截图,提供尺寸、背景和适配方式等参数。比如文档中的 appstore-6.9 尺寸选项,可以用于生成对应画布规格的图片。截图文档
对开发者来说,这可以用来保存修改前后的页面;对协作来说,可以把问题画面附在反馈里,让接手的人更快找到上下文。
不过,输出到指定画布尺寸,并不意味着模拟器原始图像的细节增加了。文档明确提到,部分尺寸转换会放大已有像素。因此,生成素材后仍要检查清晰度、内容和最终用途的要求。
05|先把一个小流程跑通
如果已有符合要求的开发环境,可以从项目提供的最小入口开始:
终端 · 命令
$ brew install baguette$ baguette serve
默认模拟器页面地址是:
示例
http://127.0.0.1:8421/simulators
想查看设备农场,可以打开:
示例
http://127.0.0.1:8421/farm
上面是项目文档给出的用法,本文未在本机执行验证。快速开始
第一次尝试,建议选一个小任务:打开目标页,检查关键元素,保存截图。确认这个过程可靠之后,再加入更多设备、更多交互和失败处理。
对于依赖私有框架的工具,系统与 Xcode 更新后的兼容性也需要留意。将它引入日常流程之前,先验证自己的环境,比直接铺开一整套自动化更省事。
让开发结果更容易被检查
Baguette 值得关注的地方,是它让模拟器的界面状态和操作能力更容易被外部程序调用。
这为脚本驱动的验证,也为 AI 辅助开发后的界面检查,提供了一种可以尝试的入口。真正完整的流程,还需要接入方补上任务判断、等待、重试和结果复核。
如果你经常在多台模拟器之间切换,或者正在尝试把“写代码之后的那几步”自动化,Baguette 提供了一个具体的起点。
你最想交给脚本的,是页面截图、跨设备布局检查,还是一套重复点击流程?
项目地址:
https://github.com/tddworks/baguette