App 自动化测试调研

App 自动化测试调研

App 自动化测试的价值

App 自动化测试在软件开发过程中扮演着重要的角色,具有以下几个方面的价值:

1.提高测试效率和覆盖率:自动化测试可以执行大量的测试用例,覆盖各种功能和场景,相比手动测试可以节省大量的时间和人力资源。自动化测试可以在短时间内运行大量测试,快速发现潜在的问题和缺陷,提高测试的效率和覆盖率。

2.增强测试准确性和一致性:自动化测试可以消除人为的错误和测试的主观性,确保测试的准确性和一致性。自动化测试脚本可以精确地模拟用户操作和测试场景,避免了人为疏忽和遗漏,提高了测试的可靠性。

3.加速发布周期:通过自动化测试,可以在应用程序开发周期的早期阶段就进行测试,快速发现和修复问题。这样可以减少后期修复的成本和风险,加速应用程序的发布周期,提高产品交付的速度。

4.支持持续集成和持续交付:自动化测试是持续集成和持续交付过程中的关键环节。通过集成自动化测试到 CI/CD 流程中,可以自动化执行测试用例,及时发现问题,确保每次代码提交后的应用程序的质量和稳定性。

5.提高软件质量和用户体验:自动化测试可以发现应用程序的潜在缺陷和问题,帮助开发团队及时修复,并提高软件的质量和稳定性。通过减少崩溃、功能错误和性能问题,可以提升用户的满意度和体验。

6.降低成本和风险:自动化测试可以降低测试过程中的人力成本和时间成本,同时也减少了人为错误的风险。通过自动化测试,可以在较短的时间内覆盖更多的测试用例,减少人为操作的误差,并提供更加可靠的测试结果,从而降低了测试的成本和风险。

App 自动化测试技术选型

工具名称 被测系统 测试 脚本语言 支持 H5 跨应用 稳定性 SDK 自带
Appium Android, iOS 功能 Java/Python/JS/C/C##/Perl 支持 可以 一般
Airtest Android, iOS 功能 Python 支持 可以 稳定
Macaca Android, iOS 功能 Java/Python/JS 支持 可以 稳定
Calabash Android, iOS 功能 Ruby 支持 可以 一般
Uiautomator2 Android 功能 Java 支持 可以 稳定
Robotium Android 功能 Java 支持 可以 稳定
ATX Android 功能 Python 一般 可以 一般
Uiautomation iOS 功能 JS 支持 可以 稳定 XCode 自带
XCUITest iOS 功能 Swift/Objective-C 支持 可以 稳定
WDA iOS 功能 Swift/Objective-C 支持 可以 稳定

主流自动化测试框架介绍

AirtestProject简介:

Airtest Project是一款由网易研发并开源的自动化测试框架,相比于其他的自动化测试框架,主要有如下两个优势:

  • 大幅度降低自动化脚本的编写和维护成本

Airtest Project希望能够通过一种所见即所得的方式完成脚本的录制,即使测试人员不会编程不懂脚本,也可以通过正常用户的点击拖拽等操作,自动完成脚本的录制,从而大幅度降低企业和项目的自动化维护成本。

  • 解决游戏测试的痛点

Airtest Project希望能够通过对游戏的不同引擎做支持,成为一个真正意义上的跨引擎跨平台的自动化测试平台。

特点:

  • 跨平台:Windows、Android,iOS,Unity3D、cocos2dx、UE4和Egret等
  • 一体化方案:AirtestIDE 一个IDE搞定所有配置环境
  • 可基于图像识别,也可基于UI控件识别
  • 支持自动录制生成自动化测试脚本
  • 使用方便,简单易上手

架构图


架构图.png

可以看到,底层的主要测试框架主要是Airtest和Poco,二者的区别在于:

Airtest:基于Python的、跨平台的UI自动化测试框架,基于图像识别原理,适用于游戏和App。
Poco:基于UI控件搜索的自动化测试框架,其核心优势是除了对Android、IOS之外,对游戏也是支持的,同时也支持微信小程序、微信小游戏和H5应用。

整套框架配备了非常实用的IDE,通过AirtestIDE, 可以轻松的完成脚本的录制、测试任务的执行以及最后测试报告的生成。

Appium 简介:

Appium是一款开源的自动化测试工具,支持IOS、Android、Windows和Mac应用。

跨平台:
appium可以在OSX,Windows以及Linux桌面上运行。

跨语言:
appium采用了C/S的设计模式,扩展了WebDriver协议,因此Client用Python、Java、Js/Nodejs、Ruby、OC、C#等各种语言来实现。

原理介绍:
Appium的核心是一个遵守REST设计风格的Web服务器,他会用来接受客户端的连接和指令。由于统一的接口设计,客户端便可以用多种语言来实现,从而用自己喜欢的语言来实现测试用例。

服务端收到测试指令后会发送给设备,在设备层则使用了设备商提供的原生测试框架,比如IOS的XCUITest Driver和UIAutomation Driver, 安卓的UIAutomator和UIAutomator2等等。

特点:

  • 跨语言:Java、Python、NodeJS 等。
  • 跨平台:Android、iOS、Windows、Mac
  • 支持自动录制生成自动化测试脚本
  • 配置环境复杂,上手有难度

架构图


架构图.png

Appium官网: http://appium.io/
Appium Github主页: https://github.com/appium/appium

AirtestProject项目简介

AirtestProject是由网易游戏推出的UI自动化测试解决方案,项目构成如下:

1.Airtest框架

Airtest 是一个跨平台的、 基于图像识别 的UI自动化测试框架,适用于游戏和App,支持平台有Windows、Android和iOS:
Airtest源码
Airtest API文档

2.Poco框架

Poco 是一款 基于UI控件识别 的自动化测试框架,目前支持Android原生、iOS原生、Unity3D、cocos2dx、UE4和Egret等平台,也可以在其他引擎中自行接入poco-sdk来使用。

Poco 源码
Poco API文档

3.AirtestIDE

AirtestIDE 是一款跨平台的 UI自动化测试编辑器 ,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码。

官方下载网址
AirtestIDE使用文档

4.手机集群解决方案-DeviceFarm

DeviceFarm 是网易推出的自动化测试集群解决方案,它是软硬件一体化方案,包含设备集群建设、集群设备批量维护管理、监控报警和云端真机等功能,可以为您在企业内部搭建稳定高效的设备管理平台, 提升设备利用率,赋能自动化测试流程搭建:

DeviceFarm集群解决方案

5.Airlab云测试平台

Airlab云测试平台支持用例管理、脚本管理、任务预约、任务调度、云端报告等功能,可以快速构建企业自动化测试全流程,支持ios和安卓的回归测试及兼容测试。

Airlab云测试平台

Airtest+Poco快速上手

1.简介

AirtestIDE 是一个跨平台的UI自动化测试编辑器,适用于游戏和App。

  • 自动化脚本录制、一键回放、报告查看,轻而易举实现自动化测试流程
  • 支持基于图像识别的Airtest框架,适用于所有Android/iOS/Windows应用
  • 支持基于UI控件搜索的Poco框架,适用于Unity3d,Cocos2d与Android/iOS App等多种平台
  • 能够运行在Windows、MacOS、Linux平台上

2.安装

目前AirtestIDE提供了Windows、Mac和Linux的客户端,请从官网下载,解压即用。(关于Linux平台,只有1.2.3及更低版本的AirtestIDE支持,所以我们 更建议在Windows和Mac平台上使用我们的AirtestIDE 。)

3.连接设备

AirtestIDE目前支持测试Android/Windows/iOS上的应用,其他更多平台的支持正在开发中。
无论是Android/iOS手机,还是Windows窗口,在Airtest中都将它视为一个设备,接下来我们将演示如何连接一个设备。

1)连接Android手机

通过ADB连接你的电脑和Android手机,即可开始调试Android应用。ADB是Google官方提供的Android调试工具。AirtestIDE依赖ADB与安卓设备进行通信。

打开AirtestIDE,按照以下步骤进行连接:

  • 打开手机设置-开发者选项-USB调试开关,参考安卓官方文档
  • 在AirtestIDE设备面板中点击refresh ADB按钮,查看连接上的设备
  • 如果没有显示出设备,试试restart ADB,如果还不行,参考FAQ文档进行问题排查
  • 能够成功看到设备后,点击对应设备的Connect按钮,进行初始化
1.gif

手机连接成功后,即可在AirtestIDE中看到手机屏幕的镜像显示,并对手机画面进行实时操作

