2024年3月30日发(作者:)

Android

自动化工具

UiAutomator

简介

一、Android自动化工具简介

Android自动化测试主要分为Monkeyrunner、Rubotium、UiAutomator、Monkey等。主要

特点:

1、 Monkeyrunner:优点:操作最为简单,可以录制测试脚本,可视化操作;缺点:主要

生成坐标的自动化操作,移植性不强,功能最为局限;

2、 Rubotium:主要针对某一个APK进行自动化测试,APK可以有源码,也可以没有源码,

功能强大;缺点是针对APK操作,而且需要对APK重新签名(有工具),因此操作相对

复杂;

3、 UiAutomator:优点:可以对所有操作进行自动化,操作简单;缺点:Android版本需

要高于4.0,无法根据控件ID操作,相对来说功能较为局限,但也够用了;

4、 Monkey:准确来说,这不算是自动化测试,因为其只能产生随机的事件,无法按照既

定的步骤操作;

由上面介绍可以有这样的结论:测试某个APK,可以选择Rubotium;测试过程可能涉及多

个APK,选择UiAutomator;一些简单的测试,选择Monkeyrunner;

本文档主要介绍UiAutomator的使用方法。

二、UiAutomator介绍

Google在Android4.3发布时提供了一套新的UiAutomation框架来支持用户界面自动化测

试,该框架通过运用已有的Accessibility APIs来模拟用户跟设备用户界面的交互,比如获取窗

口界面控件和注入事件等。

UiAutomator,用于UI自动化测试,主要是仿真单击、滑动、输入文本等操作,而不用人

为地进行操作,如果把一组反复进行的操作用UiAutomator实现,那么将大大提高效率。但是

UiAutomator使用范围非常有限,学习之后会知道,在UiAutomator中,每一个UI控件都是

UiObject的对象,并没有提供获得控件对应控件类(.*)的接口。所以在

UiAutomator中,一个Button和ImageView都是一样的---都是UiObject的对象。

要熟练使用UiAutomator,需要熟悉下图中的类。

三、UiAutomator的使用

1. 环境搭建

1.1 必备条件

(1). JDK

(2). SDK(API高于16)

(3). Eclipse(安装ADT插件)---(可使用adt-bundle-windows-XXXXXX,其内含ADT插件)

(4). ANT(用于编译生成jar)

1.2 简要步骤

(1). 安装JDK并添加环境变量

(/technetwork/java/javase/downloads/

ml)

创建JAVA_HOME环境变量,添加PATH;

(2). 添加SDK环境变量

创建ANDROID_HOME,添加PATH;

(3). 安装Eclipse,并安装ADT插件

(4). 安装ANT工具,并添加环境变量

创建ANT_HOME,添加PATH;

2. UiAutomator工作流程

(1). 在设备上面安装需要测试的应用程序,(利用工具)分析应用程序的UI组件,确保测试框

架能访问到应用程序

(2). 创建可自动化的测试去模拟特定的用户交互

(3). 编译测试用例成为jar文件并和你的测试的应用程序一起安装到设备上

(4). 执行测试并查看结果

(5). 修复bug或在测试中发现的缺陷

3. UiAutomator使用步骤

3.1 创建java project,导入包

将Junit 的lib加入到工程后还需要添加和两个文件

添加完成后,点击Finish完成创建。

3.2 创建测试类

在工程下创建包,并创建测试类LanuchSettings,该类需继承

UiAutomatorTestCase,此处使用官网帮助中的示例。

该测试用例主要用来模拟用户在一个安卓设备上启动设置应用。该测试用例模拟用户完成

这样的场景的所有步骤,包括打开主屏幕,启动全部应用屏幕,滑动到设置应用图标上,点击该

图标进入设置应用。具体代码如下:

/tools/testing/testing_

3.3 创建一个编译配置文件

在SDK目录下运行:

/tools/android create uitest-project -n -t -p

各个参数的作用:

-nname: Project name

-ttarget: Target ID of the new project。这个id是本机上android targets的id,可以通过命令

android list来查询,得到如下图的结果,选择android-17以上版本前面所对应的id

-p path:本地项目路径

执行命令:

命令运行完成后,可以看到workspace目录下该工程目录内新增三个文件:、

ties、ties

在eclipse中,右键项目名,选择Refresh

可在Referenced

Libraries目录下查看到新增的三个文件

)。

:编译可生成项目的jar文件;

ties

保存了sdk路径;

ties

保存了目标平台版本;

3.4 修改配置文件,生成jar包

Eclipse中,在上点击右键,选择“Run As” -> "Ant Build",可以看到下面的输

出,这个输出实际上是一个帮助,是对的作用进行说明的。在中配置上相应

的选项可以完成相应的操作。

在的配置上,将default后面的选项改为“build”后,保存重新运行,就可以build

jar包了。

此时工程的bin目录下就会生成了。

3.5 将jar部署到手机并执行

使用

adb

命令将

jar

push

到手机中,然后执行。

