Appium [腾讯 TMQ] Appium:轻松玩转 app+webview 混合应用自动化测试

匿名 · 2017年12月15日 · 2242 次阅读

导读

Appium 这个听起来既生疏也熟悉的自动化测试工具,比起原生的 UiAutomator 可能是异常的不起眼,可是却是有自身独当一面的能力,可以完成许多高难度作业,完成 UiAutomator 不可能完成的一些任务,可以说 appium 丰富了 UiAutomator 的功能,使 UiAutomator 可以完成更多的任务。

Appium 到底有哪些优势会让我们优先选择它去做 ui 自动化呢?

一、 appium 的优势

首先来看一下 appium 相比较于 UiAutomator 有哪些优势:

1、支持 webview、hybrid、native App 自动化

目前很多手机 app 都是混合型,同时具有 native 页面和 webview 页面,而 UiAutomator 是不能直接操 作混合型 app 中的 webview 页面。

2、跨平台

Appium 不仅可以在 android 平台上使用,还可以在 ios 上进行自动化,这样使得自动化脚本复用成为了可能。

3、支持多种语言(Java、Python、Ruby、C# 等)

Appium 不会受到语言方面的限制,绝大多数语言均可以驱动 appium 进行自动化测试,给测试人员提供了更多的选择。

既然有这么多的好处,那他跟 UiAutomator 到底有哪些联系,运行流程又是怎样?

二、appium 运行流程

Appium 的加载过程如上图。

1)调用 Android adb 完成基本的系统操作;

2)向 Android 上部署 bootstrap.jar;

3)Bootstrap.jar Forward Android 的端口到 PC 机器上;

4)Pc 上监听端口接收请求,使用 webdriver 协议;

5)分析命令并通过 forward 的端口发给 bootstrap.jar;

6)Bootstrap.jar 接收请求并把命令发给 uiautomator;

7)Uiautomator 执行命令。

在执行自动化命令时,首先通过 appium client(各种语言均有对应的 client)将命令发送至 appium 服务器,appium 服务器会将解析到的结果发送至手机。Bootstrap 收到来自服务器发来的请求去驱动 UiAutomator 执行命令(appium 在 IOS 测试里是基于 apple 自身工具 automation)。

三、环境搭建

Appium 环境的搭建比较繁琐,其中有很多的细节,处理不好会影响到后续用例的编写,稳妥搭建环境可以事半功倍。

1、Node.js

官网 https://nodejs.org/en/download/

appium 的使用需要 node.js 支持,下载最新版 node.js,双击安装后通过命令行node -v如果输出版本信息则说明已安装成功。

2、配置 sdk 环境

这里需要注意的是确保 sdk 版本在 level 17 以上,且需要配置环境变量。

3、安装 appium 客户端

安装地址:https://bitbucket.org/appium/appium.app/downloads/

我本地安装的是 1.4.16,相对比较稳定的一个版本,安装好后,需要配置环境变量,把 node_modules 的.bin 目录放到系统的 Path 路径里,之后命令行输入 appium-doctor 检查是否安装成功。

打开 appium 客户端界面:


可以看到这就是 appium server,右上角可以启动服务器,点击 android 的图标可以配置自动化的一些信息,包括待测 app 的位置,在测试前是否需要清空数据,配置待测手机的 android 版本信息等。

设置项可以配置服务器使用的端口信息,配置好后,启动服务器,信息就会在主界面上进行打印。

到这里,环境的搭建基本上就完成了,下面会结合 java 用例来说,会用到一些 jar 也要提前下载。接下来我们的 appium 需要用到监控来处理一些异常情况,同时通过监控类可以打印自己想要的内容,这部分也是需要环境的支持,不多说,直接上图。

其中 java—client 和 client-combine 还有 selenium 的 jar 用户支持 appium 客户端和 appium 服务器之间的交互,其余各 jar 的作用在于监听 appium 的信息时,会用到 spring 框架的东西。导入以上的 jar 就可以下面的工作了,实现用例。

四、实现用例

通常情况下,手管 web 页面改动不是很多,页面元素较稳定,但是经常会对调用接口等做部分修改,每周都会在特定时间发布,由于没有 h5 测试人力,因此客户端测试人员每有改动就需要验证客户端内嵌 webview 页面是否可以正常点击及使用,而且通常情况下这些页面需要手机管家的登陆态,因此一定需要人工在手机管家内测试这些页面,而这类测试消耗较多测试人力,测试方法简单,较适合自动化测试。

Appium 是一款非常适合混合型 app 自动化测试的工具,在 app 和 webview 之间快速切换,因此这里采用了 appium 来对手管页面进行测试。

测试一共分为三个部分,构造 appium 所需配置,执行自动化操作,对操作进行监听。

1、初始化 AppiumDriver

首先是构造 AppiumDriver 所需配置

