搭建iOS App自动化环境

一、测试结构介绍

在这里插入图片描述

  1. 手机端的WDA Runner(WebDriverAgent)类似于appium测试框架中的 UIAutomator Server,将从客户端接收到的控制命令转换为XCUITest 相关API操作,实现对应用界面的控制。WebDriverAgent应用需要通过xcode编译安装。
  2. usbmuxd是苹果提供的一个服务,用于USB和TCP协议之间的转换,实现在没有网络的情况下也可以连接设备,iTunes和Xcode就使用到了这个服务,所以在环境安装中需要在windows上安装一个iTunes。
  3. WDA的启动使用阿里开源的tidevice工具。
  4. Language Bindings为不同语言的测试脚本,比如基于python语言的facebook-wda,基于go语言的gwda等。
WebDriverAgent原理分析

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

WebDriverAgent采用C/S架构,集成appium使用的WebDriver协议规范,通信协议使用Mobile JSON Wire Protocol。
WDAClient:WDA的客户端,测试库facebook-wda 就是 WDA 的 Python 客户端库,通过HTTP协议(Mobile JSON Wire Protocol)与WebDriverAgent进行通信。
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设备进行通信的库。

以上的测试框架介绍摘自这位老哥的内容: 测试开发小记

二、准备环境

工具及系统版本信息描述
macOS12.4macOS系统
Xcode13.4macOS开发工具
iOS设备iPhone 6 12.1iOS测试设备
WebdriverAgentv3.14.0iOS通信服务
tidevice0.7.14Windows逆向通信iOS工具
facebook-wda1.4.6iOS测试框架
weditor0.6.5查看UI元素工具
iTunes12.12.4Windows连接苹果设备工具
下载WebDriverAgent

打开以下链接,下载WebdriverAgent,由于我们这里的测试设备和编译工具版本限制,这里 选择3.14版本
Download WebDriverAgent

安装Xcode

打开app store然后搜索Xcode进行安装
在这里插入图片描述
安装完成后给Xcode,添加开发者账户Xcode–>Preference–>Accounts,添加一个开发者账号
在这里插入图片描述
开打苹果官网开发网站苹果开发官网,登录该开发者账号->Certificates, Identifiers & Profiles->Devices,确保要测试的Device的IDENTIFIER已添加,如果没有需要添加
在这里插入图片描述

连接iOS测试设备

将iPhone连接到windows机器,这个时候虚拟机会弹出将当前的USB设备连接到主机还是虚拟机,这里我们选择虚拟机,然后点击确定
在这里插入图片描述
连接成功后会如下显示
在这里插入图片描述

编译WebDriverAgent

将下载好的WebDriverAgent拷贝到macOS后然后直接双击WebDriverAgent.xcodeproj文件
在这里插入图片描述
第一步选择WebDriverAgent->Info,设置iOS Development Target,由于测试iPhone系统是12.5.5,这里我们选择12.0即可
在这里插入图片描述
Build Settings->Deployment (unnamed domain)->iOS Deployment Target->iOS 12.0,此处可能不太准确
在这里插入图片描述
Build Settings->Packaging->Product Bundle Identifier->设置唯一的Bundle Identifier(后续都使用这个Bundle)
在这里插入图片描述
第二步选择WebDriverAgentLib->General, Bundle Identifier为刚刚设置唯一的Bundle,Deployment Info设置为iOS 12.0
在这里插入图片描述
WebDriverAgentLib->Signing&Capabilities,勾选Automatically manage signing, Team选择开发者账户,Bundle Identifier填写之前设置的唯一Bundle
在这里插入图片描述
WebDriverAgentLib->Build Settings,设置Deployment和Packaging
在这里插入图片描述
在这里插入图片描述
第三步设置WebDriverAgentRunner,首先打开Signing&Capabilities
在这里插入图片描述然后同样设置Build Settings当中的Deployment和Packaging
在这里插入图片描述
在这里插入图片描述
WebDriverAgentRunner->Info->Bundle Identifier,继续填写保持一致的Bundle
在这里插入图片描述
第四步设置Build程序
在这里插入图片描述
第五步选择要build的设备
在这里插入图片描述
在这里插入图片描述
第六步,点击Build
在这里插入图片描述
Build成功后查看状态
在这里插入图片描述
在这里插入图片描述

Build成功后点击Test,这个时候测试设备上WebDriverAgentRunner-Runner已成功安装

设置WebDriverAgentRunner-Runner

打开iPhone设置->通用->设备管理->信任开发者App
在这里插入图片描述

Windows安装iTunes

访问官网下载iTunes: Download iTunes,选择Windows10 64位下载并安装
安装完成后点击左上角的手机图标,确认windows已连接成功
在这里插入图片描述

安装tidevice

该工具要求python环境3.6+
切换到你的项目目录,使用pip3命令来安装tidevice,安装成功后设置全局环境变量

pip3 install -U "tidevice"

使用以下命令查看tidevice是否安装成功

tidevice version
tidevice version 0.7.14

查看当前设备是否可以列举出

tidevice list
UDID                                      NAME     MarketName    ProductVersion    ConnType
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  iPhone6  iPhone 6      12.5.5            usb

查看安装应用

tidevice applist

使用tidevice启动WDA

tidevice -u [设备 udid] wdaproxy -B [wda BundleID通过tidevice applist读取] --port 8100

在这里插入图片描述
运行成功后打开浏览器访问: http://127.0.0.1:8100/status
在这里插入图片描述
这个时候可以测试一下tidevice功能 ,打开iOS的设置

tidevice launch com.apple.Preferences

运行以上命令如果可以打开设置则通信成功

获取UI元素

使用和Android一样的元素捕捉工具weditor,项目内安装weditor

pip3 install -U "weditor"

安装完成后,项目内直接运行weditor,如果未设置项目路径为全局环境变量,则无法在其他路径运行
在这里插入图片描述

facebook-wda自动化

facebook-wda基于python语言,没有像appium那样启动一个中间服务appium server,这也是appium支持多语言的原因。facebook-wda相比appium更加简洁,功能也比较多,appium有的功能基本都提供了。
安装

pip3 install -U facebook-wda

测试:

import wda

c = wda.Client('http://localhost:8100') # 8100为启动WDA设置的端口号
c.session().app_activate("com.apple.Preferences")  # 打开设置

如果这两行代码运行完iPhone的设置被打开了,则成功

以上iOS的自动化测试环境搭建完成

PS:之前也试过使用Appium进行自动化,但是使用过程中发现Appium的捕捉UI工具Start Session始终连接不上,同时WDA is not response in 30 second, check again after 1s,折腾好久也没找到解决办法,也许是WDA安装的还是有问题吧,如果有知道的也可以告诉我一声

Logo

鸿蒙生态一站式服务平台。

更多推荐