如果手机连接失败,请先参考FAQ文档进行问题排查。若依然不成功,请将手机型号和AirtestIDE后台报错提交到Github Issue,开发人员会尽快修复。由于Android手机的碎片化问题严重,我们非常感谢您的反馈可以帮助这个项目做的更好。

2)连接Windows窗口

对于Windows桌面程序的测试,AirtestIDE可以将被测窗口嵌入,方便脚本录制和调试。

  • 在AirtestIDE设备面板中点击选择游戏画面按钮
  • 将鼠标移动到被测程序的窗口上,会显示红色边框,将对应的窗口框出
  • 单击鼠标左键即可将对应的窗口嵌入到AirtestIDE中
  • 也可以点击搜索窗口 按钮,选择对应title的窗口,然后点击连接
2.gif
3)连接iOS手机

要连接一台iOS手机,你需要先准备好一台安装了Xcode的Mac电脑,连接方法参考文档

ios.png
ios.png

4. 录制自动化脚本

在连上设备后,我们可以开始录制自动化测试脚本了,在接下来的内容中,我们将会使用一台Android设备上的一款Unity游戏应用,给大家演示如何录制脚本。

1)模拟输入

让我们先从最常用的模拟点击开始吧,模拟点击的意思就是,模仿你的操作去点击设备上的某个指定位置。

① 基于图像识别

目前我们支持通过图像识别的方式,找到你想要点击的位置并进行操作,这是基于Airtest这个框架实现的。

我们可以先看看如何自动录制脚本:点击AirtestIDE左侧的Airtest辅助窗上的 录制 按钮,然后随着你在设备窗口上操作手机,代码会自动生成在代码窗口中。

3.gif

马上来验证一下,点击运行按钮运行你的第一个自动化脚本吧!

如果你觉得自动录制生成的图标不够精确,还可以点击Airtest辅助窗上的touch按钮,然后在设备窗口上框选精确的图标,也可以自动生成一条touch语句。

4.gif

类似的模拟输入操作还有滑动:点击swipe按钮,在设备窗口上框选精确的图标作为滑动起点,然后点击滑动终点位置,即会自动生成一个swipe语句。

其他模拟输入的API包括:

  • text:文字输入
  • keyevent:按键输入,包括(HOME/BACK/MENU等)
  • sleep:等待
  • snapshot:截屏
② 基于UI控件

如果你发现图像识别不够精确,还可以使用基于UI控件搜索的方式进行自动化测试,与刚才的Airtest不同,这是Poco这个框架实现的功能。

目前Poco直接支持Unity3d、Cocos2d、白鹭引擎等多种游戏引擎,以及Android/iOS原生App。

如果是Android/iOS原生应用,是即插即用的,无需接入SDK。但由于游戏引擎使用OpenGL等图形接口直接渲染,而没有使用Android原生的UI系统,我们需要与游戏的Runtime进行通信获取整个UI结构。

我们提供了非常方便的SDK接入方法,点这里查阅目前支持的平台列表,以及如何为你的项目接入Poco。

如果你的项目使用的引擎或平台不在文档中,我们同样支持自行扩展SDK

接入完成后我们即可开始。手机启动游戏,在AirtestIDE中的 Poco辅助窗切换模式至对应引擎类型 ,即可看到整个UI结构。

5.gif

点击录制按钮,然后随着你的鼠标操作,会自动生成Poco语句到脚本编辑框中。

6.gif

同样,你也可以通过UI树形结构更精确的检视UI控件,双击节点自动生成Poco语句,或者自行选择更好的写法。

自动录制出的语句不一定能够适应所有场景,采用更合理的选择器编写代码,通常会增强整个自动化脚本的健壮性和可读性,这是门学问

7.gif

录制完脚本后记得运行试试效果。

对于Android/iOS的原生应用来说,不需要接入SDK即可使用,例如在连上Android手机后,将Poco辅助窗的模式切换至Android,能可以看到整个UI树形结构。

8.gif
2)框架信息

上述两种UI识别方式,分别是基于两个框架:

基于图像识别的Airtest框架
基于UI控件搜索的Poco框架
这两个框架都是由我们团队开发的Python第三方库,在实际项目使用经验中,我们发现两者 互相配合 会得到最好的效果。在脚本编写的过程中,我们往往也需要查阅它们的项目API文档。

3)使用Python语法

整个AirtestIDE中录制和运行的代码都是基于Python语言。Python语法简洁而强大,第三库和工具也非常多。

对于新手,Python上手非常容易,学会基本语法即可写出自动化脚本中所需的逻辑语句。

touch("开卡包.png")
if exists("奖励面板.png"):
    for i in range(5):
        Poco("奖励-%s" % i).click()


对于老手,你可以在AirtestIDE中使用各种第三方库来使你的自动化脚本更加强大,通过添加PYTHONPATH设置,可以使用本地的python.exe来运行你的脚本。

除了辅助窗口里面提供的语句,更多的API文档,可以查看AirtestPoco的仓库。

4)断言

到这里,我们已经有各种模拟输入方法,配合逻辑控制语句让手机动起来。自动化测试中还有很重要的一个步骤:结果验证,那么我们来看看怎样声明断言。

① 验证UI界面

录制方法与模拟输入类似

  • assert_exists:断言图片存在
  • assert_not_exists:断言图片不存在
9.gif
② 验证数值

通过Poco获取属性值,手写代码进行断言

  • assert_equal:断言相等
  • assert_not_equal:断言不等

例如

# ... 模拟输入并获得20分之后

value = Poco("分数按钮").attr("num")
assert_equal(value, 20, "获到20分")

5. 查看测试报告

脚本运行完毕后,点击查看报告按钮(快捷键Ctrl+L),会使用默认浏览器打开结果报告页面(最好使用chrome浏览器打开,兼容性最好)。报告中将展示出每一个步骤的内容和实际执行过程的截图、运行结果,方便查看步骤是否执行成功。


aea86afd-5a9e-4c1e-b004-9abf116a8e1c.png
b4a1d589-11f7-4491-aaa0-86cb99a47cd4.png

6.命令行接口

在AirtestIDE运行脚本时,LOG窗口中会打印运行命令。


7c9c0b9a-3e37-45af-abdc-3ffefcb4d412.png

你可以在不开启IDE的情况下,在命令行中使用那条命令来启动测试脚本,例如:

"D:\AirtestIDE\AirtestIDE" runner "D:\AirtestIDE_2018-01-24_83\untitled.air"  --device Android://127.0.0.1:5037/F8UDU16409004135 --log "C:\Users\gzliuxin\AppData\Local\Temp\AirtestIDE\scripts\cdfc40e8c297b6ad88e09de64d8bafa3"

使用AirtestIDE你可以轻松的录制出测试脚本,保存为.air脚本。请注意一个.air脚本中不要包含太多内容,用良好的脚本命名和目录结构来组织你的脚本,覆盖所有测试点。

你还可以在不同电脑上针对不同设备运行测试, 这时候你就需要用命令行运行 .air 脚本 。 对于多平台发布的产品,灵活使用跨平台API和命令行,还可以让同一套测试脚本运行在Android和Windows上进行测试。

如何在Android手机上进行自动化测试

1.连接Android手机

1)在AirtestIDE里连接Android手机

使用AirtestIDE对Android应用进行自动化测试时,第一步就需要连接Android设备。

请查阅我们的设备连接文档里的指引,安装好驱动、打开手机里的开发者选项、允许USB调试选项后,用USB线连上手机并在AirtestIDE中尝试连接。

如果遇到了问题,请查阅Android连接常见问题文档,根据里面提供的自查步骤排查问题,有些品牌手机有专属的选项需要另行开启(例如小米、Vivo/Oppo),请同样查阅对应品牌的注意事项来避免问题。

2)设备的支持情况

目前我们支持市面上几乎绝大多数Android手机、Android模拟器(模拟器连接教程请查阅这里),也可能支持少部分特殊的基于Android系统的硬件设备。

在成功连上手机后,我们就能够在AirtestIDE里操作手机画面,就像下图中这样,接下来就可以开始用这台手机编写脚本了。

10.gif
3)设备连接的特殊选项设置

有少数 非手机 的Android设备(例如智能电视、智能后视镜等),直接点击connect按钮不能连接,但是可以尝试通过勾选connect下拉菜单中的选项来尝试连接。

例如,我们的默认连接方式不支持模拟器,因此在连接模拟器时,需要先勾选Use Javacap选项(部分品牌模拟器还要同时勾选Use ADB orientation)。这里connect下拉菜单的三个选项,是截屏、旋转和点击的三个备选方案,在默认方案无法生效的时候,使用这3个备选方案可能就可以支持设备了。


