小小糖 发表于 2018-4-23 13:38:10

Uiautomator基本概念和常用命令

在Android 4.1发布的时候包含了一种新的测试工具–uiautomator,uiautomator是用来做UI测试的。也就是普通
的手工测试,点击每个控件元素,查看输出的结果是否符合预期。比如:在登录界面分别输入正确和错误的用户
名密码然后点击登录按钮看看是否能否登陆以及是否有错误提示等。

uiautomator 是一种移动端自动化UI测试工具。

环境要求:

  Android SDK在4.1中提供了如下工具来支持UI自动化测试:
    uiautomatorviewer – 一个图形界面工具来扫描和分析应用的UI控件。
    uiautomator – 一个测试的Java库,包含了创建UI测试的各种API和执行自动化测试的引擎。
  要使用该工具,需要满足如下条件:
    Android SDK Tools, Revision 21 or higher
    Android SDK Platform, API 16 or higher

uiautomator 测试工具的工作流程:

  1.安装要测试的应用到手机中,分析应用的UI界面元素 并确保被测试应用的各个控件可以被测试工具获
取到。

  2.创建指导测试案例来模拟应用中的用户操作步骤。

  3.编译测试案例代码为Jar包并复制该Jar包到安装了待测应用的测试手机中。

  4.运行测试并查看结果

  5.修改任何发现的bug,然后修复并重新测试。


分析待测应用的UI元素:

  在开始编写测试案例代码之前,需要熟悉待测应用的UI元素。可以通过uiautomatorviewer 工具来获取应
用的界面截图并分析。uiautomatorviewer 工具提供了一个便利的方式来查看UI布局结构,并且可以查看各个
控件的相关属性。利用这些信息可以用来创建UI测试代码。

创建uiautomator 测试案例:

  uiautomator 测试案例(Test case)需要继承至UiAutomatorTestCase 类。而UiAutomatorTestCase 类继
承至junit.framework.TestCase类,所以可以用JUnit的Assert类来比较测试结果。
  UI测试的首要任务就是访问测试手机。一般都是从手机的主屏开始测试的。通过uiautomator 提供的API
可以从主屏来模拟用户的操作。

uiautomator API:

  uiautomator API在 uiautomator.jar 文件中。这些API分别如下:

    UiDevice:代表设备状态。在测试中,可以通过UiDevice实例来检测设备的各种属性,例如当前的屏
幕方向以及屏幕尺寸。同时还可以通过UiDevice实例来执行设备级别的操作,例如把设备设置为横屏或者竖
屏、按下Home按键等。

      模拟按下Home按键的代码::

      getUiDevice().pressHome();

详细实例:

复制代码
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()
    ----将手机旋转状态回归正常。
复制代码


    UiSelector:代表一个搜索UI控件的条件。如果发现多个满足条件的控件则会返回第一个控件。返回的
结果为UiObject对象。在构造UiSelector的时候可以组合使用多个属性来定位具体的控件。如果没有找到控件则
会抛出 UiAutomatorObjectNotFoundException 异常。还可以使用childSelector()函数来嵌套UiSelector 对象。
例如,下面的代码演示了如何在当前界面中查找第一个ListView中的带有文本属性为Apps的子控件:

      UiObjectappItem = new UiObject(new UiSelector().className("android.widget.ListView").insta
nce(1).childSelector(newUiSelector().text("Apps")));

详细实例:

复制代码
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属性找到的控件,
必须是英文的。也就是说,不支持通过中文查找控件!(编码改为utf-8后是可以的)。
    textContains(text)
    ----与text类似
    textStartsWith(text)
    ----与text类似
复制代码


    UiObject:代表一个UI控件。通过UiSelector来查找UiObject。如下示例代码演示了如何查找当前显示
界面中的取消按钮和确认按钮:  

      UiObjectcancelButton = new UiObject(new UiSelector().text("Cancel"));

      UiObjectokButton = new UiObject(new UiSelector().text("OK"));

      查找到的UiObject实例可以在其他测试代码中重用。需要注意的是:每次使用UiObject做操作的
时候uiautomator 都会在当前屏幕重新查找该控件。如下代码uiautomator 工具在当前界面查找文本内容为“O
K”的控件。如果存在并且可用则模拟用户点击该控件:



      if(okButton.exists()&& okButton.isEnabled())

      {

        okButton.click();

      }

      还可以限制仅仅查找特定类型的控件。例如,如下代码只查找文本为“Cancel”和“OK”的android.widget.Button类型控件:  

      UiObjectcancelButton = new UiObject(new UiSelector().text("Cancel").className("android.widget.Button"));

      UiObjectokButton = new UiObject(new UiSelector().text("OK").className("android.widget.Button"));

详细实例:

复制代码
click()
    ----点击控件
    clickAndWaitForNewWindow()
    ----点击某个控件,并等待窗口刷新
    longClick()
    ----长按
    clearTextField()
    ----清除文本,主要针对编辑框
    getChildCount()
    ----这个方法可以看出,其实UiObject也可以是一个控件的集合
    getPackageName()
    ----得到控件的包名
    getSelector()
    ----得到当前控件的选择条件
    getText()
    ----得到控件上的Text
    isCheckable()
    isChecked()
    isClickable()
    isLongClickable()
    isScrollable()
    isScrollable()
    isSelected()
    ----判断是否具备某个属性
复制代码


    UiCollection:代表控件的集合。获取UiCollection的方式和UiObject一样,通过 UiSelector查找。 UiColle
ction对应Android系统中的ViewGroup以及子控件。如下代码演示如何通过UiSelector来获取包含视频集合的UiCollection:

      UiCollectionvideos = new UiCollection(new UiSelector().className("android.widget.FrameLayout"));

      如果每个视频是放到LinearLayout中的,则可以通过如下方式获取视频的数目:

      int count = videos.getChildCount(new UiSelector().className("android.widget.LinearLayout"));

      如果需要查找标签为“Cute Baby Laughing”的视频,并点击。则可以通过如下方式:

     UiObjectvideo = videos.getChildByText(new UiSelector().className("android.widget.LinearLayou
t"), "CuteBaby Laughing");

      video.click();

     同样还可以模拟其他用户操作。例如,模拟选择视频的操作如下:

      UiObjectcheckBox = video.getChild(new UiSelector().className("android.widget.Checkbox"));

      if(!checkBox.isSelected())

         checkbox.click();

详细实例:

复制代码
getChild(selector)
    ----从集合中再次通过UiSelector选择一个UiObject对象
    getChildByDescription(childPattern, text)
    ----从一个匹配模式中再次以text为条件选择UiObject
    getChildByText(childPattern, text)
    ----与上面类似。
    getChildCount()
    ----得到当前集合中控件的个数
复制代码


    UiScrollable:代表可滚动的控件。可以用UiScrollable来模拟水平或者垂直滚动的UI元素。如果需要操
作的元素在屏幕外需要滚动屏幕才能看到的情况下需要使用UiScrollable。例如,下面的代码显示了如何模拟滚
动到“Settings ”菜单并点击“About tablet”菜单的操作:

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

       UiObjectabout = settingsItem.getChildByText(new UiSelector().className("android.widget.L
inearLayout"), "Abouttablet");

       about.click()

详细实例:

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

梦想家 发表于 2018-5-9 10:00:58

:victory:
页: [1]
查看完整版本: Uiautomator基本概念和常用命令