adb push

文件路径

> data/local/tmp

adb shell uiautomator runtest

文件名

> -c <

类名

>

比如:

adb push /data/local/tmp/

adb shell uiautomator runtest -c Settings

PS:

执行后就能看到手机会按照LaunchSettings中的步骤自动执行。

jar和类都可指定多个,用空格分开;

类名必须是全程,即包括包名;

类名后面追加#MethodName则只运行某一方法,否则执行所有方法。

3.6 执行结果分析

current:当前运行的测试数序编号,和方法名有关;

class:当前运行方法所在类的类名;

numtests:测试总数,一个public testxxx方法就是一个测试;

test:当前测试的方法名;

INSTRUMENTATION_STATUS_CODE:测试状态码,一般1是正在测试,0是通过,-1是错

4. TestCase代码

4.1 UiDevice

UiDevice代表设备状态。在测试时,我们能通过UiDevice实例调用方法去检测许多属性的

状态,如当前的屏幕旋转方向货展示大小。测试代码还能使用UiDevice实例去执行设备级的操

作,如强制设备横竖屏,按压d-pad硬件按钮,或按压主屏幕键和菜单键。

获取UiDevice实例,模拟按压主屏幕键的代码如下:

getUiDevice().pressHome();

getUiDevice()方法可以得到一个UiDevice的对象,通过这个对象可以完成一些针对设备的操作:

click(int x, int y) --- 在(x, y)表示的像素地方点击

pressBack()

pressDelete()

pressEnter()

pressHome()

pressMenu()

pressSearch() ---点击响应的按键

wakeUp() ---当手机处于灭屏状态时,唤醒屏幕,并解锁

swipe(startX, startY, endX, endY, steps) ---在手机上滑动,从(startX, startY)到(endX, endY)。

step表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大。

setOrientationLeft()

setOrientationRight() ---将手机向相应方向旋转

setOrientationNatural() --- 将手机旋转状态回归正常

4.2 UiSelector

UiSelector表示一个搜索条件去查询和获得在当前显示界面特定元素控制,可以在当前展示

界面上查询和获取特定元素的句柄。若找到多于一个的匹配元素,则返回布局层次结构上的第一

个匹配元素作为目标UiObject。当构造一个UiSelector对象时,可以使用链式调用多个属性来

缩小查询范围。如无匹配元素,则返回异常UiAutomatorObjectNotFoundException。你还可以

使用childSelector()方法来嵌套多个Uiselector实例。例如。下面的代码演示如何制定查询来定

位在当前界面的第一个ListView

然后在返回的ListView内定位一个带有Apps文本属性的界面

元素。

UiObject appItem = new UiObject(new

UiSelector().className(“ew”).instance(1).childSelector(new

UiSelector().text (“Apps”)));

UiSelector对象可以理解为一种条件对象,描述的是一种条件,经常配合UiObject使用,

可以得到某些符合条件的控件对象。

checked(boolean val) ---描述一种check状态的val的关系

className(className) ---描述一种类名为className的对象关系

clickable(boolean val) ---与checked类似,描述clickable状态为val的关系

description(desc) ---描述

descriptionContains(desc)---描述包含

focusable(boolean val) ---与checked类似

index(index) ---用当前对象在父对象集中的索引作为描述

packageName(String name) ---用包名作为条件描述

selected(val) ---描述一种选择关系

text(text) ---最为常用的一种关系,用控件上的文本即可找到当前控件,需要注意,所有使用text

属性找到的控件,必须是英文的。也就是说,不支持通过中文查找控件。

textContains(text) ---与text类似

textStartsWith(text) ---与text类似

4.3 UiObject

UiObject代表一个UI元素。为创建一个UiObject实例,使用用来描述如何搜索、选定UI

元素的UiSelector实例:

UiObject cancelButton = new UiObject(new UiSelector().text(“Cancel”));

UiObject okButton = new UiObject(new UiSelector().text(“OK”));

必要时,可以重用测试项目中已经创建的UiObject实例。注意,测试用例每次使用UiObject

实例来点击UI元素或查询属性时,uiautomator测试框架会搜索当前的界面来寻找匹配。在下

面的代码中,uiautomator测试框架搜索带有OK文本属性的UI元素。若发现匹配,并且该元素

启用,框架会模拟用户的在该元素上的点击操作。

if(() && led())

{

();

}

还可以限制搜索在几个特定的类中寻找元素,例如,为发现Button类的匹配:

UiObject cancelButton = new UiObject(new

UiSelector().text(“Cancel”).className(“”));

UiObject okButton = new UiObject(new

UiSelector().text(“OK”).className(“”));

翻译为:Android小工具按钮。

UiObject对象可以理解为控件的对象。一般一个UiObject对象可以通过以下形式得到:

UiObjectmItem = new UiObject(new UiSelector().text(“English”));

也就是配合一个UiSelector就可以得到一个控件。

click() ---点击控件

clickAndWaitForNewWindow() ---点击某个控件,并等待窗口刷新