ff4ac9be-84e8-46ce-80c9-0e879b8e814b.png

注意:部分品牌手机不支持某个功能,可能仅仅只是因为选项没有开启,例如小米手机必须要开启了允许模拟点击才能够在AirtestIDE中使用默认方式点击手机(速度更快,效果更好)。如果是正常的手机设备,遇到问题时请尽量先查阅文档排查问题。这几个备选方案的效率都比默认方案低,只有部分特殊的Android设备才需要使用到备选方案。

2.Android设备的连接字符串

1) 运行脚本时如何指定手机

当我们在AirtestIDE里连上手机并编写完脚本,当点击运行脚本按钮时,默认会在运行时的命令行里使用当前已经在AirtestIDE里连接的手机,我们可以在log查看窗的最上面看到像这样的1条命令:

"D:\demo\AirtestIDE-win-1.2.10\AirtestIDE\AirtestIDE" runner "D:\test\taikang_test.air"  --device android://127.0.0.1:5037/127.0.0.1:7555?cap_method=MINICAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH --log "D:/test/test01\fe03093fd01433d6bf58dc5fa5556c22"

e66c4d48-79fc-4508-8d7b-2bf8d254f9db.png

其中--device android://127.0.0.1:5037/127.0.0.1:7555?cap_method=MINICAP&&ori_method=MINICAPORI&&touch_method=MINITOUCH就是当前使用的本地手机,它将我们这台设备号为127.0.0.1:7555的手机名称告诉Airtest,让它明白我们需要使用这台手机。

我们也可以在命令行中不填写具体的手机设备号,用--device Android:///这样的内容来表示在当前连接的一台Android设备上运行即可,无论它的设备号是什么。

如果在命令行中,完全不填写--device,默认将会不连任何设备来运行代码,那么在运行到需要有设备才能跑的代码时将会报错(例如touch语句必须要连上设备才能运行)。

如果希望在脚本中通过代码进行设备连接,可以在auto_setup接口中传入devices参数,或者使用connect_device接口、init_device 接口等:

auto_setup(__file__, devices=["Android://127.0.0.1:5037/SJE5T17B17"],logdir=True, project_root=r"D:\test\logs", compress=90)

connect_device("Android:///SJE5T17B17?cap_method=javacap&touch_method=adb")

init_device(platform="Android",uuid="SJE5T17B17", cap_method="JAVACAP")

2) 设备连接字符串如何编写

在刚才的命令行中使用的 --device参数,传入的是一个设备字符串,以安卓设备为例,字串完整定义如下:

Android://<adbhost[localhost]>:<adbport[5037]>/<serialno>

其中,adbhost 是 adb server 所在主机的 ip ,默认是本机 1127.0.0.1 ,adb port 默认是 5037 , serialno 是 android手机的序列号。

这里提供一些常见的填写范例供大家参考:

# 什么都不填写,会默认取当前连接中的第一台手机
Android:///
# 连接本机默认端口连的一台设备号为79d03fa的手机
Android://127.0.0.1:5037/79d03fa
# 用本机的adb连接一台adb connect过的远程设备,注意10.254.60.1:5555其实是serialno
Android://127.0.0.1:5037/10.254.60.1:5555

# 模拟器等特殊设备、使用了连接参数时:
# 模拟器连接,勾选了Use javacap模式
Android://127.0.0.1:5037/127.0.0.1:7555?cap_method=JAVACAP
# 所有的选项都勾选上之后连接的设备,用&&来连接多个参数字符串
Android://127.0.0.1:5037/79d03fa?cap_method=JAVACAP&&ori_method=ADBORI&&touch_method=ADBTOUCH

更多注意事项、其他平台范例、命令行中使用了&符号应该如何处理等,都可以在文档关于设备字符串中找到。

3.Android设备的多机协作

Airtest支持一个脚本中连上多台手机,但是需要注意的是,并不是能够自动让这一个脚本在多台手机上跑,而是能够在脚本中使用这几台手机,实现一些类似于多机协作的效果(例如让两台手机登录同一个APP并相互“添加好友”)。

假如我们现在正在使用AirtestIDE编写脚本,已经同时连上多台手机,在运行脚本的时候AirtestIDE将会自动在命令行中添加多个--device参数,把当前连接的手机都告诉脚本,无需其他额外操作。

或者也可以直接在脚本里使用多个connect_device语句,分别传入手机连接串信息即可:

from airtest.core.api import connect_device
dev1 = connect_device("Android://127.0.0.1:5037/serialno1")  # 连上第一台手机
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")  # 第二台手机

在连接多台手机后,我们能够在Airtest的全局变量G.DEVICE_LIST中看到所有当前连接中的设备,可以使用set_current接口在多台设备之间切换。

print(G.DEVICE_LIST)  # 此时设备列表为[dev1, dev2]

# 传入数字0切换当前操作的手机到第1台
set_current(0)

# 切换当前操作的手机到序列号为serialno2的手机
set_current("serialno2")

# 使用device()接口获取当前连接中的设备Android对象
current_dev = device()

特别注意:我们在AirtestIDE的设备连接窗口或者脚本里面连接上多台设备,并不代表运行脚本时,会自动在所有连接设备上面进行脚本跑测(同时跑测需要自行编写多线程或多进程等来实现)。举个例子,我们在AirtestIDE的设备连接窗口连接上了多台Android设备,点击运行脚本时,只会在设备窗口当前显示的那台设备上运行。

如使用脚本连接上了多台设备,则需要我们使用 set_current 接口来指定切换到哪一台设备上进行操作,否则默认会在连接的第一台手机上运行。

4.Android平台专属功能与接口

二、Airtest介绍与脚本入门-平台相关的接口一节中,我们提到了每个接口支持的平台可能各不相同,而Android支持的接口是最全面、最丰富的。

基本上airtest.core.api中的接口(文档地址),在Android平台上都可以直接使用,例如:

# 清理某个应用数据
clear_app("org.cocos2d.blackjack")
# 启动某个应用
start_app("org.cocos2d.blackjack")
# 传入某个按键响应
keyevent("BACK")

1)Android设备接口

除了在airtest.core.api中提供的跨平台接口之外,Android设备对象还有很多内置的接口可以调用,我们可以在airtest.core.android.android module这个文档中查阅到Android设备对象拥有的方法,然后像这样调用:

dev = device()  # 获取到当前设备的Android对象
print(dev.get_display_info())  # 查看当前设备的显示信息
print(dev.list_app())  # 打印出当前安装的app列表

2) ADB指令调用

在Android设备的测试脚本中,有时候我们需要输入一些ADB指令,如果在普通的Python脚本中想要调用ADB指令,也许需要用到subprocess等模块单独启动进程运行命令行才能实现。

但是在Airtest脚本中,调用ADB指令是非常简单的事情:

# 对当前设备执行指令 adb shell ls
print(shell("ls"))

# 对特定设备执行adb指令
dev = connect_device("Android:///device1")
dev.shell("ls")

# 切换到某台设备,执行adb指令
set_current(0)
shell("ls")

5.安卓手机助手便捷功能

在使用AirtestIDE连接上Android手机时,我们还提供了一个简单的手机助手功能,使用方法在这里

在连上Android手机后,点击设备窗口右上角的工具图标,在展开下拉菜单中,选择Show assistant dialog 即可打开安卓手机助手。


e5a36f5f-a354-4054-9fd1-54b0f61a7d1c.png

在安卓手机助手中,我们提供了以下几种功能:

  • 手机应用的安装/卸载/列表查看
  • 常用快捷操作:打开网址、输入文本、切换输入法、音量调节等
  • 手机Shell调试窗口

6.Poco测试Android原生应用实例

1)在AirtestIDE的Poco辅助窗查看Android原生控件

在AirtestIDE的Poco Assistant面板中选择Android模式之后,AirtestIDE会开始自动向手机里安装Pocoservice.apk和Pocoservice-test.apk,部分型号手机需要手动点击确认安装才能顺利安装。

如无法自动安装,同学们也可以在IDE解压的文件夹里,找到这俩个apk文件,手动安装到测试设备上:


b20496fe-0564-4b82-91f8-e90ef6dee9da.png

安装完成后,AirtestIDE会自动启动PocoService,它会定时抓取 Android上界面的层次结构信息,稍等片刻就可以在AirtestIDE界面中看到当前界面的UI层次结构树。

点击UI树上的任意节点,可以Log面板中看到该节点的所有属性,同时设备画面中将出现方框,把对应位置框选出来,方便定位节点。


