原文地址:http://blog.csdn.net/g19920917/article/details/16131565

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文件

文件内容为:

  1. package com;
  2. import com.android.uiautomator.core.UiObject;
  3. import com.android.uiautomator.core.UiObjectNotFoundException;
  4. import com.android.uiautomator.core.UiScrollable;
  5. import com.android.uiautomator.core.UiSelector;
  6. import com.android.uiautomator.testrunner.UiAutomatorTestCase;
  7. public class Runner extends UiAutomatorTestCase {
  8. public void testDemo() throws UiObjectNotFoundException {
  9. getUiDevice().pressHome();
  10. // 进入设置菜单
  11. UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
  12. settingApp.click();
  13. //休眠3秒
  14. try {
  15. Thread.sleep(3000);
  16. } catch (InterruptedException e1) {
  17. // TODO Auto-generated catch block
  18. e1.printStackTrace();
  19. }
  20. // 进入语言和输入法设置
  21. UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));
  22. UiObject languageAndInputItem = settingItems.getChildByText(
  23. new UiSelector().text("Language & input"), "Language & input", true);
  24. languageAndInputItem.clickAndWaitForNewWindow();
  25. }
  26. }

上面工程路径在e:\workspace\AutoRunner,类全名为com.Runner,至于具体的作用我们现在不去关心。

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:

  1. UiScrollable settingItems = new UiScrollable( new UiSelector().scrollable(true));
  2. UiObject languageAndInputItem = settingItems.getChildByText(
  3. new UiSelector().text("Language & input"), "Language & input",
  4. true);

上面的形式就可以在滚动中查找显示有“Language & input”的控件,也就是“语言和输入法”的设置项。

5.6、等待操作和添加Log的方法

如果是对于一个标准的UiObject对象,可以通过clickAndWaitForNewWindow的方法在点击之后主动等待一段事件,但是如果需要额外的等待一段时间,特别对于getUiDevice().pressHome();这种操作,可能需要很长的事件去为下一步操作获取更多的事件,此时我们可以使用线程的sleep方法去实现:

  1. //等待3秒
  2. try {
  3. Thread.sleep(3000);
  4. } catch (InterruptedException e1) {
  5. e1.printStackTrace();
  6. }

而添加Log的方法也可以通过Java标准的println来实现:
    System.out.println("This used to print some log!!!" + setLanItem.getText());
    以上Log将会在jar被运行时通过CMD窗口打印出来。

六、一个相对完整的测试case

 

