UiAutomator1

上一篇 / 下一篇  2018-11-05 15:58:30 / 个人分类:UiAutomator

1、UiAutomator简介

(1) 可以对所有操作进行自动化,操作简单

(2) 不需要对被测程序进行重签名,且,可以测试所有设备上的程序

(3) android sdk api 16开始,Android SDK开始支持两个做功能UI测试的新工具。
uiautomatorviewer,一个用以扫描以及分析Android应用程序的UI部件的工具。
以及uiautomator ,一个提供API用以自定义UI测试的Java库。

(4) 对中文支持不好(不代表不支持,第三方jar可以实现)

(5) 如果想要使用resource-id定位控件,则需要level 18及以上才可以

(6) 一个测试的Java库,包含了创建UI测试的各种API和执行自动化测试引擎。

(7)主要使用到的类只有几个,如下UiDeviceUiSelector,UiObject,UiScrollable,Uiobjection

2、UiAutomator环境搭建

(1) JDK (2) eclipse (3) android sdk (4) ANT

(5) 在使用uiautomator之前需要进行导入一个Junit、uiautomator.jarandroid.jar的包;

eclipse-->新建java project-->libraries-->Add External JARS添加uiautomator.jarandroid.jar-->Add Libraries添加Junit

3、UiAutomator自动化测试步骤

(1) eclipse中编写脚本,UIAUtomator框架需要用到Junitandroid.jaruiautomator.jar

① 添加Junit库:new java project-->Labraries-->Add Labraries选择Junit

② 添加android.jaruiautomator.jar

new java project-->Labraries-->Add External JARS...-->选择android.jaruiautomator.jar

(文件路径:D:\android sdk\android-sdk_r24.4.1-windows\android-sdk-windows\platforms

创建新类:选择ui-->uid

(2) cmdcdD:\android sdk\android-sdk_r24.4.1-windows\android-sdk-windows\tools

(3) 运行命令 android list target,查看对应android版本的SDKID值,要选择SDK API版本大于16的版本

(4) tools目录下,运行android create uitest-project -n Checker -t 1 -p D:\eclipse\workspace\UIAUtomator

备注:

android create uitest-project -n <name> -t <android-sdk-ID> -p <project_path>

name将来生成的测试项目jar包的名字,可以自己随意定义

android-sdk-ID第三步骤中查找出的id值;

project_pathEclipse里刚才建立的测试工程脚本的路径根目录

(5) 运行命令后,将会在工程的根目录下生成build.xml文件。

(6) cmdcd进入到eclipse生成build.xml文件所在目录,运行ant build,将使用ant编译生成jar成功后,会在工程bin目录下生成对应名称的jar

(7) jarpush手机data/local/tmp目录下,对应的命令是:adb push <jar文件路径> data/local/tmp

(8) 使用命令行启动我们已经push进去的uiautomator脚本:adb shell uiautomator runtest <jar文件名> -c <工程中的类名(包含包名)>

手机会执行脚本并完成对应操作。

adb shell uiautomator runtest Checker.jar -c Automator.QQTest.UiAutomatorQQTest

4、基础对象、类以及定位方式

(1) 类对象:

① UiDevice

此类主要包含了获取设备状态信息,和模拟用户使用设备的操作两类api

按键主要为模拟设备的物理按键,如home键,menu键,back键,音量键等;takeScreenshot() 允许随时对设备截屏。

代码如:

a、截图

File f = new File("/sdcard/Screenshot.png");

UiDevice.getInstance().takeScreenshot(f);

b、按home键:

UiDevice.getInstance().pressHome();

或者getUiDevice().pressHome();

c、按小写/大写字母a/A

UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);

UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);

d、获取屏幕宽高度:

int height = UiDevice.getInstance().getDisplayHeight();

int width = UiDevice.getInstance().getDisplayWidth();

e、实现滑动:

device.swipe(100,100,100,500,5);  //(100,100)(100,500),长度5毫秒,步数越长越慢

f、实现拖动:

device.drag(100,100,100,500,5);

g、唤醒和熄灭屏幕:

UiDevice.getInstance().wakeUp();

UiDevice.getInstance().sleep();

h、获取当前界面package包名:

String package_name = UiDevice.getInstance().getCurrentPackageName();

② UiSelector

主要是通过一定条件筛选方式,定位到所要操作的UI元素。

一般UI元素均可通过以下API定位

text() , textStartsWith(),className() ,classNameMatches(String regex), className(Class type) ,Description(), 

descriptionMatches(Stringregex),descriptionStartsWith()descriptionContains() ,packageName(), 

packageNameMatches(String regex)index() instance() 

 index()是当前页面的ID编号

instance()则表示在一定都搜索结果下,获取的子元素集的第几个元素。

 

代码如: 

a、通过id获取:

UiObject new_target1 = new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/name"));

new_target1.click();

b、通过class-name获取:instance()为角标,这个是在第几次出现,1为第二个

UiObject new_target2 = new UiObject(new UiSelector().className("android.widget.Button").instance(1));

c、在信息中输入电话号码:10086

UiSelector uisel_message_number =new UiSelector().className(

"android.widget.MultiAutoCompleteTextView").instance(0);

UiObject uiobj_message_number =new UiObject(uisel_message_number);

if(uiobj_message_number.exists()){

uiobj_message_number.setText("10086");

}

else{

System out println("uiobj_message_number对象不存在!");

}

③ UiScrollable

UiScrollable 用来表示可以滑动的界面元素,

继承自UiCollection UiCollection 继承自UiObject 

代码如:

首先定义一个UiScrollable对象,识别这个对象的唯一条件就是,屏幕上有可滑动的控件。然后我们判断这个可滑动对象是否存在

· 存在,则使用getChildByText方法,获取我们想要点击的那个控件,然后点击它

· 不存在,则说明页面不可滑动,也就是所有控件均已显示在界面上。那我们就可以直接使用UiObject获取控件并操作它。

public void scrollClickObject(String targetClassName,String targetName) throws UiObjectNotFoundException {

    UiScrollable collectionObject = new UiScrollable(new UiSelector().scrollable(true));

    if(collectionObject.exists()) {

        UiObject scrollableObject = collectionObject.getChildByText(new UiSelector().className("com.tencent.Tim"), targetName);

        scrollableObject.clickAndWaitForNewWindow();

    } else {

        UiObject targetObject = new UiObject(new UiSelector().className(targetClassName).text(targetName));

        targetObject.clickAndWaitForNewWindow();

    }

}

 

或者

//以步长为5(默认值)快速向下()滑动

UiScrollable scroll=new UiScrollable(new UiSelector().className("android.widget.ListView"));

scroll.flingForward();

④ UiObject:UiObject可代表页面的任意元素,它的各种属性定位通常通过UiSelector来完成。


TAG:

 

评分:0

我来说两句

Open Toolbar