11.gif

同时,Poco辅助窗还给我们提供了3个辅助功能:


e3357bdd-7b5b-4508-8b3d-ec86babda18b.png

功能分别如下:

  • Poco Pause:锁定当前画面并检索当前画面的控件,单击需要检索的控件,log查看窗会出现该控件的详细信息
  • Poco Inspector:不锁定当前画面检索控件,鼠标移动到哪个控件,log查看窗就会显示哪个控件的详细信息;并且鼠标对控件进行点击时,设备画面也会实时响应
  • Poco Auto Recording:Poco脚本自动录制功能,随鼠标对控件进行点击、滑动等操作,会自动在脚本编辑窗口生成对应的Poco操作脚本

如果Pocoservice启动失败,会导致Pocoservice.apk反复重装,此时可以检查以下几个方面:

  • 是否Android版本过低,Poco支持Android SDK API ≥ 19,即Android 4.4及以上
  • 请关闭PC或手机上连接的网络代理Proxy,否则可能导致连不上Poco
  • 可以尝试卸载手机中的2个Pocoservice相关的APK后,手工重新安装一遍,在poco\poco\drivers\android\lib目录下能够找到这两个APK
  • 部分vivo和oppo手机需要将手机设置-输入法设置中,把Yosemite输入法设置为默认输入法+当前输入法
  • 检查手机助手内是否对 pocoservice.apk 做了限制,例如在某版本的华为手机中需要开启 允许自启动允许后台活动 ,部分一加手机要把 pocoservice.apk 的 电池优化 关掉,详情可以参考 “Android连接常见问题” 的文档
  • 不能和uiautomator同时启动,否则会相互冲突
  • 可以尝试 重启手机 看看是否会恢复
2)一个使用计算器的例子

在这里我们提供一个使用Poco对一个计算器应用编写代码的例子,点这里下载示例App(calculator),并事先将此App安装到手机上。

按照刚才说的,在AirtestIDE中的Poco辅助窗下拉菜单中选择Android后,AirtestIDE将会自动启动Pocoservice,显示出当前的UI控件层次结构树。此后就可以在AirtestIDE中进行Poco语句的编写和录制了。

3)代码示例

下面这段代码例子将演示一个简单的功能:点击calculator的界面,实现一个1+1=2的运算验证。

# -*- encoding=utf8 -*-
__author__ = "AirtestProject"

from airtest.core.api import *

auto_setup(__file__)

from poco.drivers.android.uiautomation import AndroidUiautomationPoco
poco = AndroidUiautomationPoco()

poco('com.google.android.calculator:id/digit_1').click()
poco('com.google.android.calculator:id/op_add').click()
poco('com.google.android.calculator:id/digit_1').click()
poco('com.google.android.calculator:id/eq').click()

result = poco('com.google.android.calculator:id/formula').get_text()
assert_equal(result, '2', '1+1=2 ^^')

在这段代码中,我们使用poco = AndroidUiautomationPoco()初始化了一个poco对象,然后分别选取了1 + 1按钮进行点击操作后,使用get_text接口非常轻松地获取到了结果控件的值2,并且使用Airtest的断言语句进行结果验证。

这个例子非常简单,更多poco用法和例子请见poco tutorial

7.同时连接多台手机使用Poco

在上一篇教程(四、如何在Android手机上进行测试(上)-多机协作)中,我们提到了一个脚本里可以连接多台Android手机,并且用set_current接口在手机之间切换:

from airtest.core.api import connect_device
dev1 = connect_device("Android://127.0.0.1:5037/serialno1")  # 连上第一台手机
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")  # 第二台手机
set_current(1) # 切到第二台手机

假如我们在连上手机后,想要分别使用poco去获取控件和点击这两台不同的手机,此时需要分别初始化两个poco,就像这样:

from airtest.core.api import connect_device
from poco.drivers.android.uiautomation import AndroidUiautomationPoco

dev1 = connect_device("Android://127.0.0.1:5037/serialno1")  # 连上第一台手机
poco1 = AndroidUiautomationPoco(dev1)
dev2 = connect_device("Android://127.0.0.1:5037/serialno2")  # 第二台手机
poco2 = AndroidUiautomationPoco(dev2)

set_current(1)  # 切到第二台手机
poco2('com.google.android.calculator:id/digit_1').click()

同理,假如不使用connect_device接口连接手机,而是通过直接在命令行中传入--device来自动连接手机的话,不需要在代码里重复执行connect_device。此时只需要分别获取到设备对象,并且使用设备对象初始化poco就可以了:

from airtest.core.api import G
from poco.drivers.android.uiautomation import AndroidUiautomationPoco

print(G.DEVICE_LIST)  # 假设当前总共有2台手机
poco1 = AndroidUiautomationPoco(G.DEVICE_LIST[0])
poco2 = AndroidUiautomationPoco(G.DEVICE_LIST[1])

如何在iOS 手机上进行自动化测试

1.前言

Airtest支持iOS自动化测试,在Mac上为iOS手机部署iOS-Tagent之后,就可以使用AirtestIDE连接设备,像连接安卓设备一样,实时投影、控制手机。

iOS测试不仅限于真机测试,iOS模拟器也可以进行。Mac端上部署完成后还可以提供给同一局域网内的windows上远程连接使用。同时支持airtest图像识别和poco UI检索。

2. 功能支持

  • 支持AirtestIDE连接,实时控制 iPhone
  • 支持基本操作如启动app、点击、滑动、输入、截图等等操作
  • 支持控件检索技术Poco和图像识别
  • 自动化脚本录制、一键回放、报告查看等基本功能
  • 支持真机或者模拟器

3. 安装部署

1)ios-Tagent支持情况

版本需求:

  • Mac Xcode ≥ 9.3
  • iPhone iOS ≥ 9.3
  • 在 9.3≤iOS≤10时,由于基于旧版xcode SDK,建议使用Xcode 版本≤10.1来启动iOS-Tagent,否则会出现手机截屏不全的问题。

iOS-Tagent项目支持情况如下:

ios-Tagent 最低支持 最高支持
iPhone iOS 9.3 13.5
xcode 9.3 12.1

对于高版本的iOS和xcode,尽管我们的iOS-Tagent暂时没能支持;但是我们的AirtestIDE1.2.8及以上版本(即airtest1.1.8及以上版本)已经支持了appium的WebDriverAgent,所以有高版本iiOS测试需求的同学,可以部署appium的WebDriverAgent,然后使用我们的AirtestIDE(或者是airtest库)来连接部署好的iOS进行自动化测试。

2) 部署流程

1.在Mac下载 iOS-Tagent ,使用 Xcode 启动 Test, 具体启动过程可参考 https://github.com/AirtestProject/iOS-Tagent 。当Xcode的log窗口输出下图信息的时候,就意味着部署成功了。

2.启动代理,在命令行下执行iproxy 8100 8100运行代理后,可以在浏览器打开 http://127.0.0.1:8100/status ,查看iOS设备是否能成功连接。

iproxy是usbmuxd附带的一个小工具,它的作用是将设备的某个端口映射到电脑的某个端口。mac下可以通过brew安装 brew install usbmuxd。

iproxy 8100 8100 意思就是将手机的8100端口,映射到电脑的8100端口上。这样我们就能通过访问电脑的8100端口来访问到手机了。

3.在 AirtestIDE 的设备窗口,输入地址:http://127.0.0.1:8100 或 http://x.x.x.x(MAC IP):8100:

951f02aa-ac9d-4f4d-8d08-c56f73f29859.png

点击Connect按钮即可连接iOS设备,如图:

12.gif
2) 支持Xcode中的iOS模拟器

Xcode中的iOS Simulator模拟器部署过程和真机一样,但是可以省略步骤2,不需要另外执行proxy。

当Xcode的log窗口看到下面内容的时候,就可以直接用地址 http://x.x.x.x:8100 进行连接了,也就是log里显示出来的ServerURLHere中的地址:

    WebDriverAgentRunner-Runner[xxx:xxx] ServerURLHere->http://x.x.x.x:8100<-ServerURLHere

3) 支持Windows连接iOS

我们同样能够在Windows上连接一个远程的iOS设备,但是依然需要有Mac电脑与Xcode环境。首先按照上文的部署教程在Mac上启动iOS-Tagent之后,不再使用iproxy启动代理,而是改用 wdaproxy。因为iproxy只支持本机端口的映射,而wdaproxy能够支持远程IP映射,这意味着可以在第二部PC上,通过访问ip的方式访问到Mac电脑上连接的iOS设备。