longClick() ---长按

clearTextField() ---清除文本,主要针对编辑框

getPackageName() ---得到控件的包名

getSelector() ---得到当前控件的选择条件

getText() ---得到控件上的Text

isCheckable()

isChecked()

isClickable()

isLongClickable()

isScrollable()

isSelected() ---判断是否具备某个属性

UiObject的构造函数里传入了一个UiSelector对象。

4.4 UiCollection

UiCollection代表元素条目的集合,例如音乐专辑中的歌曲或邮箱收件箱列表。类似UiObject

需要指定UiSelector来构造UiCollection。用于构造UiCollection的UiSelector一般搜索容器或

包裹器类的界面元素,这样的容器或包裹器类的界面元素包含其他子UI元素,例如包含子元素

的布局视图。下面举例说明,下面的代码片段演示如何构造一个UiCollection实例,该实例代表

一个包含在FrameLayout布局中的视频专辑。

UiCollection videos = new UiCollection(new

UiSelector().className(“ayout”));

如果视频专辑包含在LinearLayout视图下,你能获取视频集合的数目:

int count = ldCount(new

UiSelector().className(“Layout”));

若想从视频集合中寻找带有文本元素Cute Baby Laughing的标签的视频,然后模拟用户在该视

频上进行点击,可使用如下代码:

UiObject video = ldByText(new

UiSelector().className(“Layout”),“Cute Baby Laughing”);

();

类似的,还能模拟其他用户操作,如想模拟选定一个关联视频的多选框,可以使用如下代码:

UiObject checkBox = ld(new

UiSelector().className(“ox”));

if (! cted ())();

UiCollection对象可以理解为一个对象的集合。因为UiSelector描述后得到的有可能是多个满足条

件的控件集合,因此可以用来生成UiCollection:

UiCollectionmUiCollection= new UiCollection(new UiSelector().text(“Settings”));

getChild(selector) ---从集合中再次通过UiSelector选择一个UiObject对象

getChildByDescription(childPattern, text) ---从一个匹配模式中再次以text为条件选择UiObject

4.5 UiScrollable

UiSCrollable代码可滑动的UI元素集合。可以使用UiScrollable类来模拟界面的横竖屏的

滑动。该技术可以应用于界面元素隐藏在屏幕外,可以通过滑动来展示的情况下。例如,下面的

代码演示如何模拟下滑设置按钮,然后点击About tablet选项。

UiScrollable settingsItem = new UiScrollable(new

UiSelector().className(“ew”));

UiObject about = ldByText(new

UiSelector().className(”Layout”),“About tablet”);

();

四、可能出现的问题

1. 步骤2.4中,右键文件,Run As选项中没有Ant Build?

标准的Eclipse一般都是内置集成了Ant的。到plugins目录下查看,其实是有安

装Ant插件的,但是没有在界面体现出来。

要让Eclipse在界面显示Ant的相关配置,可在命令行下作如下操作:

$ cd

$ eclipse -application or -repository -installIU

Installing 3.5.400.v20130514-1341.

运行完成后,启动eclipse,此是时发现Ant Build能正常在菜单中显示出来了。

2. 步骤2.4中,执行Run As - > Ant Build,存在错误信息?

此问题可能是Ant版本与java版本不匹配或电脑环境有关。建议安装Ant 1.9版本配合java

1.8版本。

若已安装的Ant版本太低,可进行手动升级。

(1). 官网下载Ant(/),选择.zip archive:

下载,解压;

(2). 手动覆盖旧版本内容。找到本地Ant目录/plugins/*** 目录,把其

中的内容用最新版的去替换,但要保留META-INF文件夹与ties文件;

(3). 验证安装成功。若是系统环境变量里设置了ant,则可以直接运行ant –version查看ant版

本与下载版本是否一致。

3. 运行结果异常,如下图

此现象为testcase名称未以test开头导致,修改后正常。

4. 搜索中文异常,不能用来搜索中文text的控件?

将项目默认的Text file encoding从GBK改成UTF-8,重新打包运行,正常。

五、UiAutomatorViewer工具

当我们想构建自动化测试,需要了解各个部件的应用层次的布局,之后便可以使用

UiAutomator来创建自动化测试。

UiAutomatorViewer可以检查应用的UI来查看应用的布局和组件以及相关的属性。

,打开如下图:

电脑连接手机后,点击左上角的手机图样的小图标,出现弹出框,此时正在获取信息:

在开始编写测试用例之前,熟悉目标应用程序的UI组件是很有必要的。我们利用

UiAutomatorViewer工具对连接到你的开发机器的Android设备前台UI窗口进行截图。

UiAutomatorViewer工具提供了一个方便的可视化界面去检查布局层次和查看正在测试设备上

显示的各个UI组件的属性。通过这些信息,你能在之后创建的UiAutomator测试中使用selector

对象对具体UI组件进行测试。

常用到的用于定位控件的方法有:

index

text

resource-id

class

content-desc