APPIUM
简介
Appium(基于XCUITest和Accessibility)是一个开源的、跨平台的自动化测试工具,支持多种语言编写用例(python、java、js)。
原理

在iOS平台中,需要把WebDriverAgent编译安装到手机上,WebDriverAgent用于跟苹果的XCTest框架交互,WebDriverAgent还会起一个服务,监听Appium客户端发送的指令。
整个流程就是这样子: 测试脚本 -> Appium -> 把脚本转化为json数据 -> 传输到WebDriverAgent -> 转化为XCTest可识别的指令 -> 控制app执行
APPIUM在iOS下测试工具的变革
- iOS 9 之前一直以 instruments 下的 UIAutomation 为驱动底层技术(弊端由于 instruments 的限制,单台 mac 只能对应单台设备);
- iOS 9.3 时代推出 XCUITest 工具,用以替代 UIAutomation;
- iOS 10 时代苹果直接废弃了 UIAutomation、Facebook 推出 WebDriverAgent(实现的 server 能够支持单台 mac 对应多个设备,目前Facebook不再维护);
- Appium 在 iOS 9.3 后全面采用 WebDriverAgent 的方案
iOS UI自动化测试核心技术
上文中提到两个关键的技术
- XCUITest
- WebDriverAgent(也称WDA)
XCUITest
在2015 年,Apple 发布了 UI 自动化测试框架 XCUITest 并集成在 Xcode7 中,而 iOS/macOS UI 自动化测试依赖两个核心技术:XCUITest 和 Accessibility。

XCUITest 是集成在 Xcode 中的测试框架,若想使用 UI 测试功能,可以在创建 iOS 项目时勾选 Include Tests 选项,从而使项目具备自动化测试的能力。而 Accessibility 技术,则是 Apple 官方为视障用户提供的一整套使用 iOS/macOS App 的解决方案。
对于 Accessibility 技术,开发人员需要注意的是,XCUITest 框架默认并不能将所有视图元素审查到,只会审查到可以被 VoiceOver 功能读取文字的元素。比如,UIButton 和 UILabel,这些视图对于视障用户而言可以通过语音来获知其内容,而对于 UIImageView、 UIView 这种对于视障人士并不友好的 UIKit 视图元素默认是不会审查到的,所以编码时要另行配置 Accessibility 相关属性,以保证其支持 Accessibility 从而在 UI 自动化查询的元素层级中可见。
基于 XCUITest 框架 和 Accessibility 技术的自动化测试,有利于 App 进行数据一致性校验,但 UI 一致性校验能力较弱。比如,App 可以针对某些数据请求结果或者某个元素是否存在进行校验,而视觉展示效果却仍需要人工介入。
XCUITest框架结构

XCUITest 测试框架 API 主要包含:元素查询(UI Element Queries)相关类型,如 XCUIElementQuery,UI 元素(UI Elements)相关类型,如 XCUIElement,以及测试 App 生命周期类型(Application Lifecycle)类型,如 XCUIApplication。
appium XCUITest 驱动的开发在 appium-xcuitest-driver 仓库进行
WebDriverAgent
WebDriverAgent (也被叫做"WDA") 是 Facebook 管理的项目, Appium 核心团队对项目做了很大的贡献。 WDA是一个运行在 iOS 模拟器或设备上暴露 XCUITest API 的服务,兼容 WebDriver。Appium 的 XCUITest 驱动把 WDA 作为对 Appium 用户不透明的子进程控制, 代理发送给和接受自 WDA 的命令, 并且提供大量额外功能 (比如模拟器控制及其他方法)你可以启动、杀死应用,点击、滚动视图,或者确定页面展示是否正确
- 通过连接 XCTest.framework 调用苹果的 API 执行动作;
- 支持多个设备同时进行自动化;
- Appium官方已经集成(目前已由APPIUM官方进行维护)
./Scripts/bootstrap.sh
这是老版本的启动方式,新版本直接打开WebDriverAgent.xcodeproj(路径/Applications/Appium Server GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent)WDA启动的常用三种方式:
- XCode
- xcodebuild
- tidevice
集成CI
xcodebuild -project /Applications/Appium\ Server\ GUI.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent-bak2/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=fa0c5be2bc4e863e8079f70092dfb35c74071f7f" USE_PORT=8300 test
USE_PORT=8300 指定手机端启动webdriver agent服务时候绑定手机端的端口,默认8100,通过修改端口实现多设备并发执行
-destination 设备id
通过xcode修改默认端口



两种方式都需要添加信任证书
通过tidevice调用 tidevice -u fa0c5be2bc4e863e8079f70092dfb35c74071f7f wdaproxy -B com.facebook.WebDriverAgentRunner.xxxxx.xctrunner --port 8300
常用命令
- tidevice
- libmobiledevice/ideviceinstaller





Comments | NOTHING