通过brew install openatx/tap/wdaproxy安装好wdaproxy

使用方法与iproxy一致,wdaproxy 8100 8100,或者不填写端口也可以,默认将会使用8100:

e5687143-4f91-47eb-9130-e3f83ef496bc.png

或者使用阿里开源的ios自动化测试工具--tidevice,可以更便捷实现在Windows上对iOS进行自动化测试,只要确保iOS设备上面已经安装好了WebDriverAgent,我们就可以利用tidevice工具在Windows平台上启动该WebDriverAgent,实现连接iOS。详细教程可以参看我们的公众号文章脱离Mac搞iOS自动化,tidevice工具教你轻松实现!

4. iOS自动化测试实例

iOS 的测试和其他设备差不多,支持图像识别和UI检索,下面简单介绍一个iOS测试例子:

  1. 连接设备
  2. 点击home键
  3. 截屏
  4. 执行滑动操作
  5. 使用poco点击app Safari
  6. 使用poco点击浏览器的搜索框,获取焦点
  7. 在搜索框输入“airtest”
  8. 在搜索页面往下滑动
  9. 判断是否存在airtest官网地址
from airtest.core.api import *
from poco.drivers.ios import iosPoco

# 连接设备
auto_setup(__file__)
connect_device("ios:///x.x.x.x:8100")

# 初始化iOS原生poco
poco = iosPoco()
# 点击Home键
keyevent("HOME")
# 截屏
snapshot()
# 滑动操作
swipe(Template(r"tpl1561985939879.png", record_pos=(0.356, -0.174), resolution=(750.0, 1334.0)), vector=[-0.685, 0.0481])

# 点击app Safari
poco("Safari").click()
# 点击浏览器的搜索框
poco("URL").click()
# 输入“airtest”
text("airtest")

# poco的滑动
poco("People also search for").swipe([-0.0541, -0.4206])
# 判断是否存在某个截图目标
exists(Template(r"tpl1560844284543.png", record_pos=(-0.292, 0.688), resolution=(750, 1334)))


13.gif

5. 常见问题

1)如何在模拟器安装应用

把xx.ipa 改成xx.zip,解压得到xx.app
打开模拟器, 在终端运行 xcrun simctl install booted xx.app
tips: 不可以把真机 app 包安装在iOS模拟器上,真机的app是基于arm的,而模拟器是运行在 X86 指令集上的,强行安装会导致闪退的问题。

2)如何进行iOS多机测试

目前暂未开放iOS多机测试功能,敬请期待

3)Api 支持状况

请注意,iOS设备与Android设备有很大的不同,以下通用的 Airtest 的 API 在iOS上都是支持的:
- 打开应用 start_app : OK
- 关闭应用 stop_app : OK
- 截图 snapshot :OK
- 点击Home键 keyevent("HOME") : OK
- 点击 touch : OK
- 滑动 swipe : OK
- 输入文本 text : OK
- 等待 wait : OK
- 存在截图目标 exists : OK
- 查找并返回所有结果 find_all : OK
- 断言存在 assert_exists : OK
- 断言不存在 assert_not_exists : OK

但是以下API是不支持的:
- 唤醒设备 wake : 暂未支持 (考虑用home方法替代)
- 事件操作 keyevent : 只支持home 事件
- 清除应用数据 clear_app : 暂未支持
- 安装应用 install : 暂未支持
- 卸载应用 uninstall : 暂未支持

Appium 的基本介绍

简介

Appium 是一款开源框架,拥有丰富的生态系统和强大的社区支持,一直受到开发者的积极维护。作为一种灵活的跨平台测试自动化工具,Appium 能够在 iOS、Android、Windows 和 Mac 设备上执行移动应用的自动化测试,并且支持使用相同的 API 编写适用于多个平台的测试脚本。

Appium 与 Selenium 类似,是一个跨语言的自动化框架,可与任何测试框架结合使用。它支持多种编程语言,包括 Java、JavaScript、PHP、Ruby、Python 和 C#,使开发者能够使用其熟悉的语言编写测试脚本。


c8758fbe-883d-457f-9f11-f1f54f7de12d.png

Appium 优势

Appium 的初衷即是解决移动端自动化的问题,从 Appium1.0 的初期发展到如今的 Appium2.0,其稳定性和扩展性也在逐步提升,丰富的插件和支持多平台的特性,不断改进的过程中使其从单一项目发展到强大的生态系统,这些进步使得 Appium 在开源跨平台移动端自动化的领域占有很重要的地位。

Appium 能有如今的火爆程度很大程度上取决于它对多平台和多应用的适用性,具体有以下几个方面的优势:
1.支持的应用类型:Appium 支持测试原生应用程序、混合应用程序和移动网页应用程序。无论应用程序是使用原生 API 开发的还是使用 Web 技术封装的,都可以使用 Appium 进行测试。

2.跨平台和跨设备支持:Appium 提供了跨平台和跨设备的支持,可以在不同操作系统版本和不同设备上执行测试。这使得测试团队可以在各种环境下进行广泛的测试覆盖。

3.WebDriver 协议:Appium 使用 WebDriver 协议来驱动和控制移动设备,这是一种标准的 Web 自动化协议。这意味着熟悉 Web 自动化测试的开发人员可以很容易地过渡到移动应用程序的测试。

4.第三方工具和集成:Appium 与许多第三方工具和框架集成,例如 pytest、TestNG、JUnit、Cucumber 和 Jenkins 等。这使得开发人员可以将 Appium 集成到现有的测试和持续集成工作流程中。

不同的引擎适用于不同的应用程序类型和平台。在选择引擎时,需要考虑应用程序的平台、类型和需求,可以根据具体的需求和条件选择合适的引擎来执行 Appium 自动化测试。

Appium Drivers

Appium 支持的多平台自动化的方法就是通过 drivers 即 Appium 引擎,这是 Appium 框架的核心组件,负责驱动和控制移动设备或模拟器,以执行自动化脚本。Drivers 最初只是 Node.js 类,Appium 对它进行了扩展,称为 BaseDriver,是对整个 WebDriver 协议的封装。通过优化和扩充,提供了更强大的功能和更广泛的支持。这使得 Appium 能够跨多种平台实现自动化测试,为移动应用的测试提供了高度灵活性和可扩展性。

Appium 主要支持的 Drivers 有以下几种:

iOS 引擎
  • XCUITest(默认引擎):用于测试 iOS 原生应用程序。
  • WebDriverAgent:基于 XCUITest 的开源框架,用于测试 iOS 应用程序。
Android 引擎
  • UiAutomator2(默认引擎):用于测试 Android 原生应用程序。
  • Espresso:用于测试 Android 应用程序,特别适用于 UI 自动化测试。
  • Selendroid:用于测试 Android 应用程序,支持旧版本的 Android 平台。
其他引擎
  • Chromium Driver:用于测试 Chrome 浏览器。
  • Flutter Driver:用于测试 Flutter 应用程序。
  • Windows Driver:用于测试 Windows 桌面应用程序。
  • Mac2 Driver:用于测试 Mac 桌面应用程序。

Appium 生态工具

Appium 旨在支持不同的平台的 UI 自动化,不仅如此,它还旨在支持用不同语言编写的自动化代码。所以 Appium 有自己的一套生态,其中包含了几个部分以此来实现这个目标。

  • Drivers(必需):适用于多个平台的驱动程序。
  • Clients(必需):各种语言的客户端封装库,用于连接 Appium Server。
  • Plugins(可选):插件提供了各种方式来扩展 Appium 的功能。
  • Related-Tools:与测试没有直接关系的辅助工具
  • Appium Inspector:用来做元素定位
  • Appium Doctor:检测 Appium 环境的安装,并检测常见的问题

Appium环境安装与使用

环境安装与使用

简介

下面是 Appium 服务安装及后续代码测试所需基本环境的具体安装步骤。

JDK 环境 在 Appium 中,UiAutomator2 通过 Java 编写与 Android 应用程序进行交互,因此需要配置 JDK 环境。可以参考安装教程贴进行安装。

Android SDK 环境 Appium 使用 Android SDK 与 Android 设备通信、管理模拟器或物理设备,并执行 App 自动化测试。为了测试 Android 应用程序,需要安装 Android SDK,并确保在测试环境中正确配置了相应的路径和环境变量。

**Node.js 环境 **安装命令行版本的 Appium Server 需要 Node.js 环境。建议使用版本 14.17.0、16.13.0 或不小于 18.0.0。确保正确安装 Node.js 以便启动 Appium 服务。

