Device Interaction 是一个子智能体(SUBAGENT)技能,用于在设备或模拟器上验证应用行为。它通过截图、UI 层级和触摸交互来确认应用是否按预期工作。
用途
该技能在以下情况触发:用户要求验证/测试/检查应用在设备上是否工作;实现影响 UI 的功能后需要设备验证;用户说“它能工作吗”“测试这个”“在设备上检查”;用户报告 UI 未按预期工作;需要调试触摸/交互问题。
以下情况不触发:仅涉及单元测试;仅构建请求而无设备测试;无设备测试的代码审查;模拟器配置问题;不影响 UI 的更改(如注释、重构、非 UI 逻辑)。
主要能力
- 会话生命周期管理:DeviceInteractionStartWorkspaceSession(工作区支持,后台运行)→ DeviceInteractionInstallAndRun(每次代码更改后,包含构建)→ DeviceEventSynthesize(交互+观察,可重复)→ DeviceInteractionEndSession(完成后关闭,保持会话打开会占用大量资源)。
- 两种启动会话方式:DeviceInteractionStartWorkspaceSession 绑定工作区,用于验证正在构建的应用;DeviceInteractionStartSession 不绑定工作区,仅用于与已安装应用交互。
- 设备发现:打开新会话时可传入设备标识符选择设备,省略则使用当前目标,传入空字符串获取可用目标列表。
- DeviceInteractionInstallAndRun 可选参数:commandLineArguments(启动时传给应用的参数,使用 $(inherited) 保留 scheme 现有参数);environmentVariables(启动时设置的环境变量,使用 "$(inherited)" 作为键保留现有环境变量)。省略两者则保持不变。优先使用这些参数而非直接编辑 scheme,它们仅对该次运行生效。
- DeviceEventSynthesize:执行交互并观察设备状态。
使用方式
读取层级文件
层级文件包含每个元素的计算 hitPoint 位置,格式如:UIView {{100, 200}, {60, 30}}, hitPoint: {130.0, 215.0}。其中 {100, 200} 为原点位置,{50, 30} 为宽高,hitPoint 为计算出的最佳点击点。始终优先使用 hitPoint 坐标进行触摸事件,仅在点击 hitPoint 并重新捕获确认无效后,才可回退到截图估算位置。标记为 isRemoteLeafPlaceholder 的元素不报告子元素,交互时需回退到截图估算坐标。
多应用(activationBundleId 注解)
当多个应用的窗口重叠时,每个元素行会带有 activationBundleId: <bundle-identifier> 后缀。若元素行带有 activationBundleId,交互前需先通过 DeviceEventSynthesize 工具传入 activationBundleId 参数激活该应用。可仅传 activationBundleId 而不传 interactionCommand。应用激活开销较大,仅在必要时使用。
交互命令语法
interactionCommand 参数接受以下命令:
- t <x> <y> [duration]:点击坐标,可选按住时长
- d <x> <y>:双击
- t <x1> <y1> f <x2> <y2> [duration]:从 (x1,y1) 滑动到 (x2,y2)
- drag <x1> <y1> <x2> <y2> [holdDuration] [moveDuration]:拖放,按住 (x1,y1) 后缓慢移动到 (x2,y2),用于列表重排序或拖放目标
- mt [x1 y1, ...] dur [x1 y1, ...] dur ...:多点触控序列,每个 [...] 关键帧列出触摸位置,每块后的 duration 是到下一关键帧的移动时间,最后一块为抬起前的按住时间。手指在槽位为空逗号条目(如 [, x y])或帧条目少于手指索引时结束,两者等价。抬起后再次出现的手指开始新的点击。
- b h/p/u/d [duration]:硬件按钮,h=Home,p=Power,u=VolUp,d=VolDown
- b c/s/a [duration]:仅 watchOS,c=Digital Crown 按下,s=侧边按钮,a=Action 按钮(部分设备)
- sender keyboard kbd <text>:输入文本,必须是命令链中最后一条,kbd 后所有内容按原样处理(保留多个空格)。特殊字符使用 \u{XXXX} Unicode 转义:\u{000A}(回车/换行),\u{0009}(制表符)
- w duration:等待指定时长
- orientation faceDown/faceUp/landscapeLeft/landscapeRight/portrait/portraitUpsideDown:设置设备方向(仅 iOS)
- c <rotations>:仅 watchOS,旋转 Digital Crown,符号表示方向,1.0 为一整圈
- r up/down/left/right/select/menu/playpause/home:仅 tvOS,按下 Siri Remote 按钮移动焦点、选择或回到主屏幕
示例:"t 100 200" 点击 (100,200);"d 200 300" 双击;"t 200 600 f 200 200 0.3" 向上滑动;"drag 100 300 100 100 0.5 1.5" 拖放;"mt [100 300, 300 300] 0.5 [175 300, 225 300] 0.5" 双指捏合;"b h" 按 Home 键;"b h b h" 按两次 Home 进入应用切换器;"b h w 0 b h" 唤醒并解锁设备(仅非密码设备);"sender keyboard kbd hello world" 输入文本;"sender keyboard kbd submit\u{000A}" 输入后按回车;"w 0.3" 等待 0.3 秒;"orientation landscapeLeft" 旋转到横屏;"c 1.0" watchOS 旋转表冠一整圈;"r down" tvOS 焦点下移;"r select" tvOS 选择。
标准子智能体工作流
任何交互前,始终捕获并读取层级(和截图)。任何交互后,再次捕获并验证结果。对于复杂组件(如开关或滑块),查看嵌套元素(如 Switch 或 Slider),附近元素可能对应实际控件。完成后向主智能体报告发现。仅捕获不交互时,使用 DeviceEventSynthesize 并传入空 interactionCommand。切勿仅凭截图猜测位置,应使用层级 hitPoint 坐标;截图估算仅在 hitPoint 尝试失败后作为回退。若不确定或缩略图分辨率不足,分析全尺寸截图。
tvOS(Apple TV)
tvOS 基于焦点:没有触摸屏,坐标点击/滑动不适用。同一时间恰好一个元素获得焦点,只能激活当前有焦点的元素。使用 Siri Remote 驱动:读取层级查看所有可聚焦元素及标记为 Focused 的元素;用 r up/r down/r left/r right 移动焦点到目标,再用 r select 激活;用 r menu 返回。可在一条命令中链式多次按键并只捕获一次,而非每次按键后都捕获。层级列出元素顺序,可计算到目标的步数并一起发送,如 r right r right r right,然后捕获确认焦点到达。
时序与重试
- 应用启动:启动会话后,应用可能需要几秒加载。捕获层级并检查是否有有意义的 UI 元素后再交互。若层级大部分为空或显示启动屏幕,再次捕获后再继续。
- 交互后:若点击或滑动未产生预期变化,重新捕获层级并重试一次交互(元素可能在动画中移动)。若一次重试后仍失败,报告失败而非无限重试。
- 加载状态:若层级显示旋转器或加载指示器,短暂暂停后再次捕获。不要与仍在加载的元素交互。
- 性能:避免添加可能减慢过程的等待延迟。工具设计为动画完成后即完成。
判断成功与失败
验证时区分以下类别:
- 功能缺陷(始终报告):元素不响应点击、导航到错误屏幕、崩溃、数据未显示、缺少预期 UI 元素。
- 视觉/布局缺陷(始终报告):文本重叠、标签截断、元素渲染到屏幕外、颜色错误、对齐损坏。
- 瞬态状态(不作为缺陷报告):加载旋转器、短暂动画、键盘出现/消失。过渡完成后再次捕获。
- 意外退出(始终报告):崩溃、应用退出。通过跟踪进程 ID 并捕获进程标准输出来识别。
- 预期行为(不作为缺陷报告):带占位文本的空状态、表单不完整时禁用的按钮、权限对话框。
错误处理
若应用不可见,重试一次,可能是设备缓慢所致。若点击目标不明确,重新读取层级数据获取正确 hitPoint 坐标。可检查运行时日志进行故障排除。若怀疑时序缺陷,建议主智能体在相关代码中临时添加打印语句以帮助诊断。将问题和建议详细报告回主智能体。
适用场景
适用于 iOS、watchOS、tvOS 等平台的应用设备验证,特别是实现影响 UI 的功能后、调试触摸/交互问题、验证登录等功能是否正常工作。
限制
该技能为子智能体技能,需通过 Agent 工具调用。会话保持打开会占用大量资源,完成后应关闭。应用激活开销较大,仅在必要时使用。tvOS 无触摸屏,坐标点击/滑动不适用。部分 watchOS 按钮仅部分设备支持。