@codeskyblue

WDA 都这么好用了,为什么都还在芝芝不倦的用 Appium 里的 UIAutomation 呀

我也是这样认为的。其实从 XCUITesting 出来之后,UIAutomation 就面临退休的境遇,不过 XCUITesting 的声音也不够响亮,反倒是 WDA 出来后,引得一致好评,苹果的自动化测试工具的宿命就是那么悲惨 🙀

作为移动端 UI 自动化测试霸主的 Appium,其实一早就把 WDA 纳入了它的麾下。看 appium-xcuitest-driver 就知道了。我估计等 ios 10 发布,WDA 就会成为 Appium 的标配吧。

+      if (caps.platformVersion) {
+        let majorVer = caps.platformVersion.toString().split(".")[0];
+        if (majorVer >= 10) {
+          log.info("Requested iOS support with version >= 10, using XCUITest " +
+                   "driver instead of UIAutomation-based driver, since the " +
+                   "latter is unsupported on iOS 10 and up.");
+          return XCUITestDriver;
+        }
+      }

但是目前来看,似乎在 Appium 里面使用 WDA 的人不多,看官方也没有怎么使用的文档,只能从代码里一窥。

// we don't necessarily have an `automationName` capability,
if (caps.automationName) {
  if (caps.automationName.toLowerCase() === 'selendroid') {
    // but if we do and it is 'Selendroid', act on it
    return SelendroidDriver;
  } else if (caps.automationName.toLowerCase() === 'xcuitest') {
    // but if we do and it is 'XCUITest', act on it
    return XCUITestDriver;
  } else if (caps.automationName.toLowerCase() === 'youiengine') {
    // but if we do and it is 'YouiEngine', act on it
    return YouiEngineDriver;
  }
}

所以你现在想用下 WDA,可以把 automationName 设置为 XCUITest。 这样就可以使用 XCUITestDriver 了。

原理很简单:只要看看 appium/node_modules/appium-xcuitest-driver/lib/webdriveragent.js 这个 js 文件就知道了。大致如下:

  1. 看看有没有传入 WDA 的路径:BOOTSTRAP_PATH 和 AGENT_PATH,如果没传,就用 Appium 自带的。
  2. ./Scripts/bootstrap.sh 一把。 这个是 WDA 自己的脚本,获取一些依赖等等
  3. 使用 XCodebuild 命令把 WDA 运行起来。就是下面这个命令了:
xcodebuild -project WebDriverAgent.xcodeproj \
          -scheme WebDriverAgentRunner \
          -destination 'platform=iOS Simulator,name=iPhone 6' \
          test

之后,还是和以前一样,客户端命令传过来,直接 proxy 进 WDA 的服务器即可。目前很多 API 还不是很好用。希望官方出一个指导意见。不过好像 @chenhengjie123 哥哥自己搞了一套 WDA 的封装,可以让他分享下。另外, @xdf 的 macaca 也已经集成了 WDA, @codeskyblue 的 atx 也支持 WDA,大家都可以试试。


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