Android自动化测试

记录 2018-08-08 该东西只是记录,方便你我他

导包:

 compile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

UiDevice 此类介绍:

打开某个APP

 UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
        try {
            UiObject x = mDevice.findObject(new UiSelector().text("中国农业银行"));
            x.click();
        } catch (UiObjectNotFoundException e) {
            e.printStackTrace();
        }

//UiDevice 方法大致介绍
mDevice.pressBack();//模拟手机回退键
mDevice.pressHome();//模拟手机Home键
mDevice.pressMenu();//模拟手机菜单键
mDevice.pressRecentApps();//模拟手机任务栏
...        //刻根据业务需求来加自己业务上的东西

工具介绍

uiautomatorviewer.bat

在其目录为:

D:\Android\SDK\tools\bin

页面为这个样子的:

image.png
  UiObject uiObject = new UiObject(new UiSelector().resourceId("com.android.systemui:id/recent_app_clear"));
                    if (uiObject.exists()) {
                        uiObject.click();
                    }
image.png
// 在该页面查找ID为:com.android.systemui:id/task_view_thumbnail 的控件
    UiObject uiObject = new UiObject(new UiSelector().resourceId("com.android.systemui:id/recent_app_clear"));
      //该控件是否存在
      if (uiObject.exists()) {
      //模拟点击该控件
        uiObject.click();
         }

如果控件没有ID该咋办?那就取它的【内容】和【类】

image.png

在TEXT里边这样写

  UiObject weixin= new UiObject(new UiSelector().text("微信").className("android.widget.TextView"));
              //判断是否存在
                if (weixin.exists()) {
                  //模拟点击
                    weixin.click();
                    break;
                }

如果我想在文本框输入东西该咋办,我这里用的是ID,没有ID用类名 + 内容

image.png
  UiObject duanxin= new UiObject(new UiSelector().resourceId("com.zui.mms:id/recipient_text_view"));
              //判断是否存在
                if (duanxin.exists()) {
                  //模拟点击
                    duanxin.setText("你要输入的Text");
                    break;
                }

如果我又没有 [ID] 也没有【内容】 该咋查找

第一种方法

image.png

步骤1.我们先找到上层树有ID得控件

image.png

步骤2.找到子类控件开始写代码

image.png

我们找到第一个子类控件为:android.widget.LinearLayout Index为:1

image.png

image.png

我们找到第二个子类控件为:android.widget.LinearLayout Index为:1

image.png

image.png

我们找到第三个子类控件为:android.widget.LinearLayout Index为:0

image.png

image.png

我们找到第四个子类控件为:android.widget.TextView Index为:0

image.png

image.png

找到了!

代码是这样的

image.png

image.png
  UiObject uiObject = new UiObject(new UiSelector().resourceId("com.zui.filemanager:id/fileListView"));
        UiObject child = uiObject.getChild(new UiSelector().className("android.widget.LinearLayout").resourceId("com.zui.filemanager:id/background").index(1));
        UiObject child1 = uiObject.getChild(new UiSelector().className("android.widget.LinearLayout").index(1));
        UiObject child2 = child1.getChild(new UiSelector().className("android.widget.LinearLayout").index(0));
        UiObject child3 = child2.getChild(new UiSelector().className("android.widget.TextView").index(0).resourceId("com.zui.filemanager:id/file_name"));

        if (child3.exists()) {
            child3.click();
        }

第二种

12.3

正确的数为层叠数,明白吧?就是树状往下数,别一股脑往下数

代码为:

     UiObject view1 = new UiObject(new UiSelector().className("android.view.View").instance(24));//数字表示你数的位置
      UiObject view2 = new UiObject(new UiSelector().className("android.view.View").instance(25));//数字表示你数的位置

如果不会数,或者嫌麻烦又或者说太辣眼睛,就直接for循环

for循环中的100你自己摸索一下看看页面元素多不多,估算一下,也可能会有200多个

for(int i = 0;i<100;i++){

   String test = "";
            UiObject view1 = new UiObject(new UiSelector().className("android.view.View").instance(24));
            UiObject view2 = new UiObject(new UiSelector().className("android.view.View").instance(25));

            try {
                test = view1.getText();
                if(test == null || test.isEmpty()){
                    test = view1.getContentDescription();
                }
            }catch(Exception e){
                test = view1.getContentDescription();
            }

            Log.e("输出", "auditOrder: " + "该元素名称为:" + test + "该元素位置为:" + i );
}

既没有className也没有index咋办?

直接模拟点击屏幕

image.png

也可以在开发者模式中,选择显示触摸位置

UiDevice.getInstance().click(x,y)

读不到页面怎么办,报错为:

image.png

Error taking device screenshot: EOF

Error taking device screenshot: EOF

这个只能用adb命令来完成了,这样能获取到,只不过有点麻烦

执行该命令获取页面元素为xml,那个工具就是uiautomatorviewer获取的也是xml

这个是没办法中的办法,所以就没有那么优越的窗口供我们使用了,只能用txt文本在里边找

//执行该命令获取页面元素为xml
adb shell /system/bin/uiautomator dump /data/local/tmp/liukangUi.xml
//返回该提示代表成功:dump: creates an XML dump of current UI hierarchy 
//推送到电脑
adb pull /data/local/tmp/liukangUi.xml D:\Xml

返回该提示代表成功:dump: creates an XML dump of current UI hierarchy

创作不易,请作者喝杯咖啡吧~~~~·

作者:XINHAO_HAN

你可能感兴趣的:(Android自动化测试)