UI Automator 常用 API 整理

主要类:

import android.support.test.uiautomator.UiDevice;

作用:设备封装类,测试过程中获取设备信息和设备交互。

import android.support.test.uiautomator.UiObject;

作用:所有控件抽象,用于表示一个Android控件。

import android.support.test.uiautomator.UiObjectNotFoundException;

作用:异常处理机制,在预期控件不存在时抛出。

import android.support.test.uiautomator.UiSelector;

作用:控制选择器,利用控制属性描述目标控件,用于控件匹配使用。

import android.support.test.uiautomator.Configurator;

所用:配置基类,用以控制测试过程的事件等超时、控件可见超时等。

import android.support.test.uiautomator.UiCollection;

作用:控件集合,用于控件遍历。

import android.support.test.uiautomator.UiScrollable;

作用:滚动控件,当目标控件存在于屏幕之外时使用。

import android.support.test.uiautomator.UiWatcher;

作用:界面观察者,用于处理弹窗中断逻辑。


### 定位控件 ```Java import android.support.test.uiautomator.By; 作用:可以更简洁的方式使用ByScelector 选择器。 用法: findObject(By.text(“text”))

import android.support.test.uiautomator.BySelector;
作用: BySelector 调用findObject 时匹配UI 元素
用法:
findObject(new BySelector().text(“text”))

<br>
### By类常用定位方法