Appium 服务 在 2.x 版本之前,Appium 提供了命令行版本和图形化版本两种安装方式,但在 2.x 更新后,只提供了命令行版本。用户可以选择其中一种进行安装。

Appium Inspector 环境 在测试过程中,使用 Appium Inspector 工具辅助元素定位。确保安装并配置 Appium Inspector,以便在测试过程中准确定位 App 的元素。

**Appium 客户端环境 **根据选择的编程语言,需要安装相应的 Appium 客户端库。这些库提供了与 Appium 服务器进行通信的 API 和方法,以便于编写测试脚本。

移动设备平台工具 在测试过程中,可以选择使用真机或模拟器。确保配置和优化所选平台的工具,以便进行有效的测试。

安装步骤
以下是上述所需环境的具体安装步骤。

1.Android SDK

安装 Android SDK

方式一:直接安装 SDK

直接下载 SDK 压缩包,可能会有版本不兼容的问题,不推荐。

  • 网盘地址

  • 进入网盘,下载 sdk.zip


    fe69a3a3-7859-416e-8177-7f7dcbbc3dec.png
  • SDK Manager -> SDK Tools

  • 解压好的 sdk 其实就是一个文件夹,配置好环境变量就可以直接使用


    dc4c5fe4-36d0-437d-a8f8-463babc21901.png
方式二:使用 Android Studio 安装 Android SDK

可以选择 SDK 工具的版本,推荐方式。

通过官网下载 Android Studio 对应版本后,直接安装,安装时会进行环境的初始化,使用标准安装即可。

在 AndroidStudio 欢迎界面打开 SDKmanager ,在 SDK Tools 目录下安装如下进行安装:


641358d5-fce0-4e1d-bb40-661af410c980.png

配置 Android 环境变量

Windows 配置 Android 环境

  • 新增 ANDROID_HOME 系统变量
  • 变量名:ANDROID_HOME
  • 变量值:D:\adt-bundle-mac-x86*.64-20140702\sdk(SDK 安装的根目录)
c049f6a6-db99-43a5-b949-86f837576def.png
  • 修改 Path 变量
  • %ANDROID_HOME%\emulator
  • %ANDROID_HOME%\platform-tools
  • %ANDROID_HOME%\tools
  • %ANDROID_HOME%\tools\bin
140e7ff1-c1e2-4f6a-8417-f0a3d86bff55.png

MacOS 配置 Android 环境

修改 .bash_profile:

# .bash_profile

# Setting PATH for ANDROID_HOME
export ANDROID_HOME=/Users/mac/Library/Android/sdk
export PATH=$ANDROID_HOME/emulator:$PATH
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/tools:$PATH
export PATH=$ANDROID_HOME/tools/bin:$PATH
export PATH=$ANDROID_HOME/build-tools/29.0.1:$PATH

Android 环境验证

  • 进入命令行
  • 输入 adb --version
  • 输出版本号信息即成功
d77e85c8-61a2-4276-bb14-e3b8c36ec2e9.png

2.Node.js

安装

  • 官网下载地址
  • 网盘地址
  • 安装过程中在如下图的界面需要选择 Add to PATH 选项(点击选项,蓝色高亮),选中会自动配置环境变量。


    da0c23e4-b67c-480d-993f-32b42f00e57d.png

环境验证

命令行输入以下两条命令,成功出现如图所示的版本号即为安装成功。

  • node -v

  • npm -v

bbb181be-6153-44dd-bbfc-c866d2d240cd.png

3.Appium 服务端

Appium 服务端有 GUI 版本,也有命令行版本。目前 GUI 版本官方已经停止更新,对应的是 Appium 1.x 版本的服务端。

Appium 命令行版本的服务端目前官方已经更新到了 2.x 版本,以下会以 2.x 版本为例介绍命令行版本服务端的安装方式。

无论是 GUI 版本还是命令行版本,都是 Appium 服务端。使用时,二选一即可。

Appium GUI

ab5d94c5-4769-4d53-9c5e-da2aa802bad4.png

Appium Server

Appium Server 2.x 安装

  • 命令行输入 npm install -g appium
  • 安装后输入 appium,成功启动会显示如下内容:[Appium] Welcome to Appium v2.0.0

安装驱动

  • 注意:Appium Server 2.x 版本必须单独安装
  • 命令行输入:appium driver install uiautomator2
  • 再次启动 appium,成功安装会显示如下内容:
Attempting to find and install driver 'uiautomator2'
✔ Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
Driver uiautomator2@2.0.5 successfully installed
- automationName: UiAutomator2
- platformNames: ["Android"]

安装 appium-doctor(可选)

  • 注意:可选,用来验证 appium 环境
  • 命令行输入:npm install -g appium-doctor
  • 安装后输入:appium-doctor,成功显示如下内容并且所需环境前方为 "√",即为安装成功。
80cbbfe4-07b0-4e7b-8a75-c92b1e065df1.png

Appium Server 1.x 和 2.x 的版本差异:

1.默认服务器基本路径
Appium 1 默认接受 http://localhost:4723/wd/hub 的命令,仅是 Selenium1 迁移到 Selenium2 时遗留下来的约定,并且不再和 Selenium 强绑定的关系。因此,Appium2 的默认基本路径现在是 /。

2.单独安装驱动程序
Appium 1 所有可用的驱动程序与主 Appium 服务同时安装。

Appium 2 将驱动程序拆出 Appium 的安装,这样 Appium 的服务安装会更加的轻便。用户可根据自己的需求安装相应的驱动程序。安装有两种方式:

  • 和 Appium 分开安装
appium driver install uiautomator2
appium driver install xcuitest@4.12.2

  • 和 Appium 一起安装
npm i -g appium --dirvers=xuitest,uiautomator2

1.驱动安装路径

2.Appium 1,驱动程序与 Appium 服务器同时安装,位于 /path/to/appium/node_modules

3.Appium 2,在 APPIUM_HOME 环境变量定义的路径中安装此类依赖项,默认路径是 ~/.appium

4.capability 需要加前缀

capabilities 之前称为 desired capabilities ,和之前最大的区别是任何非标准功能都需要供应商前缀,标准功能是在 WebDriver 协议中给出的。常用的有 browserName 和 platformName 等。

其它的功能名称中需要包含 供应商前缀,前缀的格式是 前缀: ,例如 Appium:。Appium 中的大多数 capabilities 都超出了标准的 W3C 功能,例如:

  • appium:app
  • appium:noReset
  • appium:deviceName
  • 图像分析功能移至插件

Appium2 的设计目标之一是将非核心功能拆离到插件中,这使得 Appium Server 的安装变得更加的容易,用户可根据所需要的功能选择是否下载对应的插件。Appium 各种和图像相关的功能已经移至 images 的插件中。

使用这个插件需要安装并启动时运行该插件:

  • 安装插件:appium plugin install images
  • 运行插件:appium --use-plugins=images
  • 支持配置文件

Appium2 不仅支持命令行参数,新版本的更新也增加了对配置文件的支持。配置文件可以是 JSON、JS 或 YAML 格式。

Appium 会从当前工作路径的根路径下搜索配置文件,可以指定自定义:appium --config-file /path/to/config/file

4.Appium Inspector

推荐安装 2022 年 6 月的版本。

99845cc2-a984-491e-b049-4cf08b97d2c0.png

5.Appium 客户端

python 客户端安装

pip install Appium-Python-Client

6.安装移动设备平台工具

需要根据要测试的移动设备平台(如 Android 或 iOS),安装相应的平台工具和驱动程序。

  • Android 平台:安装 Android SDK,并使用 Android SDK Manager 安装所需的平台版本和工具。

  • iOS 平台:对于 iOS 设备测试,需要安装 Xcode,并配置所需的 iOS 模拟器或真机设备。

确保平台工具和驱动程序已正确安装并配置,以便与 Appium 进行通信和控制。

Andriod 模拟器 mumu

58998c28-6443-4f54-a1b9-259e2059a255.png

目前模拟器呈现的界面并不是希望的手机界面,通过以下设置,把它调整成手机大小,找到界面右上角进入设置中心

63dba4da-7593-44cd-bed3-61fb2136af02.png

通过界面设置 选择 1280*720 就是手机屏幕的大小,选择后进行保存即可,保存后需要重启即可边更改为手机大小。

0339e3c5-2ae6-4938-9346-495214346b01.png

完成以上步骤后,Appium 环境就安装好了。可以启动 Appium 服务器,并使用相应的客户端库编写和执行自动化测试脚本。

Appium 原理解析

简介

