tidevice wda ios 自动化

Posted 西北孤狼一号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tidevice wda ios 自动化相关的知识,希望对你有一定的参考价值。

一、测试架构介绍

    • 通信原理图

  1. 手机端的WDA Runner(WebDriverAgent)类似于appium测试框架中的 UIAutomator Server,将从客户端接收到的控制命令转换为XCUITest 相关API操作,实现对应用界面的控制。WebDriverAgent应用需要通过xcode编译安装。

  1. usbmuxd是苹果提供的一个服务,用于USB和TCP协议之间的转换,实现在没有网络的情况下也可以连接设备,iTunes和Xcode就使用到了这个服务,所以在环境安装中需要在windows上安装一个iTunes。

  1. WDA的启动使用阿里开源的tidevice工具。

  1. Language Bindings为不同语言的测试脚本,比如基于python语言的facebook-wda,基于go语言的gwda等。

2. WebDriverAgent原理分析

WebDriverAgent是Facebook 在2015年的 SeleniumConf 大会上推出了一款ios移动测试框架。它在 iOS 端实现了一个 WebDriver server ,通过这个 server 来实现远程控制 iOS 设备。它主要通过连接XCTest.framework来调用Apple的API实现对设备的操作。

WebDriverAgent采用C/S架构,集成appium使用的WebDriver协议规范,通信协议使用Mobile JSON Wire Protocol。

  1. WDAClient:WDA的客户端,测试库facebook-wda 就是 WDA 的 Python 客户端库,通过HTTP协议(Mobile JSON Wire Protocol)与WebDriverAgent进行通信。

  1. WebDriverAgentRunner:运行在手机上的WDA server,默认监听端口为8100,主要功能包括①接收WDAClient的请求并将操作命令发送给XCTest.framework。②将响应发送给WDA Client

二、tidevice原理分析

前面介绍了iOS的自动化需要通过WebDriverAgent来实现,一种常见的解决方案是使用xcodebuild来启动WebDriverAgent,而xcode需要Mac系统,也就是必须在MAC上进行iOS自动化测试。

tidevice 是阿里开源的一个基于Python的iOS自动化工具,通过逆向iOS通信协议,模拟xcodebuild与手机进行通信,向手机发送特定的指令,来启动WDA,从而可以脱离Mac电脑,能够在Linux、Windows上运行iOS自动化。tidevice基于python实现了libimobiledevice中的功能。

tidevice通过usbmuxd与手机通信来启动WDA,通过建立一个TCP连接到usbmuxd的/var/run/usbmuxd TCP端口,然后usbmuxd将请求发送到USB连接的iPhone上。上面提到的libimobiledevice就是一个跨平台的用于与iOS设备进行通信的库

三、 iOS 设备安装 wda

本文所用的环境:

  • macOS版本:macOS Big Sur 11.4

  • Xcode版本:Version 12.5.1 (12E507)

  • iOS 设备: iPhone8(14.6)

  • Windows系统版本:Windows 11

1、安装Xcode

app store 下载安装iOS开发环境Xcode。

2、下载WebDriverAgent

使用appium维护的WebDriverAgent,项目地址:https://github.com/appium/WebDriverAgent。

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

现在不需要执行下面的脚本了,作者已经删除:

./Scripts/bootstrap.sh

3、Xcode打开WebDriverAgent

双击WebDriverAgent中的WebDriverAgent.xcodeproj文件,这是一个xcode项目文件。 4、Xcode添加开发者帐户

Xcode -> Preference

5、项目配置

设置Team为你添加的帐户,修改Bundle Identifier为唯一名称

设置完成后,选择Scheme为WebDriverAgentRunner

选择Destination为你连接的iPhone。

6、项目构建及测试

然后点击左上角的三角符号进行build,或者点击Product -> Build;

Build成功之后,点击Product -> Test;

可以看到WebDriverAgent安装到了你的iPhone上

点击iPhone上的设置-> 通用 -> 设备管理 信任开发者APP

因为iTunes里面有usbmux驱动,需要安装一下它。

下载安装Windows 版 iTunes方法:https://support.apple.com/zh-cn/HT210384

iTunes安装成功后,连接上你的iPhone:

三、安装tidevice