```Java
/**
 * 通过文本 text 定位控件
 * 例如: text = "hello world"
 */
device.findObject(By.text("text"));
device.findObject(By.textContains("llo wor"));
device.findObject(By.textStartsWith("hello"));
device.findObject(By.textEndsWith("world"));

/**
 * 通过内容描述 content-dec 定位控件
 * 例如: desc = "content-dec"
 */
device.findObject(By.desc("content-dec"));
device.findObject(By.descContains("tent"));
device.findObject(By.descStartsWith("content"));
device.findObject(By.descEndsWith("-dec"));

/**
 *  通过包名package定位控件
 *  例如: package = "com.android.calculator2"
 */
device.findObject(By.pkg("com.android.calculator2"));

/**
 *  通过资源名 resource 定位控件
 *  例如: resource = "com.android.calculator2:id/digit_0"
 */
device.findObject(By.res("com.android.calculator2:id/digit_0"));

/**
 *  通过类名 class定位控件
 *  例如: class = "android.widget.Button"
 */
device.findObject(By.clazz("android.widget.Button"));


### UiDevice类常用方法

// home键
device.pressHome();

// back 键
device.pressBack();

// 显示最近打开并置于后台的App
device.pressRecentApps();

// 快速设置键
device.openQuickSettings();

// 打开通知
device.openNotification();

// 虚拟键盘,参考appium
device.pressKeyCode(17);

// 获得屏幕高度和宽度
int x = device.getDisplayWidth();
int y = device.getDisplayHeight();
String xs =String.valueOf(x);
String ys =String.valueOf(y);
Log.e("xxxxxxxxxx", xs);
Log.e("yyyyyyyyyy", ys);

// 向下滑显示通知栏
device.swipe(200,0,200, 300,180);
// 向左滑显示右一屏
device.swipe(20,400,460, 400,180);

// 获取当前应用活动名 和 包名
String activity = device.getCurrentActivityName();
String packagea = device.getCurrentPackageName();
Log.e("activity", activity);
Log.e("packagea", packagea);

// 休眠屏幕
device.sleep();
// 如果屏幕熄灭,点亮
device.wakeUp();


### UiObject2类常用方法

UiObject2 element = device.findObject(By.text("text"));

//清除元素,针对输入框
element.clear();

// 点击
element.click();

// 长按
element.longClick();

// 获取元素文本
element.getText();

//设置元素文本,相当于输入
element.setText("new text");

//获取元素scrollable属性,判断是否可滚动
element.isScrollable();

// 判断两个对象是否一致
UiObject2 element2 = device.findObject(By.text("text"));
element.equals(element2);

//获取元素content_desc属性
element.getContentDescription();

// 获取包名 package 属性
element.getApplicationPackage();

// 获取元素的子元素集合
element.getChildren();

// 获取元素的子元素的个数
element.getChildCount();

// 获取元素的class属性
element.getClassName();

// 获取元素的 resource-id 属性
element.getResourceName();

// 将元素拖动到指定位置
Point desPoint = new Point();
desPoint.x = 200;
desPoint.y = 20;
element.drag(desPoint, 2000);

// 点击并等待新窗口
element.clickAndWait(Until.newWindow(), 2000);


###Configurator类

Configurator configurator = Configurator.getInstance();

//动作,设置延时, 默认3s
configurator.setActionAcknowledgmentTimeout(1000);

//键盘输入,设置延时,默认0s
configurator.setKeyInjectionDelay(1500);

// 滚动,设置延时, 默认200ms
configurator.setScrollAcknowledgmentTimeout(2000);

// 空闲,设置延时,默认10s
configurator.setWaitForIdleTimeout(2500);

// 组件查找, 设置延时, 默认10s
configurator.setWaitForSelectorTimeout(3000);


###UiWatcher 类用法

final UiObject2 ui = mDevice.findObject(By.text("Messenger"));
//注册监听器
mDevice.registerWatcher("testWatcher", new UiWatcher() {
    @Override
    public boolean checkForCondition() {
        if(mDevice.hasObject(By.text("Contact"))){
            ui.click();
            Log.i("testWatcher", "监听器被触发了");
            return true;
        }
        Log.i("testWatcher", "监听器未被触发");
        return false;
    }
});

//重置监听器
mDevice.resetWatcherTriggers();

//移除监听器
mDevice.removeWatcher("testWatcher");

//运行所有的监听器
mDevice.runWatchers();


###UiScrollable 类的常用方法

UiScrollable scroll  = new UiScrollable( new UiSelector()
        .scrollable(true));

// 以步长为5快速向后滑动
scroll.flingBackward();

//以步长为5快速向前滑动
scroll.flingForward();

// 是否允许滚动获取具备UiSelector条件元素集合后, 再以text属性的查找对象
scroll.getChildByText(
        new  UiSelector().resourceId("android:id/title"), "About emulated device", true);
// 是否允许滚动获取具备UiSelector条件元素集合后, 再以content-desc属性搜索子元素
scroll.getChildByDescription(new UiSelector().text("text"), "content-desc", true);

//通过实例查找子元素,资源id为"android:id/title"下的第1个实例
scroll.getChildByInstance(new UiSelector().resourceId("android:id/title"),0);

// 获取执行搜索滑动过程中的最大滑动次数,默认常量为30
scroll.getMaxSearchSwipes();

//设置最大可扫动次数
scroll.setMaxSearchSwipes(50);

/**
 * 设置listview校准常量为0.15,即距离listview顶部15%和底部15%的区域不可滑动,只有控件中部70%的区域可滑动。
 * 当校准常量设置为0.5时,控件的可滑动区域为0,滑动的动作效果将和单击的效果一样。
 */
scroll.setSwipeDeadZonePercentage(0.15);
// 获得校准常量,校准常量默认值为0.1(10%)
scroll.getSwipeDeadZonePercentage();

//设置滚动方向设置为水平滚动
scroll.setAsHorizontalList();
// 设置滚动方向设置为纵向滚动
scroll.setAsVerticalList();

// 滚动到某个元素上
scroll.scrollIntoView(new UiSelector().text("abc"));
//滚动到文本对象所在位置
scroll.scrollTextIntoView("abc");

//自定义最大滚动次数,滚动到开始/结束位置
scroll.scrollToBeginning(30);
scroll.scrollToEnd(30);
//以步长(速率)5滚动到列表底部,最多滚动10次。
scroll.scrollToEnd(10, 5);


### UiCollection 类的常用方法

UiCollection  coll = new UiScrollable(new UiSelector()
.resourceId("android:id/title"));
// 查找元素下面子元素的数量
coll.getChildCount();
// 获取元素集合,再以text属性的查找对象
coll.getChildByText(new UiSelector().text("Display"), "Display");
// 获取元素集合,再查找其下面第1个元素
coll.getChildByInstance(new UiSelector().text("Display"), 0);
// 获取元素集合,再以content_desc属性的查找对象
coll.getChildByDescription(new UiSelector().text("Display"), "content_desc");
// 获得指定的子元素
coll.getChild(new UiSelector().text("aaa"));

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/343285.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode.670. 最大交换

题目 题目链接 分析 这道题的意思是我们只能交换一次&#xff0c;需要得到最大的数字。 我们的第一个想法就是要这个数字先变成一个数组&#xff0c;便于我们操作。 然后把数组最大的数放到第一个位置&#xff0c;如果最大的数字已经在第一个位置&#xff0c;那么就把次大的…

k8s之ingress

ingress基于域名进行映射&#xff0c;把url(http https)的请求转发到service&#xff0c;再由service把请求转发到每一个pod ingress只要一个或者少量的公网ip或者LB&#xff0c;可以把多个http请求暴露到外网&#xff0c;七层反向代理 理解为service的service&#xff0c;是…

windows11上安装虚拟机VMware

1、安装虚拟机&#xff08;待补充&#xff09; 第二步&#xff1a;安装VMware tools 实现windows文件上传到虚拟机中 1、安装好虚拟机后&#xff0c;查看虚拟机ip用Xshell连接虚拟机&#xff0c;并安装VMware tools(只有安装了VMware tools才能实现虚拟机和本机的文件共享。在…

shell脚本概念构成及脚本变量详解

目录 一、前言 1、程序编程风格 2、编程语言 3、编程的三种处理逻辑 二、shell脚本 1、shell脚本基础 1.1 什么是shell 1.1.1 shell的概念 1.1.2 linux中常见的shell类型及信息 1.1.3 shell脚本的功能 1.2 shell脚本及构成 1.3 shell脚本执行方式 1.4 脚本错误调试…

leetcode 670. 最大交换

题目&#xff1a; 解题方法 1.将整数转换成列表 2.从列表第一个数开始&#xff0c;每取出一次&#xff0c;找出列表余下数据&#xff08;列表list1&#xff09;的最大值,若取出的值小于list1的最大值&#xff0c;说明需要进行置换&#xff0c;置换处理&#xff1a; 找出lis…

基于51单片机开发的语音存储播放系统

实物演示效果&#xff1a; https://www.bilibili.com/video/BV1Ei4y1s7Jc/?vd_source6ff7cd03af95cd504b60511ef9373a1d 系统简介&#xff1a; 系统由单片机STC89C52、功率放大器、语音芯片ISD4004-16、液晶LCD1602、独立按键、扬声器等组成&#xff0c;用户可以通过按键设…

【剑指offer】重建二叉树

&#x1f451;专栏内容&#xff1a;力扣刷题⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、题目描述1、题目2、示例 二、题目分析1、递归2、栈 一、题目描述 1、题目 剑指offer&#xff1a;重建二叉树 给定节…

蓝桥杯Java组备赛(比赛环境:eclipse安装配置,hello world运行,常规操作配置)

目录 1.官方开发环境2.Eclipse安装1.官网下载2.本地安装3.编写helloworld 3.Eclipse操作优化1.设置自动补全代码2.常用快捷键3.调节字体大小和主题 1.官方开发环境 赛事大纲网址&#xff1a; https://dasai.lanqiao.cn/notices/846/2.Eclipse安装 1.官网下载 网址&#xff…

RuoYi-Cloud本地部署--详细教程

文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…

基于SAM的视频标注

在本文中&#xff0c;我们将演示基础模型的应用&#xff0c;例如 Meta 的 Segment Anything 和 YOLOv8&#xff0c;以自动检测、分类和绘制视频中感兴趣对象的蒙版。这是之前指南的后续&#xff1a;使用 Meta 的 Segment Anything 和 YOLOv8 自动分类掩码。在本指南中&#xff…

跟着顶刊学科研绘图——nature配色篇(一)

只有朝着100分学习&#xff0c;才能想出80分的想法&#xff0c;交出60分的答卷。 今日一起跟着nature培养科研绘图配色的美感。 三色对比 四色对比 今日学习收获 现在顶刊感觉更加喜欢马卡龙色这种浅色系啊 参考文献 [1] Lim, F., Solvason, J.J., Ryan, G.E. et al. Affi…

面试篇-大厂的面试流程和面试注意事项

以前找工作的时候&#xff0c;对于流程中的面试总是好奇流程走到哪一步了&#xff0c;这一轮面试有没有通过&#xff0c;后面不通过还有没有消息通知等问题。今天作为一个求职者和面试官的身份来主要讲一下大厂招聘&#xff0c;内部的面试过程以及流转的流程是什么样的以及该注…

latex添加图片以及引用的实例教程

原理 在 LaTeX 中插入图片&#xff0c;通常是使用 \includegraphics 命令&#xff0c;它是由 graphicx 包提供的。首先&#xff0c;确保在文档的前言部分&#xff08;\documentclass 之后和 \begin{document} 之前&#xff09;包含了 graphicx 包。 下面是一个基本的例子来展…

【VUE】如何有效管理重复请求

【VUE】如何管理重复请求 需求 重复的HTTP请求可能对应用程序性能造成很大影响&#xff0c;尤其是在用户快速点击或多次触发同一操作时。在Vue应用中&#xff0c;我们可以使用axios的请求拦截器&#xff08;interceptors&#xff09;配合AbortController来取消重复的HTTP请求…

防抖(debounce)

防抖:单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次 所谓防抖&#xff0c;就是指触发事件后在 n 秒内函数只能执行一次&#xff0c;如果在 n 秒内又触发了事件&#xff0c;则会重新计算函数执行时间 现在有一个小栗子&#xff1a;鼠标在box中移动的时候&#…

OSS存储引擎如何使用以及如何添加图片【建议收藏】

Aliyun OSS对象存储&#xff0c;可以用来做文件服务器&#xff0c;存放一些文件&#xff0c;图片等资源&#xff0c;那么我们使用OSS&#xff0c;需要经历以下步骤&#xff1a; 这里就从如何开通OSS服务开始进行&#xff0c;到如何上传一个资源文件到OSS结束。 1、阿里云注册 …

第二百八十四回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了下拉刷新组件相关的内容&#xff0c;本章回中将介绍WillPopScope组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在本章回中介绍的WillPopScope组件是一种事件拦截类组件&#xff0c;它没有具体…

Redis服务端优化(持久化配置、慢查询、命令及安全配置、内存配置)

文章目录 持久化配置慢查询命令及安全配置内存配置 持久化配置 慢查询 命令及安全配置 漏洞&#xff1a;Redis未授权访问配合SSH key文件利用分析-腾讯云开发者社区-腾讯云 (tencent.com) 漏洞出现的核心的原因有以下几点 Redis未设置密码利用了Redis的config set命令动态修…

UI自动化测试框架搭建 —— yaml文件管理定位元素

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【C++】list的使用

目录 1 构造1.1 无参构造1.2 构造的list中包含n个值为val的元素1.3 用[first, last)区间中的元素构造list1.4 拷贝构造 2 迭代器的使用2.1 begin end2.2 rbegin rend 3 容量操作3.1 empty size 4 获取元素4.1 front back 5 插入、删除、修改5.1 头插-push_front和尾插-push…