最近要做 iOS 的自动化框架,考察了很多相关 iOS 自动化技术,最终选定 WebDriverAgent,这个 agent 写的真的很亲民,不论接口协议规范和代码清晰度都很好,方便做二次开发。

WebDriverAgent 的由来

WebDriverAgent 也简称 WDA,是一种 iOS 自动化测试的方案,最初由 FaceBook 开发,现在由 Appium 社区团队维护。

熟悉 UI 自动化的同学都应该知道,UI 自动化的核心技术是在端建立一个基于 http 或 socket 的 agent,用于接收 pc 端传递过来的命令并执行命令,这些命令最终通过调用端的 api 来达到操控手机 UI 以及获取 UI 信息的目的。

毫无疑问,WebDriverAgent 也是一样的道理,只是这个名字让人很是疑惑,为啥前缀带了 WebDriver,而不是叫 iOSUIAgent 之类的名字?这是因为 WebDriverAgent 建立之初,它的 http 接口协议都是模仿的 Selenium 的 WebDriver,里面大量的接口都是一样的,当然也有很多是 iOS 特有的命令。

WebDriverAgent 的初步方式

使用方式就不再赘述了,TesterHome 社区有很多相关的讨论,这篇是写的最好的:https://testerhome.com/topics/7220

关键点:

  1. 用 xcode 打开 WebDriverAgent.xcodeproj

  2. 编译执行,如果是在模拟器,不需要收费的签名就可以直接跑,如果是真机,则需要使用付费签名,wda 才能安装到手机

  3. 启动测试:xcode 上菜单依次点击【Product】-【Test】,或者使用命令行:xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'platform=iOS Simulator,name=iPhone 11 Pro Max'

  4. 如果是模拟器,启动就可以使用 wda 了,如果是真机,则需要做一下手机到 PC 的端口映射,使用 iproxy 命令:iproxy 8100 8100,提示waiting for connection就表示映射成功了

  5. 修改 wda 包名和应用名,如下图所示:

image-20201207163543341

  1. 打包:注意当 build 构建成功后,就自动打包成功了(小白的我一直找不到打包的入口),找到包的方法如下
    1. 点击工程目录的 Products - WebDriverAgentRunner.xctest
    2. 在右侧 Identity and Type 复制一下 Full Path
  2. 同一个 wda 包能否跑在不同的手机?我记得是需要手机要做个注册的,TODO

怎么使用 WebDriverAgent

首先要了解 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 自动化测试框架就形成了。


↙↙↙阅读原文可查看相关链接,并与作者交流