Python + WDA 实现 iOS App UI 自动化测试指南
一、环境准备
- 安装 WebDriverAgent (WDA)
- WDA 是 Facebook 开源的 iOS 自动化测试框架,需通过 Xcode 编译并安装到 iOS 设备。
- 方法一(Mac 环境):通过 Xcode 编译
WebDriverAgent.xcodeproj
,配置开发者签名并运行 Test [2]。 - 方法二(跨平台):使用阿里开源的
tidevice
工具(支持 Windows/Linux/Mac),无需 Xcode 即可启动 WDA 服务(IOS系统14版本后很难搞):
- 方法一(Mac 环境):通过 Xcode 编译
- WDA 是 Facebook 开源的 iOS 自动化测试框架,需通过 Xcode 编译并安装到 iOS 设备。
tidevice -u [设备UDID] wdaproxy -B [WDA_BundleID] --port 8100
- Python 依赖库安装
- 安装
facebook-wda
(WDA 的 Python 客户端库):
- 安装
pip3 install -U facebook-wda
- 可选工具:
* **weditor**:元素定位工具,安装后通过浏览器查看 UI 树:
pip3 install -U weditor
weditor # 启动后选择 iOS,连接 WDA 服务
二、自动化脚本编写
- 初始化客户端
import wda
# 连接 WDA 服务(默认端口 8100)
client = wda.Client("http://localhost:8100")
session = client.session() # 创建会话
或者可以用另一种方式
- 应用操作
- 启动/关闭应用:
session.app_launch("com.example.app") # Bundle ID
session.app_terminate("com.example.app")
启动app的另一种方式
- **获取应用状态**:
print(session.app_current()) # 输出当前前台应用信息
- 元素定位与操作
- 定位方式:支持 ID、Class、XPath、Predicate 等:
# 通过 ID 定位
element = session(id="loginButton")
# 通过 Predicate 定位(复杂条件)
element = session(predicate='label CONTAINS "Submit" AND enabled == true')
- **常用操作**:
element.click() # 点击
element.set_text("test") # 输入文本
element.scroll() # 滚动
element.swipe("left") # 滑动方向
另一种方式和安卓UI自动化uiautomator2的xpath使用类似
- 设备控制
- 返回桌面/锁屏/截图:
client.home() # 返回主屏幕
client.lock() # 锁屏
client.screenshot("screen.png") # 截图保存
三、高级技巧
- 等待机制
- 隐式等待:全局设置元素查找超时时间:
client.implicitly_wait(10) # 单位:秒
- **显式等待**:针对特定条件轮询:
from wda import Wait
Wait(client).until(lambda c: c(id="loading").exists == False)
- 弹窗处理
# 监听弹窗并自动关闭
def handle_alert():
if session.alert.exists:
session.alert.accept() # 或 dismiss()
- 结合 Airtest/Poco
- Airtest:图像识别驱动自动化(跨平台):
from airtest.core.api import connect_device
device = connect_device("iOS:///http://localhost:8100")
device.touch(Template("login_button.png")) # 图像点击
- **Poco**:基于 UI 树的精确控件操作:
from poco.drivers.ios import iosPoco
poco = iosPoco()
poco("Settings").click()
四、常见问题解决
- WDA 启动失败
- 检查设备 UDID 和 Bundle ID:
tidevice list
和tidevice applist
[5]。 - 确保设备信任开发者证书。
- 检查设备 UDID 和 Bundle ID:
- 元素无法定位
- 使用
weditor
确认元素属性是否动态变化 [7]。 - 尝试组合定位条件(如
className+label
)。
- 使用
- 自动化卡顿
- 增加隐式等待时间或优化脚本逻辑 [12]。
五、参考工具与扩展
工具/库 | 用途 | 文档链接 |
---|---|---|
tidevice | 跨平台管理 iOS 设备 | GitHub |
weditor | 可视化元素定位 | GitHub |
Appium | 跨平台自动化测试(替代方案) | 官网 |
通过以上步骤,可快速搭建基于 Python + WDA 的 iOS 自动化测试框架,覆盖从基础操作到复杂场景的自动化需求。