【Android测试】【第十二节】Uiautomator——API详解

2024-05-27 08:48

本文主要是介绍【Android测试】【第十二节】Uiautomator——API详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【Android测试】【第十二节】Uiautomator——API详解

 版权声明:本文出自carter_dream的博客,转载必须注明出处。

    转载请注明出处:http://www.cnblogs.com/by-dream/p/4921701.html


简单的例子


  以一个简单的例子开始吧。我们完成一个 " 打开QQ,进入QQ空间,然后退出 " 的case。

  代码如下:

复制代码
package QQ;import java.io.IOException;import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiSelector;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;public class Test_qq extends UiAutomatorTestCase
{public void testDemo() throws IOException, UiObjectNotFoundException {// 启应用Runtime.getRuntime().exec("am start com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity");sleep(3000);// 点击 "动态" tabUiDevice device = getUiDevice();int height = device.getDisplayHeight();int width = device.getDisplayWidth();device.click(width -50, height-50);sleep(1000);// 点击 "好友动态" 按钮UiObject obj_1 = new UiObject(new UiSelector().description("点击进入好友动态"));obj_1.click();sleep(2000);// 点击 左上角返回 "动态"按钮UiObject obj_2 = new UiObject(new UiSelector().resourceId("com.tencent.mobileqq:id/ivTitleBtnLeft"));obj_2.click();sleep(1000);// 点击菜单键
        device.pressMenu();sleep(1000);// 点击退出qq        UiObject obj_3 = new UiObject(new UiSelector().text("退出QQ"));obj_3.click();sleep(1000);// 点击确定UiObject obj_4 = new UiObject(new UiSelector().text("确定"));obj_4.click();}
}
复制代码

  脚本的运行效果如下:

 

 

代码详解


  针对上面的例子的代码,我对每一句代码都做个详细的解释吧。

  第一部分:启动应用

  

  exec() 这个函数的意思,相当于是在你在输入adb shell 命令后,在Android手机系统的命令行下运行。所以上面这句话的意思和我们打开cmd框输入" adb shell am start *** " 是一样的的效果。

  一般来说我们做App的自动化的时候,第一步都是把App打开,这个am start命令的就可以帮我们实现,类似与Monkeyrunner API中的startActivity() 函数。

 

  第二部分:点击 “动态” tab

     

  UiDevice对象会在API部分详细讲解,它是一个我们在Uiautomator中经常使用的一个对象。

  这里我们首先用它获取到当前手机的宽和高的像素。然后观察到 “动态” tab位于右下方,因此在取得右下角的坐标点后,又进行了一个大概的坐标变化(这里为了简单只是向左和向上移动了50像素,如果要精确的可以进行等比转化),然后点击该坐标。

  这里之所以用点击坐标的方法,一方面是因为这个控件Uiautomator不支持用API获得实例(上一节所说的NAF Nodes,如下图),另一方面也是想说明在一些控件没有固定的id、text和desc的时候,我们应该怎么处理。

 

  

  第三部分:点击 “好友动态” 

  

  要想操作一个控件(例如),首先得获得一个UiObject对象,而UiObject对象可以通过UiSelector来构造,而UiSelector可以根据控件的idtextcontent-desc来进行构造,这里就是用content-desc来构造。

  

  如上图用 uiautomatorviewer 查到该控件的 content-desc 的内容是 “点击进入好友动态” ,因此我们就可以通过代码中的方法来得到UiObject对象了,然后调用click() 方法来达到点击效果。

  

  第四部分:点击左上角返回按钮

  

  同第三部分的方法,找到id后直接获得到UiObject对象,进行点击。

 

  第五部分:点击菜单键

  

  UiDevice 可以模拟点击home、back、menu 这三个键,代码应该大家都懂的怎么变化了吧。

 

  第六部分:退出

  

  这一部分也是先通过获取出控件属性中的text值,然后构造出UiObject对象,完成点击。

 

  以上部分内容就是整个操作QQ这个小例子的全部代码讲解,看完之后对写Uiautomator代码有了更进一步的了解了吧。接下来写看看还有哪些API可以支持我们做更多的事情。

 

 

API 列举


UiDevice

  概述:

    UiDevice用与访问关设备状态的信息,也可以使用这个类来模拟用户在设备上的操作。可以通过下面的方法得到实例:

    UiDevice mdevice = getUiDevice();

  摘要:

函数返回值函数体说明实例
booleanclick(int x, int y)    模拟用户在指定位置点击 mdevice.click(200, 300)  点击屏幕的200,300坐标处
String getCurrentActivityName() 获得的是应用程序在桌面上显示的名字 例如,在qq首页得到的是“QQ”,在微信登录页得到的是“微信”,注意,这个得到的不是Activity的名字
String getCurrentPackageName() 获得当前显示的应用程序的包名 例如,在微信启动的时候,获得的是“com.tencent.mm”
int getDisplayHeight() 获得当前设备的屏幕分辨率的高 例如,我的手机1920*1080,得到的是 1920
int getDisplayWighth() 获得当前设备的屏幕分辨率的宽 例如,我的手机1920*1080,得到的是 1080
boolean isScreenOn() 判断手机当前是否灭屏 当手机灭屏的时候,得到是“false”,手机亮屏,得到的是“true”
void wakeUp() 点亮当前屏幕 调用后,相当于按下了电源键,如果手机设置了滑动锁屏,滑动锁屏还是在的,不会自动解开
boolean pressBack() 点击back键 
boolean pressHome() 点击home键 
boolean pressMenu() 点击menu键 
boolean pressKeyCode(int keyCode) 利用keycode值模拟一次按下事件 例如,需要按下数字1 数字1的keycode是 KEYCODE_NUMPAD_1,更多keycode可以在 http://developer.android.com/intl/zh-cn/reference/android/view/KeyEvent.html 进行查询
boolean swipe(int startX, int startY, int endX, int endY, int steps) 用指定的步长,从A点滑动B点 例如,需要从(10, 10)点用两步滑动到(100, 200)点,则需要mdevice.swipe(10, 10, 100, 200, 2)
boolean takeScreenshot(File storePath) 截取当前屏幕,保存到文件 例如,File files = new File("/sdcard/res.jpg"); mdevice.takeScreenshot(files); 即可将截图保存到sd卡中了。

 

 

UiSelector

  概述:

    按照一定的条件(例如控件的text值,资源id),定位界面上的元素。UiSelector对象的最终目的是去构造一个UiObject对象。

  摘要:

    1、根据text构造:

函数返回值函数体说明用法
UiSelectortext(String text)根据“控件text属性的内容”构造出UiSelector对象例如,一个控件text的值是“发现”,UiSelector s = new UiSelector().text("发现");
UiSelectortextContains(String text)根据“控件text属性包含的内容”构造出UiSelector对象同上例子:UiSelector s = new UiSelector().textContains("现");
UiSelectortextMatches(String regex) 根据“控件text属性正则表达式的内容”构造出UiSelector对象正则表达式语法参考网上资料即可。
UiSelectortextStartsWith(String text)根据“控件text属性开始的内容”构造出UiSelector对象同上例子:UiSelector s = new UiSelector().textStartsWith("发");

      比较常用,准确度也比较高,中文查找的时候,如果遇到 “UiOjbectNotFoundException” 的时候,记得把项目的编码格式改为utf-8。

 

    2、根据description构造:

UiSelectordescription(String desc)根据“控件content-desc属性的内容”构造出UiSelector对象
UiSelectordescriptionContains(String desc)包含**
UiSelectordescriptionMatches(String regex)正则
UiSelectordescriptionStartsWith(String desc)以**开始

 

      同text的用法基本一致,也是比较靠谱的一种方式。

 

    3、根据资源id:

UiSelectorresourceId(String id)根据资源id获取对象,例如:UiSelector s = new UiSelector().resourceId("com.tencent.mm:id/b8m")
UiSelectorresourceIdMatches(String regex)根据资源id的正则表达式获取对象

 

    4、根据类:

      UiSelector className(String  className):

        根据控件的类名来找到UiSelector对象。

          

        但是呢?因为一般Android布局的时候,同样的控件类名都是一样的。

        因此我在微信的登录界面调用: UiSelector s = new UiSelector().className("android.widget.TextView") 这句话,它得到的就是我左上开始算第一个class名称为“android.widget.TextView”的控件。

       

      UiSelector instance (int instance):

        上面提到的假如我们想获取屏幕上电话号码的那个TextView使用这样方法,就可以使用instance:

            UiSelector s = new UiSelector().className("android.widget.TextView").instance(1);

    

      UiSelector index(int index):

        用法和上面的instance差不多,谷歌的原文说这个方法是unreliable的,推荐使用instance方法。

          

      UiSelector childSelector(UiSelector selector):

        有的时候假如子控件不好获得,而其父控件比较好获得的时候,我们通常采用这样的方式,例如下面:

        

           我们目前选中的是LinearLayout,这个Android中的一种布局,它的里面嵌套了两个控件,一个是ImageView,另一个是EditText。这们这里就通过LinearLayout这个控件找到它的子控件。

        很明显,父控件id已经给定。我们先得到父控件:UiSelector s_p = new UiSelector().resourceId("com.tencent.mm:id/axj");

        其次 UiSelector s_c= s_p.childSelector( new UiSelector().className("android.widget.EditText") );

        在它的父控件的childSelector方法中传入一个带有一定特征的UiSelector对象,即可得到子控件,这里 s_c 就是输入框的UiSelector对象。

      

      UiSelector fromParent(UiSelector selector):

        有的时候父控件也不好获得,而是同级的控件(同属一个parent)比较好获取,那么使用这样方法,还拿上面的举例:

        我们先得到EditText的UiSelector对象:UiSelector s1 = new UiSelector().resourceId("com.tencent.mm:id/axc");

        得到和它同样一个父控件的ImageView的UiSelector对象:UiSelector s2 = fromParent( new UiSelector().className("android.widget.ImageView") );

    

    5、根据特有属性:

UiSelectorchecked(boolean val)根据是否可check来构造出UiSelector对象
UiSelectorchickable(boolean val) 
UiSelectorenabled(boolean val) 
UiSelectorfocusable(boolean val) 
UiSelectorlongClickable(boolean val) 
UiSelectorscrollable(boolean val) 
UiSelectorselected(boolean val) 

      举个简单的例如,假如当前的界面,只有一个checkbox是勾选状态,你就可以这样得到:UiSelector s2 = new UiSelector().checked(true)

        

 

 

UiCollection  

  概述: 用的不多,直接参考文档   

  摘要:   http://android.toolib.net/tools/help/uiautomator/UiCollection.html

 

UiScrollable

  概述:  用的不多,直接参考文档   

  摘要:    http://www.cnblogs.com/by-dream/p/4921701.html

 

UiObject

  概述:可以理解为 直接操作界面ui元素的实例。

  摘要:

 

返回值

函数

void

ClearTextField()
在可以编辑处清除已经存在的文本内容

boolean

click()
执行单击

boolean

clickAndWaiForNewWindow(long timeout)
执行单击,等待窗口出现,等待时间参数中设置

boolean

clickAndWaiForNewWindow()
点击等待一个新窗口的出现,默认等待时间

boolean

clickBottomRight()
点击ui元素的右下方

boolean

clickTopLeft()
点击ui元素的左上方

boolean

exists()
检查ui 元素是否存在

Rect

getBounds()
返回ui元素的坐标值

UiObject

getChild(UiSelector selector)
通过参数中的对象,创建一个新的当前元素的子类ui元素的子类元素

int

getChildCount()
获取对象下子类ui元素数量

String

getContentDescription()
读取ui 元素的描述信息值

UiObject

getFromParent(UiSelector selector)
根据当前参数对象从父类元素获取子类信息

String

getPackageName()
读取Ui元素的包名称

final UiSelector

getSelector()
获取selector用作帮助调试

String

getText()
根据Ui元素获取文本值

Rect

getVisibleBounds()
返回ui元素的可视范围

boolean

isCheckable()
检查对象的checkable属性是否为true

boolean

isChecked()
检查对象的checked属性是否为true

boolean

isClickable()
检查对象的clickable属性是否为true

boolean

isEnabled()
检查对象的enabled属性是否为true

boolean

isFocusable()
检查对象的focusable属性是否为true

boolean

isFocused() 
检查对象的focused属性是否为true

boolean

isLongClickable() 
检查对象的longclickable属性是否为true

boolean

isScrollable() 
检查对象的scrollable属性是否为true

boolean

isSelected()
检查对象的selected属性是否为true

boolean

longClick()
长按对象

boolean

longClickBottomRight()
长按对象右下方

boolean

longClickTopLeft()
长按对象左上方

boolean

setText(String text)
ui对象中输入文字

boolean

swipeDown(int steps)
向下滑动steps个步长

boolean

swipeLeft(int steps)
往左滑动step个步长

boolean

swipeRight(int steps)
往右滑动steps个步长

boolean

swipeUp(int steps)
向上滑动steps个步长

boolean

waitForExists(long timeout)
等待对象出现

boolean

waitUntilGone(long timeout)
等待对象消失


这篇关于【Android测试】【第十二节】Uiautomator——API详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007007

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP