最近要做 iOS 的自动化框架,考察了很多相关 iOS 自动化技术,最终选定 WebDriverAgent,这个 agent 写的真的很亲民,不论接口协议规范和代码清晰度都很好,方便做二次开发。
WebDriverAgent 也简称 WDA,是一种 iOS 自动化测试的方案,最初由 FaceBook 开发,现在由 Appium 社区团队维护。
熟悉 UI 自动化的同学都应该知道,UI 自动化的核心技术是在端建立一个基于 http 或 socket 的 agent,用于接收 pc 端传递过来的命令并执行命令,这些命令最终通过调用端的 api 来达到操控手机 UI 以及获取 UI 信息的目的。
毫无疑问,WebDriverAgent 也是一样的道理,只是这个名字让人很是疑惑,为啥前缀带了 WebDriver,而不是叫 iOSUIAgent 之类的名字?这是因为 WebDriverAgent 建立之初,它的 http 接口协议都是模仿的 Selenium 的 WebDriver,里面大量的接口都是一样的,当然也有很多是 iOS 特有的命令。
使用方式就不再赘述了,TesterHome 社区有很多相关的讨论,这篇是写的最好的:https://testerhome.com/topics/7220。
关键点:
用 xcode 打开 WebDriverAgent.xcodeproj
编译执行,如果是在模拟器,不需要收费的签名就可以直接跑,如果是真机,则需要使用付费签名,wda 才能安装到手机
启动测试:xcode 上菜单依次点击【Product】-【Test】,或者使用命令行:xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'platform=iOS Simulator,name=iPhone 11 Pro Max'
如果是模拟器,启动就可以使用 wda 了,如果是真机,则需要做一下手机到 PC 的端口映射,使用 iproxy 命令:iproxy 8100 8100
,提示waiting for connection
就表示映射成功了
修改 wda 包名和应用名,如下图所示:
首先要了解 Appium 是怎么用 WDA 的,Appium 其实自己做了一个外部的 wrapper,就是 appium-xctest-driver,它本身对 wda 做了一层包装,其中的一个目的是为了让 appium 的协议都统一化,另外再写了 java-client、Python-client 等包来实现跨语言,这些包提供给用户,让他们能够更方便统一的掉 appium-xctest-driver 提供的接口。
appium 的这套方式不太适合我,封装的太深了,nodejs 框架一层套一层的,很复杂。
我准备自己做一套基于 WDA 的 iOS 自动化测试框架,wda 无非就是一个运行在手机端的 api 服务器,我调试了 99% 的接口,并生成了一个postman 文档,我自己直接实现一个 java-client 来调用这个接口服务就好。
UI 自动化测试框架,无非把握好几个点,首先就是能否获取 UI 控件树,其次能否找控件,再次能否操作 UI 元素,比如输入点击等,WDA 满足所有这些能力,利用这些能力,自己去实现一套 UI 自动化的录制回放逻辑、脚本规则之后,自定义的 UI 自动化测试框架就形成了。