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)主要使用到的类只有几个,如下UiDevice,UiSelector,UiObject,UiScrollable,Uiobjection。
2、UiAutomator环境搭建:
(1) JDK (2) eclipse (3) android sdk (4) ANT
(5) 在使用uiautomator之前需要进行导入一个Junit、uiautomator.jar和android.jar的包;
eclipse-->新建java project-->libraries-->Add External JARS添加uiautomator.jar和android.jar-->Add Libraries添加Junit
3、UiAutomator自动化测试步骤:
(1) eclipse中编写脚本,UIAUtomator框架需要用到Junit、android.jar、uiautomator.jar
① 添加Junit库:new java project-->Labraries-->Add Labraries选择Junit
② 添加android.jar和uiautomator.jar:
new java project-->Labraries-->Add External JARS...-->选择android.jar和uiautomator.jar
(文件路径:D:\android sdk\android-sdk_r24.4.1-windows\android-sdk-windows\platforms)
创建新类:选择ui-->uid
(2) cmd中cd到D:\android sdk\android-sdk_r24.4.1-windows\android-sdk-windows\tools
(3) 运行命令 android list target,查看对应android版本的SDK的ID值,要选择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_path:Eclipse里刚才建立的测试工程脚本的路径的根目录
(5) 运行命令后,将会在工程的根目录下生成build.xml文件。
(6) cmd中cd进入到eclipse生成build.xml文件所在目录,运行ant build,将使用ant编译生成jar,成功后,会在工程bin目录下生成对应名称的jar包。
(7) 将jar包push到手机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来完成。