Appium 的工作原理涉及到复杂的通信过程。因为 Appium 服务集成了多种技术,它依赖其他服务的支持才能实现对多平台的强大兼容性。通过深入分析原理,可以更好地理解和使用 Appium,并为使用者提供更全面的视角,从而获得更大的帮助。

原理分析
3c975310-fc06-493d-bd64-cabaf1cf8ca8.png

从上图可以了解到,Appium 的设计主要分为三个大模块,每个模块都有其清晰的职能,完全符合设计模式中的单一职责,这也是其可拓展性强的原因:

  • Client 端:将与 Appium 的各种交互封装为可被调用的 API 或工具,如此一来使用者就可以通过 Inspector 或者 Java/Python/其他语言的 Appium 第三库对 Appium Server 进行调用。
  • Server 端:起到了信息中转的作用。启动了一个 HTTP 服务,如此就可以接收Client 客户端的请求信息。除此之外,会将所有的控制命令,比如:Adb 命令,自动化的控制命令等其他命令转发到被测应用的移动端上面。
  • 移动端:真正执行自动化测试的地方。
611245cd-3cad-47a6-a43a-7dfec5cdd7d7.png

由以上的三个模块可知,为了实现良好的拓展性,其实 Appium 的设计相对是比较复杂的。

Appium Inspector 自动化用例录制

Appium Inspector 简介

Appium Inspector 是 Appium 的一个工具,用于帮助开发人员和测试人员分析和调试移动应用程序。它提供了图形界面和交互式的功能,使您能够轻松地检查应用程序的 UI 元素、获取元素属性、执行操作和生成自动化测试脚本。

c106328c-d9f6-4063-9176-9344eadf3862.png

Appium Inspector 的主要功能如下:

1.元素定位和查看:Appium Inspector 允许通过简单的点击来选择和定位应用程序中的 UI 元素。可以直接在应用程序界面上点击元素,然后 Inspector 会显示元素的属性信息,如 ID、类名、文本内容等。这样就可以轻松地确定元素的定位策略和属性,用于后续的测试脚本编写。

2.执行操作:Appium Inspector 提供了一些操作按钮,可以模拟用户在应用程序上的操作。例如可以点击按钮、输入文本、滑动屏幕等。这样可以验证应用程序的交互和功能。

3.自动化脚本生成:Inspector 还具有自动化脚本生成功能,可以根据用户在应用程序上的操作生成相应的自动化测试脚本。这样可以快速生成测试脚本的起点,然后进行进一步的定制和扩展。

4.元素搜索和筛选:Inspector 提供了搜索和筛选功能,可以找到特定的 UI 元素。可以使用属性值、文本内容等条件来搜索和筛选元素,从而快速定位到目标元素。

总之,Appium Inspector 是一个强大的工具,提供了图形界面和交互式的功能,帮助开发人员和测试人员在进行移动应用程序的 UI 分析、元素定位和自动化测试脚本编写时更加便捷和高效。

Appium Inspector 配置启动

测试对象
使用 appium 官方 Demo apk 进行练习。

下载 apk

配套资料下的 apk 目录。


7f32fd9c-d1c1-4724-8f65-3f4b93cf39aa.png

安装 apk

  • 拖拽到模拟器安装。
  • 进入到 apk 下载的目录执行:adb install ApiDemos-debug.apk 安装

启动 Appium 服务

命令行输入:appium,成功启动服务后如下图:


133bb5a0-ea4c-482b-89a3-44bf984e1d86.png

配置 Inspector

打开 Inspector,填写 Desired Capablility 配置信息。


14709ffe-95be-45ce-9a5f-9a7808c6d408.png

获取被测 app 信息

配置 Desired Capabilities 需要获取被测 app 的包名与启动 Activity 名。可以按照以下命令获取。

方法一

依次执行以下三条命令,通过需要找的软件名称执行 monkey 命令,得到具体页面的 Activity。

# 一:找到当前设备里所有的软件
adb shell pm list packages

# 二:根据关键词 筛选出需要找的软件的包名
# mac
adb shell pm list packages | grep "软件名"
# windows
adb shell pm list packages | findstr "软件名"
# package:io.appium.settings
# package:io.appium.uiautomator2.server
# package:io.appium.android.apis
# package:io.appium.uiautomator2.server.test

# 三:在指定的应用程序上执行一个 Monkecy 测试事件,并输出详细的日志信息
adb shell monkey -p "包名" -vvv 1
#     // Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=io.appium.android.apis/.ApiDemos } in package io.appium.android.apis

方法二

打印并筛选 adb 的日志,等待日志刷新结束,重新打开需要测试的 APP,即可得到 package 和 activity。

# Mac
adb logcat ActivityManager:I | grep "START"
# Windows
adb logcat ActivityManager:I | findstr "START"

验证 Activity

使用 adb 启动应用命令,验证获取到的包名和 Activity 是否可以成功启动被测应用。

adb shell am start -W -S -n io.appium.android.apis/.ApiDemos

Stopping: io.appium.android.apis
Starting: Intent { cmp=io.appium.android.apis/.ApiDemos }
Status: ok
Activity: io.appium.android.apis/.ApiDemos
ThisTime: 437
TotalTime: 437
WaitTime: 452
Complete

命令中的 -S 代表先停止目标应用,再启动;-W 代表展示启动时间信息。

可以成功启动,代表包名与启动 Activity 正确无误。

配置 Remote Path

1.Remote Path:/。
2.本机调试:

  • Remote Host:127.0.0.1
  • Remote Port:4723
44d58fd5-6350-40c6-82cf-7bb0b05747bf.png

跟 Appium Server GUI 中的配置对应,分别为 IP、端口和地址,其中地址默认配置 /wd/hub 即可。

IP 如果是本机就配置 127.0.0.1,如果 Appium Server 和 Appium Inspector 不是同一台机器,那么就需要配置 Appium Server 所在机器的 IP(Appium Server GUI 的 HOST 也需要配置本机 IP,不能配置为 0.0.0.0)。

配置 Desired Capablility
初始化参数(Capability)是 JSON 数据类型编码的键和值,当一个新的自动化会话被请求时,Appium 客户端发送此参数到服务端。用来告诉 Appium 驱动程序做哪些特定的测试。通过设置参数可以传递给 Appium Server 对应的配置信息。

设置 Capablility

  • platformName(必填):平台,Android/iOS
  • appium:automationName(必填):驱动:uiautomator2/XCUITest
  • appium:deviceName:设备名
  • appium:appPackage:应用的包名
  • appium:appActivity:应用启动 Activity 名

以下是一个最基本的 Capablility 设置:

{
   "platformName": "android",
   "appium:automationName": "uiautomator2",
   "appium:deviceName": "emulator-5554",
   "appium:appPackage": "io.appium.android.apis",
   "appium:appActivity": "io.appium.android.apis.ApiDemos"
}

可以一行一行添加,也可以直接点击如下的 Edit Raw JSON,直接修改 JSON 串。


ef932dce-6f6d-47c7-bec6-803ca0fe7d9a.png

保存 Capablility
如果要保存当前的 Desired Capabilites 配置,可以点击 Save as 按钮,然后在弹出的框中输入名字,就可以保存成功了。

这样重启 Appium Inspector 后,下次直接选择保存的配置就可以,不需要重新输入配置信息。

Attach to Session
如果 Appium 已经有连接到手机的 Session ,那么直接选择 Session ID,加入即可,不需要再进行配置。

启动 Session
配置好 Capablility 后,点击 Start Session 按钮,即可启动 Session,进入 Inspector 页面。

ef932dce-6f6d-47c7-bec6-803ca0fe7d9a.png
a60ec4df-6558-444a-b453-c463b9be5a21.png

Inspector 基础功能

  • Native App Mode:原生态 APP 模式。
  • Web/Hybrid App Mode:Web 和混合模式移动应用。
  • Select Elements:选择元素。
  • Swipe By Coordinates:通过坐标点滑动。
  • Tap By Coordinates:通过坐标点点击。
  • Back:返回按键。
  • Refresh Source & Screenshot:刷新按钮,同步移动端页面。
  • Start Recording:录制按钮。
  • Search for element:搜索定位表达式。
  • Quit Session & Close Inspector:退出当前 Session。
4a0cc07c-b56e-4f33-996f-9a8d7d6279cc.png

首先是同步手机页面顶部的 3 个操作按钮从左到右分别是:

1.Native app mode:原生态 APP 模式,点击此按钮定位原生态元素。

2.Web/Hybrid App mode:Web 和混合模式移动应用,有 web view 时需要定位元素需要选择此按钮。

