iOS自动化测试工具Appium 2022.3 新

1,276 阅读5分钟

Appium

Appium是一个开源的,适用于原生或混合移动应用( hybrid mobile apps )的自动化测试工具,Appium应用WebDriver: JSON wire protocol驱动安卓和iOS移动应用。

这里介绍界面工具的appium环境。

image.png

image.png

一. 前期准备

我这里用的是当前最新版本:Appium: 1.22.2 + inspector:v2022.2.1 与旧版本不同这个两个app安装包。

1. 安装 Appium

桌面端 [Appium Desktop](https://github.com/appium/appium-desktop)
安装包: [releases page](https://github.com/appium/appium-desktop/releases).

image.png

2. 安装检查器

检查员现在作为一个单独的应用程序发布。
请访问 https://github.com/appium/appium-inspector

image.png

二. WebDriverAgent配置

Appium驱动IOS测试原理

Appium选择了Client/Server的设计模式。只要client能够发送http请求给server,那么的话client用什么语言来实现都是可以的,这就是如何做到支持多语言的原因;

Appium扩展了WebDriver的协议,没有自己重新去实现一套。这样的好处是以前的WebDriver API能够直接被继承过来,以前的Selenium(WebDriver)各种语言的binding都可以拿来就用,省去了为每种语言开发一个client的工作量。

  • XCUITest是苹果开发的一个做IOS自动化测试的框架,需要了解些Swift等iOS编程知识
    WebDriverAgent是Facebook开发的一个iOS自动化测试工具,先来看下面的这张原理图:

image.png

  • WDA在Client创建了一个Server,在手机端安装了一个叫作WebDriverAgentRunner 的一个应用;这个应用会接收来自 Server 的指令,并连接底层的XCTest.framwork,让 XCTest.framwork 调用苹果API来操作手机进行自动化

  • 而appium是把WebDriverAgentRunner 给集成进去了,因此实现了appium的跨平台能力

image.png

通过上图我们了解到 Appium 很粗暴的把整个 WebDriverAgent 直接集成到自己的项目里,然后通信机制就走 WebDriverAgent,Appium 其实就提供了一个 Client 端的作用。所以 iOS 9.3 系统之后自动化测试核心是 WebDriverAgent,Appium 就提供了一个 Client 端来写脚本和发送指令。

Appium 自动化架构模式可以用一个抽象的架构表示,就是下面这样的:

image.png

从图中可以看出:

  • Client 端是 Appium 之前本身提供的;
  • Server 端是:WebDriverAgent 和 Instruments;( Appium 直接把 WebDriverAgent 整个集成进来,Instruments 是为了支持 iOS 9.3 之前的系统)
  • 最右边是一个手机
  • 之前 Server 是和 bootstrap.jar 通信,这里 WebDriverAgent 提供了 WebDriverAgentRunner (类似 bootstrap.jar 的功能),WebDriverAgent与之通信;
  • WebDriverAgentRunner 是一个应用,Client 和 server 运行 了之后,WebDriverAgentRunner 会被装到手机上,这个应用会接收来自 Server 的指令,并连接底层的 XCTest.framwork,并告诉XCTest.framwork 操作手机进行自动化。

如何配置 WebDriverAgent

WebDriverAgent通过集成appium进行安装

桌面版安装: WebDriverAgent的路径是: 这里说的是这种 /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

命令行安装: 命令行安装的appium一般安装在/usr/local/bin/appium下, WebDriverAgent将会在路径:/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver/WebDriverAgent/

  1. 配置webdriverAgent

    配置WebDriverAgentLib,选择开发者账号

    配置WebDriverAgentRunner,选择开发者账号

    注意:↓

image.png

Edit Scheme:

image.png

编译运行和test的设备选择:这里选择了模拟器 这里与检察器里的配置有关 image.png

xcode菜单 - Product -> Test

运行成功后,iphone手机上会新建一个无图标的WebDriverAgent的应用,自动打开后马上又返回桌面

而在xcode控制台会打印如下日志:里面有IP地址与端口号 

image.png 在浏览器上输入 http://(ip地址):(端口号)/status
如果网页上返回一些json格式的数据,说明运行成功 模拟器就在电脑端查看 image.png 手机运行agent就在手机浏览器

image.png

注意的点

  1. product bundle identify、开发者组织、目标设备 是否修改。否则start session 报WebDriverAgent的异常

  2. 桌面安装版不用单独下载WebDriverAgent,找对路径就ok。

三、经历的异常问题

1. 不再是一个app

Appium: 1.22.2 + inspector:v2022.2.1,不再是一个app,需要单独下载

2. No route found for /sessions

Appium inspector -> start session后在Appium中报错:No route found for /sessions

[HTTP] <-- GET /sessions 404 6 ms - 211
[HTTP] 
[HTTP] --> GET /sessions
[HTTP] {}
[HTTP] No route found for /sessions

解决: 在Appium inspector中的Remote Path中配置/wd/hub

image.png

3. Appium vendor prefixes

Automatically add necessary Appium vendor prefixes on start 自动加前缀,确认勾选

image.png

4. 参数配置json取值

Desired Capabilities 参数配置

ios必要的几个参数
{
  "appium:automationName": "XCUITest",           //固定
  "platformName": "iOS",                          //固定
  "appium:platformVersion": "15.1",
  "appium:deviceName": "iPhone 13 Pro",
  "appium:app": "/Users/电脑名称/Downloads/app名称.app",
  "appium:udid": "10FC370C-C73A-4720-BDFD-4F5BD7206973"
}
  • platformVersion:当前版本支持 8.0, 15.0, 8.3, 14.5, 7.4, 15.2 ,如果是真机iPhone 需要确认手机系统版本,否则报错

image.png

  • deviceName、uuid :xcode 查看,XCode菜单 Windows -> Devices and Simulator

image.png

  • app 要测试的app的安装包文件绝对路径,文件以 .app 结尾
    我这里将包从.../Xcode/DerivedData/... 里取了拷了出来到下载文件夹

Appium inspector

检察器的正常工作前两个必要条件:

  1. 在 webdriverAgent启动后,localhost:??/stauts确认启动后。

  2. 然后通过Appium Server GUI启动 0.0.0.0 4723 启动服务

  3. 检察器的作用在于检查 capacity 配置的正确性,提供界面化的工具 这里ye可以启动Python,通过pyton代码启动服务

a. 配置参数,排除一切错误后 正常启动会话 image.png

b. 可以查看控件的oath name value id 等信息

image.png

c. 录制操作步骤 可以选自己擅长的语言 通常 Java 或者 python, image.png

d. 到这里就基本完成