下面就用一个相对连贯的测试用例来串一下上面的知识点,这个case用例要做的就是进入系统设置菜单,然后选择“语言和输入法”菜单,然后进入“语言设置”菜单,然后在第一项上点击,把当前语言设置为“简体中文”:

    1. public void setChineseLan() throws UiObjectNotFoundException {
    2. //进入操作前,先用Home键进入待机界面
    3. getUiDevice().pressHome();
    4. //进入“系统设置”菜单。也可以通过点击menu按键来实现
    5. UiObject settingApp = new UiObject(new UiSelector().text("Settings"));
    6. settingApp.click();
    7. //等待3秒
    8. try {
    9. Thread.sleep(3000);
    10. } catch (InterruptedException e1) {
    11. e1.printStackTrace();
    12. }
    13. //用滚动的方式查找并进入“语言和输入法设置”菜单
    14. UiScrollable settingItems = new UiScrollable(
    15. new UiSelector().scrollable(true));
    16. UiObject languageAndInputItem = settingItems.getChildByText(
    17. new UiSelector().text("Language & input"), "Language & input",
    18. true);
    19. languageAndInputItem.clickAndWaitForNewWindow();
    20. //找到“English”的可点击项(因为当前是英文环境)
    21. UiObject setLanItem = new UiObject(new UiSelector().text("English"));
    22. setLanItem.clickAndWaitForNewWindow();
    23. //Log输出
    24. System.out.println("setLanItem-->" + setLanItem.getPackageName());
    25. //由于无法识别中文,因此我们这里使用坐标去选择“简体中文”项
    26. getUiDevice().click(350, 250);
    27. //点击返回键,回到待机界面
    28. getUiDevice().pressBack();
    29. getUiDevice().pressBack();
    30. getUiDevice().pressBack();

【转】UiAutomator简要介绍的更多相关文章

  1. 简要介绍BASE64、MD5、SHA、HMAC几种方法。

    加密解密,曾经是我一个毕业设计的重要组件.在工作了多年以后回想当时那个加密.解密算法,实在是太单纯了.     言归正传,这里我们主要描述Java已经实现的一些加密解密算法,最后介绍数字证书.     ...

  2. [转]Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划

    转自:Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划 前面我们从Android应用程序与SurfaceFlinger服务的关系出发,从侧面简单学习了Surfa ...

  3. [转] Android资源管理框架(Asset Manager)简要介绍和学习计划

    转自:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分内容组成:代码和资源.资源主要就是指那些与U ...

  4. Activity启动过程简要介绍

    无论是通过点击应用程序图标来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都要借助于应用程序框架层的ActivityManagerSe ...

  5. Android应用程序的Activity启动过程简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6685853 在Android系统中,Activ ...

  6. Dalvik虚拟机简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8852432 我们知道,Android应用程序是 ...

  7. Android资源管理框架(Asset Manager)简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8738877 Android应用程序主要由两部分 ...

  8. Android应用程序组件Content Provider简要介绍和学习计划

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6946067 在Android系统中,Conte ...

  9. Android窗口管理服务WindowManagerService的简要介绍和学习计划

    在前一个系列文章中,我们从个体的角度来分析了Android应用程序窗口的实现框架.事实上,如果我们从整体的角度来看,Android应用程序窗口的 实现要更复杂,因为它们的类型和作用不同,且会相互影响. ...

随机推荐

  1. IIS安装asp组件:JMail 邮件收发组件

    JMail简介 jmail是一种服务器端的邮件发送组件,和个人用的客户端邮件软件不一样的.jmail是在服务器上给程序用来发邮件用的,除了软件编程人员,其他人一般平常用不上. jmail是一个第三方邮 ...

  2. Android开发技巧——PagerAdapter再简单的包

    再次内容View的ViewPager该适配器PagerAdapter简包,支持List数据与SparseArray数据.随着更新的浏览功能. 首先,首先贴上顶部抽象类代码: /* * Date: 14 ...

  3. 【Nginx】如何应对HTTP组态

    相同的配置项可以在相同的时间内发生的多个块.例如HTTP片.server片.location片.阻断取之于在配置项值. 处理HTTP配置项分下面4个步骤: 创建数据结构用于存储配置项相应的參数 设定配 ...

  4. 导出文本pdf文件

    出口手续往往是一些数据需求,学习文本导出到今天pdf文件.主要用于QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Qt: ...

  5. C#依据word模版动态生成文档

    新生开学,各院系辅导员代领校园卡.需要打印一份领取卡的协议,协议模版固定,但各院系卡的数量不同.需要从excel表格中抽取数据往word文件中填,同事咨询是否可以用word中的邮件合并功能,心想有这功 ...

  6. hdu 1290 竭诚为杭州电礼物50周年

    专门为杭州电50周年礼事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tot ...

  7. WPF:警惕TextBox会占用过多内存

    原文:WPF:警惕TextBox会占用过多内存 问题源自这篇文章:WPF的TextBox产生内存泄露的情况. 整个问题是这样的,文章作者演示使用类似下方的代码来不停地像WPF的TextBox控件赋值: ...

  8. 多于ListView同步滚动

    简介: 发展过程中可能遇到的2一个或多个其他listview为了用相应的关系保持滚动的情况下一起,本文演示了这种效应为大家. 功效: 实现原理: 在滚动当中不论什么一个ListView的时候,同一时候 ...

  9. 【 Android官方文件读书笔记】连接网络

    一间连接应用网络的主要功能.Android系统对网络连接进行了封装,使得开发人员可以更快的给应用添加网络功能.大多数网络连接的Android应用使用HTTP发送和接受数据.Android包含两个HTT ...

  10. Eclipse 发布到网站的附加产品的形式 Update Site

    Eclipse 发布到网站的附加产品的形式 Update Site 通过Update Site Project项目将自己做的插件产品公布到公网上,给客户或其它測试人员下载和应用,这样自己的插件就以网站 ...