Android 自动化做到 95% 稳定后,iOS 端拉胯在 70%——差距几乎全在 WebDriverAgent(WDA) 这一层。WDA 是 iOS 自动化的唯一通道(Apple 没有 Android 那种 ADB 的"万能遥控器"),它的稳定性决定一切。这篇把 WDA 的坑和对应的稳定性解法系统整理一遍。
一、先理解 WDA 是什么(理解错了后面全白搭)
1 | Appium / 脚本 |
关键认知:
- WDA 本身是一个 App:它和你的被测 App 抢系统资源、抢前台,崩溃/被系统杀掉都正常——"WDA 挂了"不是玄学,是 App 生命周期问题;
- XCUITest 是单例的:设备上同时只能有一个 XCTest 会话——WDA 在跑时,你手动点设备可能把会话搞乱(自动化期间设备锁定是铁律);
- 查询视图树 = 全量快照:每次 find 都要 dump 视图树,大页面 dump 一次 1~3 秒——"为什么这么慢"的答案就在这。
二、WDA 的五大坑与解法
坑 1:WDA 启动慢(冷启动 30~60s)
每次会话前装 WDA + 签名 + 启动,这是最大时间黑洞。
1 | 解法(按落地顺序): |
坑 2:WDA 随机崩溃/无响应
症状:Cannot connect to WDA at localhost:8100 或请求超时 60s。
1 | 自动恢复机制(session 层兜底): |
经验:WDA 崩溃高发于"大列表快速滚动"和"连续弹窗"场景——滚动速度放慢(步长减半)+ 每 N 步主动 health check,比崩溃后恢复更省时间。
坑 3:元素找不到(视图树延迟)
iOS 视图树更新有延迟,动画中/转场中 find 大概率拿不到目标。
1 | # 三层等待策略 |
wait_tree_stable(等视图树"静止")是 iOS 特有的有效手段——它等的是"动画/转场结束",比固定 sleep 准,比单次 find 重试稳。
坑 4:坐标与多窗口(alert/keyboard/SpringBoard 通知)
1 | iOS 的"窗口"概念和 Android 不同: |
坑 5:真机资源与发热
iOS 真机连续跑 2 小时后性能衰减明显(降频 + 后台清理 WDA):
- 批次间冷却 10 分钟(和 Android 一样的规矩,iOS 更敏感);
- 长任务中 WDA 被系统杀掉的概率随温度上升 → 保活池的 health check 间隔从 60s 收到 30s;
- 夜间大批量跑,设备插电但限充 80%(满电高温是 iOS 设备杀手)。
三、用例层:iOS 适配清单
| 项 | Android 习惯 | iOS 要求 |
|---|---|---|
| 首页识别 | 看包名 | 看 bundle id + SpringBoard 判断 |
| 返回 | 系统返回键 | swipe 或找导航栏返回按钮(没有全局返回) |
| 多语言 | resource-id 不变 | 文案定位随语言变 → 优先 identifier |
| 深色模式 | 部分控件变 | 截图对比类用例固定系统主题(写进用例前置) |
| 权限弹窗 | 系统弹窗 | 首次必须处理(定位/通知/相机),自动化前重置(atc/配置文件) |
四、小结
iOS 自动化的稳定性 = WDA 保活池(启动 0s + 崩溃自动恢复阶梯)+ 视图树静止等待(替代 sleep)+ 窗口归位(alert/键盘/通知统一处理)+ 设备节奏(冷却/限充/证书巡检)。WDA 是 iOS 自动化的"地基",地基不稳,上层用例写得再漂亮也是 70% 稳定性——先把 WDA 当"需要运维的服务"来对待,而不是"一个端口"。