3.查看元素:当想要查看某一元素时,点击如下图“选择元素”按钮,然后在屏幕截图中点击要查看的元素,最后在最右侧区域可以看到元素的 xpath、id 等定位元素。

4.滑动坐标:点击如下“滑动坐标”按钮,即可在屏幕截图上进行滑动操作

5.点击坐标:点击如下"点击坐标点"按钮,即可在屏幕上进行坐标点击操作跟直接操作手机一样了。注意此功能和选择元素按钮互斥,两个只能选一个。

6.回退按钮:相当于手机的返回键。当我们想要查看返回上一个操作查看页面信息,可以通过点击“返回”按钮。此时 Inspector 窗口和手机都会同时回到上一个操作的界面。(等同于 android 手机上的返回键)。

7.刷新按钮:刷新按钮,当我们在手机上对 APP 进行操作后,Inspector 窗口的屏幕截图不会自动更新,需要我们通过点击“刷新源和屏幕截图”按钮,更新应用的最新页面。

8.用例录制:录制按钮,点击此按钮后可以进行录制。当我们想知道如何编写操作界面的代码时,可以点击“录制”按钮,然后对屏幕截图进行操作,即可以实现操作的代码录制功能,非常实用。注意的是录制时,需要使手机页面变成可操作状态。

9.搜索定位表达式:根据 ID 或 Xpath 定位元素,检测表达式是否正确。选择一个属性 id(resource-id)、name(text)、xpath、className(class) 等。输入属性对应的值,点击 Search,即可搜索到界面对应元素的按钮。

10.退出 Session:退出当前 Session,点击后返回到 Appium Inspector 的 Start Session 页面。

元素定位与查看

同步到移动端页面后,点击 Select Elements 按钮进入选择元素模式。

点击页面元素后,即可查看元素源码和元素的属性信息。

查看元素信息

ca3ee4ab-c900-4550-966f-c5a1c9ef084e.png

查看页面源码

在 App Source 界面中,可以查看当前选中的元素在的源码,以 XML 树的形式,展示界面上的控件布局。

f6655121-778c-42e4-a870-60364119d08e.png

对于源码,可以进行如下操作。

1.复制页面源码
2.下载页面源码

查看元素属性

在 Selected Element 界面中,可以查看当前选中元素的详细属性信息。

做自动化测试需要定位元素,就需要用到元素的这些属性信息。

对于选中的元素还可以进行操作:

1.点击:选择一个元素后,还可以“点击”元素,当您使用一个元素执行 Tap 操作时,Inspector 将发送命令到 Appium,它将执行它。如果操作成功,左侧将生成一个新的屏幕截图,您将看到应用程序的更新状态和 XML。如果不成功,您看到错误消息。

2.输入文本:选择一个元素后,还可以“发送内容”到元素(前提:它是一个输入框 EditText)。同样 Inspector 将发送命令到 Appium 执行它。

3.清空文本:选择一个元素后,还可以对元素“清空内容”(前提:它是一个输入框 EditText)。同样 Inspector 将发送命令到 Appium 执行它。

4.复制元素属性:可以将元素属性以 JSON 格式保存到粘贴板。

自动化用例录制步骤:

1.点击 Start Recording 按钮进入录制状态
2.在同步过来的界面中选择元素
3.在 Selected Elements 界面中进行操作
4.测试操作结束后点击 Pause Recording 结束录制
5.在 Recorder 界面展示录制脚本

7a2c0c6f-e617-466b-9529-21ea198a6e49.png
用例录制示例

测试步骤:

1.打开 API Demo 应用
2.点击 OS,进入下个界面
3.点击【Morse Code】
4.输入内容【ceshiren.com】
5.返回上一个页面
6.返回上一个页面

83297073-c10b-44f0-a863-457cf9f16620.png

总结
Appium Inspector 是一款有助于进行 APP 自动化测试的工具,它通过可视化方式帮助用户理解应用程序的 UI 结构,并简化了创建和调试自动化测试脚本的过程。

App 自动化应用控制

简介
app 自动化控制是通过自动化测试工具来模拟用户与移动应用程序进行交互,以执行各种测试操作。

操作步骤

启动
启动应用主要有两种方式:

1.正常启动应用。
2.在脚本中启动其他应用

正常启动应用:创建一个 WebDriver 实例,用于与 Appium 服务器建立连接,并传递所需的启动配置(Desired Capabilities)。主要需要以下两个参数:

  • url:指定 Appium 服务器的 URL 地址。这通常是 Appium 服务器的主机名和端口号,例如http://localhost:4723
  • capability:一个字典对象,包含了启动应用程序时的配置信息。这些配置信息可以包括设备名称、平台版本、应用程序包名、活动名称、自动化测试引擎、设备连接信息等。

通过将 URL 和 Capabilities 传递给启动方法,Appium 客户端库将与 Appium 服务器建立连接,并使用提供的配置信息启动相应的会话。这将创建一个可以用于与应用程序进行交互的 WebDriver 实例。

在脚本中启动其他应用:可以在设备上激活给定的应用程序,传入的 app_id 为指定应用的包名。

  • Python
# 启动应用:
appium_server_url = 'http://localhost:4723'
driver = webdriver.Remote(appium_server_url,options=UiAutomator2Options().load_capabilities(caps))

# 在脚本中启动其他应用:
driver.activate_app("com.xx.xx")

  • Java
// 启动应用:
AndroidDriver driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), uiAutomator2Options);

关闭

  • 关闭指定 app:关闭当前操作的 app,不会关闭驱动对象。
  • 关闭驱动对象:关闭当前所有的关联的 app,并关闭驱动对象。

Python

# 关闭指定 app
driver.terminate_app("com.xx.xx")
# 关闭当前所有的关联的 app,并关闭驱动对象
driver.quit()

Java

//关闭指定 app
driver.terminateApp("app名称");
//关闭驱动对象
driver.quit();

完整示例

使用 appium 官方 Demo apk 进行练习,apk 网盘地址

  • Python
class TestApiDemo:
    def setup_class(self):
        # Capability 设置定义为字典
        caps = {}
        # 设置 app 安装的平台(Android、iOS)
        caps["platformName"] = "Android"
        # 设置 app 的包名
        caps["appium:appPackage"] = "io.appium.android.apis"
        # 设置 app 启动页
        caps["appium:appActivity"] = ".ApiDemos"
        # 不清空缓存
        caps["appium:noReset"] = True
        # 指定应用程序在会话结束时终止
        caps["appium:shouldTerminateApp"] = True
        # 初始化 driver
        appium_server_url = 'http://localhost:4723'
        self.driver = webdriver.Remote(appium_server_url,
                                       options=UiAutomator2Options(). \
                                       load_capabilities(caps))
        print('初始化driver')
        # 设置隐式等待
        self.driver.implicitly_wait(10)

    def teardown_class(self):
        # 停留 3 秒
        time.sleep(3)
        self.driver.activate_app("com.android.browser")
        print('打开浏览器')
        # 停留 3 秒
        time.sleep(3)
        self.driver.terminate_app("com.android.browser")
        print('关闭浏览器')
        time.sleep(3)
        # 关闭 driver
        self.driver.quit()
        print('关闭driver')

    def test_control(self):
        print("执行成功")

  • Java
    @BeforeAll
    public static void setUpClass() {
        UiAutomator2Options uiAutomator2Options = new UiAutomator2Options()
                // 配置平台名称
                .setPlatformName("Android")
                // 配置驱动driver名称
                .setAutomationName("uiautomator2")
                .setNoReset(true)
                // 配置启动app
                .amend("appium:appPackage", "xxxx")
                .amend("appium:appActivity", "xxx")
                .amend("appium:forceAppLaunch", true)
                .amend("appium:shouldTerminateApp", true);
        //初始化
        try {
            driver = new AndroidDriver(new URL("http://127.0.0.1:4723"), uiAutomator2Options);
            driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
        } catch (MalformedURLException e) {
            throw new RuntimeException(e);
        }
    }

    @AfterAll
    public static void tearDownClass(){
        driver.terminateApp("app名称");
        driver.quit();
    }

总结

在 APP 测试中,启动应用程序通常涉及两种情况:一是初始化一个全新的应用程序实例,二是打开一个已经存在的应用程序。为了实现这两种情况,可以使用不同的方法,即初始化 Appium driver 或者使用 activate_app 方法切换到某个应用程序的上下文。

在关闭应用程序时,也存在两种情况:一是完全退出应用程序,二是结束应用程序的进程,并不完全退出,使其不再运行在前台。分别使用 quit 方法和 terminate_app 实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容