2013-11-14 18:50 49703人阅读 (21)
目录
一、一个BUG引发的问题
如果需要上面的功能,那么就开始自动化之旅吧。
二、Android自动化测试简单介绍
本文主要介绍UiAutomator的使用方法。
三、环境搭建
3.1、必备条件:
1、JDK 2、SDK(API高于15) 3、Eclipse(安装ADT插件) 4、ANT(用于编译生成jar)3.2、简要步骤:
1、安装JDK并添加环境变量。 安装后,一定要通过JAVA_HOME的方式添加环境变量,即先建立JAVA_HOME变量,然后在path中添加%JAVA_HOME%\bin; 2、添加SDK环境变量。 一定要先建立ANDROID_HOME,然后把%ANDROID_HOME%\tools添加到path中; 3、安装Eclipse,并安装ADT插件。 4、安装ANT工具,并添加环境变量。同样一定要先建立%ANT_HOME%变量,然后在path中添加%ANT_HOME%\bin
四、详细操作
4.1、建立工程
用Eclipse新建Java Project,注意,不是Android Project!
4.2、添加JUnit库
next->Libraries->Add Library
4.3、添加Android库
Add External JARs:
找到路径Android-sdk\platforms\android-17\下面的android.jar和uiautomator.jar添加进来:
所有库添加完应该是这个样子:
4.4、在src中添加包,然后添加class文件
文件内容为:
- package com;
- import com.android.uiautomator.core.UiObject;
- import com.android.uiautomator.core.UiObjectNotFoundException;
- import com.android.uiautomator.core.UiScrollable;
- import com.android.uiautomator.core.UiSelector;
- import com.android.uiautomator.testrunner.UiAutomatorTestCase;
- public class Runner extends UiAutomatorTestCase {
- public void testDemo() throws UiObjectNotFoundException {
- getUiDevice().pressHome();
- // 进入设置菜单
- UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
- settingApp.click();
- //休眠3秒
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e1) {
- // TODO Auto-generated catch block
- e1.printStackTrace();
- }
- // 进入语言和输入法设置
- UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));
- UiObject languageAndInputItem = settingItems.getChildByText(
- new UiSelector().text("Language & input"), "Language & input", true);
- languageAndInputItem.clickAndWaitForNewWindow();
- }
- }
4.5、找到SDK ID
CMD进入\Android-sdk\tools\目录下,运行命令:android list
查看对应android版本的SDK的ID值,当前是60;4.6、创建build文件
仍然在\Android-sdk\tools\目录下,运行命令: android create uitest-project -n <name> -t <android-sdk-ID> -p <path> 比如: android create uitest-project -n AutoRunner -t 60 -p e:\workspace\AutoRunner 上面的name就是将来生成的jar包的名字,可以自己定义,android-sdk-ID就是上面看到的6;path是Eclipse新建的工程的路径;运行命令后,将会在工程的根目录下生成build.xml文件。如果没生成,检查上面的步骤。4.7、编译生成jar
CMD进入项目的工程目录,然后运行ant build,将使用ant编译生成jar,成功将会提示: 然后会在bin目录下生成jar文件。4.8、push并运行jar
adb push <jar文件路径> data/local/tmp adb shell uiautomator runtest <jar文件名> -c <工程中的类名,包含包名> 比如: adb push e:\workspace\AutoRunner\bin\AutoRunner.jar data/local/tmp adb shell uiautomator runtest AutoRunner.jar -c com.Runner然后就能看到手机会按照Runner中的步骤自动执行。具体效果就是,进入设置菜单,然后再进入“语言和输入法”菜单
五、代码分析
5.1、UiDevice对象
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)。steps表示滑动的这个距离分为几步完成,数目越少,滑动幅度越大。 setOrientationLeft() setOrientationRight() ----将手机向相应方向旋转。 setOrientationNatural() ----将手机旋转状态回归正常。5.2、UiSelector对象
这个对象可以理解为一种条件对象,描述的是一种条件,经常配合UiObject使用,可以得到某个(某些)符合条件的控件对象。 checked(boolean val) ----描述一种check状态为val的关系。 className(className) ----描述一种类名为className的对象关系 clickable(boolean val) ----与checked类似,描述clickable状态为val的关系 description(desc) ----不解释 descriptionContains(desc) ----与description类似 focusable(boolean val) ----与checked类似 index(index) ----用当前对象在父对象集中的索引作为描述 packageName(String name) ----用包名作为条件描述 selected(val) ----描述一种选择关系 text(text) ----最为常用的一种关系,用控件上的文本即可找到当前控件,需要注意,所有使用text属性找到的控件,必须是英文的。也就是说,不支持通过中文查找控件! textContains(text) ----与text类似 textStartsWith(text) ----与text类似5.3、UiObject对象
这个对象可以理解为控件的对象。 一般一个UiObject对象可以通过一下形式得到: UiObject mItem = new UiObject(new UiSelector().text("English")); 也就是配合一个UiSelector就可以得到一个控件。 click() ----点击控件 clickAndWaitForNewWindow() ----点击某个控件,并等待窗口刷新 longClick() ----长按 clearTextField() ----清除文本,主要针对编辑框 getChildCount() ----这个方法可以看出,其实UiObject也可以是一个控件的集合 getPackageName() ----得到控件的包名 getSelector() ----得到当前控件的选择条件 getText() ----得到控件上的Text isCheckable() isChecked() isClickable() isLongClickable() isScrollable() isScrollable() isSelected() ----判断是否具备某个属性5.4、UiCollection对象
这个对象可以理解为一个对象的集合。因为UiSelector描述后得到的有可能是多个满足条件的控件集合,因此可以用来生成UiCollection: UiCollection mUiCollection = new UiCollection(new UiSelector().text("Settings")); getChild(selector) ----从集合中再次通过UiSelector选择一个UiObject对象 getChildByDescription(childPattern, text) ----从一个匹配模式中再次以text为条件选择UiObject getChildByText(childPattern, text) ----与上面类似。 getChildCount() ----得到当前集合中控件的个数5.5、UiScrollable对象
UiScrollable可以生成一个滚动动作的对象,其最大的作用就是可以实现滚动的查找某个元素。比如在“设置”菜单中,“语言和输入法”这个菜单比较靠下,需要滚动后才可以看到(找到),因此就用上了UiScrollable:
- UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));
- UiObject languageAndInputItem = settingItems.getChildByText(
- new UiSelector().text("Language & input"), "Language & input",
- true);
5.6、等待操作和添加Log的方法
如果是对于一个标准的UiObject对象,可以通过clickAndWaitForNewWindow的方法在点击之后主动等待一段事件,但是如果需要额外的等待一段时间,特别对于getUiDevice().pressHome();这种操作,可能需要很长的事件去为下一步操作获取更多的事件,此时我们可以使用线程的sleep方法去实现:
- //等待3秒
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
而添加Log的方法也可以通过Java标准的println来实现: System.out.println("This used to print some log!!!" + setLanItem.getText()); 以上Log将会在jar被运行时通过CMD窗口打印出来。
六、一个相对完整的测试case
- public void setChineseLan() throws UiObjectNotFoundException {
- //进入操作前,先用Home键进入待机界面
- getUiDevice().pressHome();
- //进入“系统设置”菜单。也可以通过点击menu按键来实现
- UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
- settingApp.click();
- //等待3秒
- try {
- Thread.sleep(3000);
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- //用滚动的方式查找并进入“语言和输入法设置”菜单
- UiScrollable settingItems = new UiScrollable(
- new UiSelector().scrollable(true));
- UiObject languageAndInputItem = settingItems.getChildByText(
- new UiSelector().text("Language & input"), "Language & input",
- true);
- languageAndInputItem.clickAndWaitForNewWindow();
- //找到“English”的可点击项(因为当前是英文环境)
- UiObject setLanItem = new UiObject(new UiSelector().text("English"));
- setLanItem.clickAndWaitForNewWindow();
- //Log输出
- System.out.println("setLanItem-->" + setLanItem.getPackageName());
- //由于无法识别中文,因此我们这里使用坐标去选择“简体中文”项
- getUiDevice().click(350, 250);
- //点击返回键,回到待机界面
- getUiDevice().pressBack();
- getUiDevice().pressBack();
- getUiDevice().pressBack();