一、基本概念
( 1 ) XCUITest —— Apple 官方提供的 iOS UI 自动化测试框架。
它是 Xcode 的一部分,基于 XCTest 框架开发,用来编写 UI 测试用例。
只能使用 Swift 或 Objective-C 编写测试脚本,执行测试必须在 Xcode 环境中进行,原生、安全、稳定,缺点是:
- 脚本开发门槛高(必须用 Xcode 和 Swift/OC)。
- 编写脚本后不能跨平台。
- 不提供 WebDriver 协议,无法直接用 Appium 或 Selenium 驱动。
( 2 ) WebDriverAgent(WDA) —— Facebook 开源 的一个项目,它的作用是:
- 将 Apple 的 XCUITest 封装成 WebDriver 接口(W3C WebDriver 协议)
- 对外暴露一个 HTTP 服务,让外部工具(比如 Appium)可以通过网络请求控制 iOS 设备。
简单来说:WDA 是一个 “桥梁”,让 Appium 这样的自动化框架可以通过标准协议间接控制 iOS 的 UI 元素。
二、工作流
1.测试脚本(Appium Client) :
使用 Python、Java、JS 等语言编写的 Appium 脚本,调用 AppiumDriver 提供的方法,如 find_element, click, send_keys 等。
2.Appium Server(本地或远程) :
-
监听特定端口(默认是 4723),接收测试脚本发来的 HTTP 请求(WebDriver 协议)。
-
根据请求的 platform(iOS / Android)选择对应的 driver:
a. iOS:调用 WebDriverAgent b. Android:调用 UiAutomator2
3 . WebDriverAgent(iOS 专用 driver) :
c.被 Appium Server 控制并部署到设备上。
d.作为 HTTP 服务运行在 iOS 设备上(默认:8100 端口,可以在启动Appium server时通过以下参数注入端口:--driver-xcuitest-webdriveragent-port 8410)。
e.将 Appium Server 的命令转换成 XCUITest 的调用。
4 . XCUITest:
f.由 WebDriverAgent 间接调用,用于在应用上执行真实的点击、输入、滑动等操作。
三、Appium&WDA工作原理
- Appium
Appium并不能直接控制 iOS 的 UI 元素,因为 iOS 系统不允许未签名的第三方程序直接调用 UI 元素。所以Appium 使用 WebDriverAgent 作为 iOS 平台的驱动组件,借助它来实现控制。
在安装Appium时,例如通过 npm 安装 Appium:npm install -g appium ,实际上会自动包含(或在使用时自动下载)以下内容:
- Appium 主程序(server)
- iOS 驱动(appium-xcuitest-driver)
- WebDriverAgent 项目的完整源码(在 node_modules/appium-webdriveragent 目录中)
也就是说,Appium安装包 已经内置WebDriverAgent 项目代码,并且具备了 自动构建并部署 WDA 的能力,并且 Appium 的 iOS 驱动(xcuitest-driver)能够自动构建、签名、安装并启动 WebDriverAgent 到真机或模拟器上运行。
- WebDriverAgent(WDA)
WDA最终是要 安装到 iOS 设备上运行的(WDA Runner app) ,但它的 源代码和构建逻辑都在你的电脑上,由 Appium 驱动自动执行。
- Appium & WDA 的交互
(1)当运行 Appium 自动化测试并连接 iOS 真机时,Appium 的工作流程为:
1.查找或拉取 WebDriverAgent 源码
a.默认路径:<appium安装目录>/node_modules/appium-webdriveragent
2.使用 xcode build 自动编译 WDA
a.使用提供的 开发者证书签名(需要提前配置 Xcode 的 xcodeConfig 和 teamId)
3.把编译后的 WDA Runner app 安装到 iPhone 上
4.在设备上启动 WDA 服务(监听 8100 端口)
5.Appium Server 与它建立 HTTP 通信,开始转发测试命令
(2)当执行自动化代码时,例如driver.find_element_by_accessibility_id("Login").click(),工作流为:
1.Appium Client ⟶ Appium Server 发送 POST /element 请求
2.Appium Server ⟶ 通过 USB 转发到设备上的 WDA(监听 8100)
3.WDA ⟶ 使用 XCTest 查找元素并执行 .tap()
4.WDA ⟶ 返回 JSON 格式结果
5.Appium Server ⟶ 把结果返回给客户端脚本
总结,在整个 Appium 自动化架构中,Appium Server 是中央调度器,负责接收客户端命令并将其转发给 WebDriverAgent(iOS)或 UiAutomator2(Android)执行。
| 名称 | 角色 | 功能 | 说明 |
|---|---|---|---|
| XCUITest | Apple 原生 UI 测试框架 | 控制 iOS 元素 | 提供系统API、被 WebDriverAgent 调用、执行真实UI操作 |
| WebDriverAgent | iOS driver | 将 XCUITest 封装成 WebDriver 接口 | 被 Appium 调用、运行在设备上,执行 Appium 指令 |
| Appium | 跨平台自动化框架 | 编写/执行自动化测试脚本 | 通过 WebDriverAgent 实现对 iOS 控制 |
| Appium Client | 测试脚本 | 由开发或测试人员编写 | |
| Appium Server | 指挥中心 | 负责调度设备、桥接 WebDriverAgent、接收命令,转发给 WDA |