用例的实现需要使用到 JUNIT,首先需要在 testcase 前将需要的参数配置好,新建一个 AppiumDriver 实例,在 DesiredCapabilities 中把所需参数配置好。

首先需要设置 platformName,deviceName 平台和设备名称,这个可以根据需要自行设置,另外服务器客户端会配置这些内容,且会优先生效。

设置包名和 activity 名称,可通过 adb 命令获取对应的信息。

设置输入法,如果不设置是无法输入中文内容的,这条命令执行后,相当于你的手机替换为 appium 输入法。

最后,实现 appiumdriver,新建 url 与本地的端口 4723 进行通信。

2、混合型 app 的自动化测试

配置好 driver 内容,就可以开始用例的编写了,对于 webview 的测试,网上给出的方式是:开启待测应用的 debug 选项,然后将用例所处环境有 native 转换为 webview 模式,之后可以用 h5 页面中的控件对应的 name 对控件进行操作。转换成程序语言:

获取你的手机的所有 webview 信息然后找到你所测 app 的 webview 并设置。

然而上述方法有两个缺陷可能导致你无法获取 webview,首先,绝大多数应用是不会开启 webview 的 debug 模式,第二,切换 webview 的情况会受到网络状态的影响,如果是内部代理的网络则会导致你无法操作 chromedriver,切换至 webview 模式时会无法将命令传入导致超时,因此这种方式并未对其进行实现。

偶然间看到有人说 android 6.0 以上系统,无需切换 webview 模式就可以测试 app 中的 webview,通过 appium 打开 webview 后,使用 UiAutoviewver 可以看到,webview 中各控件可以像普通 app 中的控件一样可以捕捉到其控件信息。这里有一个技巧,需要你通过 appium 自动化打开 webview 的页面才能够获取控件信息,如果是手动打开,则页面是一个整体的 view。

后面执行用例就要简单很多了,基本上都是捕获控件,然后对控件进行操作,这里我们选择了 findElement 方法,参数为控件的信息,通过 By 方法可以获取到名称 resourceid 等,原理同 UiAutomator。

上述用例,通过打开手机管家,在 app 内打开反馈 h5 页面,并进行反馈和提交。 反馈操作,最后返回到 h5 的主页,通过 assert 判断返回去的页面的某元素是否存在,从而判断整个流程的正确性。常用的 ui 自动化测试工具在 app 和 webview 切换时会遇到无法测试 webview 的情况(例如有些情况下登录态是 webview 界面,则会导致无法进行后续的 app 自动化操作),而 appium 很好的解决了这一问题,能够快速在两种状态下切换并完成 UI 自动化测试。appium 中查找控件的方法是 findElements,可以通过 class,name,desc,resourse-id 进行查找,具体方法可以查阅 appium api 文档。

3、监听自动化动作

执行完上述操作,基本上就可以执行所有 webview 自动化需求了,不过这里你需要一些监听接口来插入日志,或是加入一些异常情况的判断,所以在实现了 driver 这个对象后。

通过上述方法,可以为用例加入监听,监听类继承自 AppiumWebDriverEventListener。

看一下监听类中的方法,有形如下图的各种方法。


BeforeFindBy 就是在 findElement 前是会首先执行这个方法,该方法会将控件信息和 driver 信息传递进来,在执行用例前可以进行一些打印日志,捕获异常和截图的操作,而 afterFindBy 则相反,是在执行完对应操作后进行监听。监听类可以获取到当前的 driver 信息,如上图,arg2 是从用例中传递过来的 driver,通过执行 driver 对应的方法可以操作页面元素,arg0 为用例中 findElement 的参数,通过该参数可以确定用例执行位置,并打印出对应信息方便定位问题。

对于自动化用例执行过程中的异常(包括弹框等),因为 appium 服务器是单个线程执行,如果不想使用 if else 来监听控件信息来执行特殊操作,也可以结合 uiWatcher 进行异常情况的处理。

经过上述操作后,一条 Hybrid 混合应用的测试用例就完成了,开发对接口的改动,可以一键自动化操作完成对 app 内 h5 页面的自动化测试,通过该方法可以克服需要管家登陆态的情况,可以同时测试 native 页面和 webview 页面,减少开发人员和测试人员间的沟通成本和测试人力成本,快速验证改动点是否成功。

五、小结

Appium 目前是一种比较先进的测试工具,可以覆盖到 UiAutomator 所涉及的各个方面,还能完成 webview 的自动化测试,但是部署环境较复杂,而且出现很多的异常情况很难去定位到问题,同时网上资料也比较匮乏,导致其普及范围不是很广,希望这篇文章可以帮助需要用到 appium 工具的同学,快速越过搭建环境这一关,快速投入到混合型 App 的自动化测试当中。

关注微信公众号腾讯移动品质中心 TMQ,获取更多测试干货!

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册