最早知道 WebDriverAgent 还是通过社区里的一篇文章 WebDriverAgent 简介(PS:社区真是伟大,什么都有)
通过这篇文章希望能让初次接触 WDA 的你,少走一些弯路。

WDA 在 Github 的首页上有一个很简单的安装说明 https://github.com/appium/WebDriverAgent,参考这个,我再增加一些配图,以及自己使用过程中的一些体会。

开始

尽量升级 Xcode 到最新版,保持 iPhone 的版本大于 9.3

从 github 上下载代码

git clone https://github.com/appium/WebDriverAgent

运行初始化脚本

./Scripts/bootstrap.sh

该脚本会使用Carthage下载所有的依赖,使用 npm 打包响应的 js 文件

执行完成后,直接双击打开WebDriverAgent.xcodeproj这个文件。

设置证书

因为安装到真机上都是需要证书签名的,用免费的证书我没有搞定,最后用的还是 99 美元的开发者证书

画圈的地方,从左向右依次点击。最后 Team 那一栏,选择你买到的开发者证书帐号。(个人证书也可以)

接着在 TARGETS 里面选中 WebDriverAgentRunner,用同样的方法设置好证书

如果是免费版的个人证书,还需要修改下 WebDriverAgent 的 BundleID,随便加点后缀,只要不跟其他人的重名就好(这里参考了 macaca 的一篇文章 https://testerhome.com/topics/8085

运行与测试

菜单栏选择目标设备

Scheme 选择 WebDriverAgentRunner

最后运行 Product -> Test

一切正常的话,手机上会出现一个无图标的 WebDriverAgent 应用,启动之后,马上又返回到桌面。这是很正常的不要奇怪。

此时控制台界面可以看到设备的 IP。如果看不到的话,使用这种方法打开

常见问题

问题 1:

解决方法:
遇到这个问题,说明手机上已经有一个 WebDriverAgent 的应用了,只是 BundleID 不一致,需要先将手机上的卸载掉,重新运行 Product -> Test

问题 2:

解决方法:
提示其实已经说了,进入 设置 通用 设备管理 开发者应用 然后点击信任,之后再重新运行一遍 Product -> Test

端口转发

有些国产的 iPhone 机器通过手机的 IP 和端口还不能访问,此时需要将手机的端口转发到 Mac 上。

# 使用--HEAD安装最新版本
$ brew install libimobiledevice --HEAD
$ iproxy 8100 8100

使用iproxy --help 可以查到更具体的用法。 这时通过访问http://localhost:8100/status确认 WDA 是否运行成功。

而 inspector 的地址是http://localhost:8100/inspector, inspector 是用来查看 UI 的图层,方便写测试脚本用的

使用终端替代 Xcode

通常来说为了持续集成,能够全部自动化比较好一些

# 解锁keychain,以便可以正常的签名应用,
PASSWORD="replace-with-your-password"
security unlock-keychain -p $PASSWORD ~/Library/Keychains/login.keychain

# 获取设备的UDID
UDID=$(idevice_id -l | head -n1)

# 运行测试
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$UDID" test

其他问题

论坛里有帖子说要修改 BundleID,我试了试,就算不改也挺正常的。
还有一些奇怪的问题,比如

执行./Scripts/bootstrap.sh 提示 KeyError: 'devices'

这个应该是脚本有问题,解决方式就是删掉点代码

function fetch_and_build_dependencies() {
  echo -e "${BOLD}Fetching dependencies"
  assert_has_carthage
  if ! cmp -s Cartfile.resolved Carthage/Cartfile.resolved; then
    runtimes_with_devices=`xcrun simctl list -j devices | python -c "import sys,json;print(' '.join(map(lambda x: x[0], filter(lambda x: len([y for y in x[1] if y.get('availability') == '(available)' or y.get('isAvailable')]) > 0, json.load(sys.stdin)['devices'].items()))))"`
    platforms=(iOS)
    if echo "$runtimes_with_devices" | grep -q tvOS; then
      platforms+=(tvOS)
    else
      echo "tvOS platform will not be included into Carthage bootstrap, because no Simulator devices have been created for it"
    fi
    platform_str=$(join_by , "${platforms[@]}")
    carthage bootstrap $USE_SSH --platform "$platform_str" $NO_USE_BINARIES
    cp Cartfile.resolved Carthage
  else
    echo "Dependencies up-to-date"
  fi
}

改成

function fetch_and_build_dependencies() {
  echo -e "${BOLD}Fetching dependencies"
  assert_has_carthage
  if ! cmp -s Cartfile.resolved Carthage/Cartfile.resolved; then
    platforms=(iOS)
    platform_str=$(join_by , "${platforms[@]}")
    carthage bootstrap $USE_SSH --platform "$platform_str" $NO_USE_BINARIES
    cp Cartfile.resolved Carthage
  else
    echo "Dependencies up-to-date"
  fi
}

其他中的其他

  1. Failed to authorize rights (0x1) with status: -60007
  2. The bundle “WebDriverAgentRunner” couldn’t be loaded because it is damaged or missing necessary resources

在这个官网 Wiki 里面可以找到解决办法 https://github.com/facebook/WebDriverAgent/wiki/Common-Issues

如果汗流浃背,弄了很久还是没搞定。尝试下这些步骤

  1. git pull更新 WebDriverAgent 的代码
  2. 卸载手机上的 WebDriverAgent
  3. 更新 Xcode
  4. 更新 Mac 系统
  5. 重启 Mac

结尾

最后附上基于 Python 自动化框架地址

Xcode 问题多多,愿 WDA 与你同在。


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