tidevice用于启动WDA,它可以运行在Windows上,也支持Mac和Linux。项目地址:https://github.com/alibaba/taobao-iphone-device。 要求Python版本3.6+。

    • pip安装tidevice:(推荐安装)

 pip3 install -U "tidevice[openssl]"

2. 查看是否安装成功:

tidevice version
tidevice version 0.4.14

3. 查看设备信息

tidevice info

4.查看安装的WDA应用:

tidevice applist
com.AppStore.NationalFraudCenterHicore 国家反诈中心 2.0.3
com.apple.itunesu iTunes U 3.8.3
com.sweep.auto.xctrunner WebDriverAgentRunner-Runner 1.0
com.apple.store.Jolly Apple Store 517010
com.digitalgd.dgyss 粤省事 1.6.0

5.使用tidevice启动WDA

tidevice -u [设备 udid] wdaproxy -B [wda 的 bundle Id] --port 8100 # 运行 XCTest 并在PC上监听8100端口
  • UDID( Unique Device Identifier)是iOS设备的唯一识别码,可以通过xcode中查看,也可以使用上面介绍的tidevice list命令。

  • Bundle ID(Bundle identifier)为应用 ID,是iOS应用的唯一标识。是你编译WDA应用设置的名称,可通过tidevice applist命令查看。

  • 手机设备中 wda 的默认监听端口为8100,此命令将手机的8100端口映射到了PC上的8100端口。

  • tidevice xctest --debug:可用于查看详细日志

浏览器访问http://127.0.0.1:8100/status 可以看到手机的状态信息。


  "value" : 
    "message" : "WebDriverAgent is ready to accept commands",
    "state" : "success",
    "os" : 
      "testmanagerdVersion" : 28,
      "name" : "iOS",
      "sdkVersion" : "16.0",
      "version" : "14.8"
    ,
    "ios" : 
      "ip" : "192.168.1.19"
    ,
    "ready" : true,
    "build" : 
      "time" : "Dec 30 2022 16:49:22",
      "productBundleIdentifier" : "com.facebook.WebDriverAgentRunner"
    
  ,
  "sessionId" : "3969B065-5957-4493-B33C-F093CB5508D7"

四、常见问题汇总

1、通过tidevice 启动wda 提示: 

request error: ('Connection aborted.', MuxReplyError(<UsbmuxReplyCode.ConnectionRefused: 3>))

检查window 上是否安装了 iTunes, 可以通过爱思助手安装,检查驱动是否安装

2 . 通过 python 执行测试会出现下图异常:

应该是python 中wda没有成功安装,使用:

pip3 install -U facebook-wda

iOS自动化之启动多个WDA

背景

目前iOS的UI自动化的实现,需要Xcode启动WDA的服务。部分的测试用例中会存在两个用户的交互与结果校验,那么我们就需要连接两个iphone手机并启动两个WDA来进行执行对应的自动化脚本

但是Xcode只支持启动一个WDA服务,该怎么办呢

解决方案

通过命令行启动两个WDA服务

xcodebuild -project Downloads/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination “id=00008030-00021C192145802E” USE_PORT=8100 test

xcodebuild -project Downloads/WebDriverAgent/WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination “id=6724d831cfcd34a252299a2caa47b73f337a539b” USE_PORT=8110 test

PS:
需要连接对应的iphone手机
WDA项目的路径、udid、端口的内容需根据实际情况进行修改

Appium配置

如果UI自动化使用的是Appium,那么在命令行成功启动了两个WDA后,我们还需启动两个对应的Appium服务,我们可以通过mac系统中应用程序复制的原理,创建一个Appium的副本

打开两个Appium后,再对第二个Appium的WebDriverAgent Port、Server Port进行设置(上面命令行定义的端口号),与第一个Appium进行区分,最后再启动服务即可

这样,我们就可以实现多个WDA的启动了

以上是关于tidevice wda ios 自动化的主要内容,如果未能解决你的问题,请参考以下文章

iOS自动化之启动多个WDA

iOS自动化之启动多个WDA

Mac + Python3.6 + facebook-wda之IOS自动化:安装facebook-wda库并编写简易自动化测试脚本

Mac下facebook-wda ios自动化测试

基于Appium+WDA+Python搭建IOS自动化测试全纪录(三):真机demo运行

appium 启动ios设备自动化测试+常用操作