UIautomator API 列举

本文详细介绍了uiautomator的基本概念及其在Android自动化测试中的应用。涵盖了UiDevice、UiSelector和UiObject等核心组件的功能及使用方法,并提供了丰富的示例代码。

首先提供uiautomator的官方网页:

http://developer.android.com/tools/help/uiautomator/index.html

uiautomator 测试案例(Test case)需要继承至UiAutomatorTestCase 类。而UiAutomatorTestCase 类继承至junit.framework.TestCase类,所以可以用JUnit的Assert类来比较测试结果。

uiautomator API

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

UiDevice

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

摘要:

函数返回值函数体说明实例
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

代表一个搜索UI控件的条件。如果发现多个满足条件的控件则会返回第一个控件。返回的结果为UiObject对象。在构造UiSelector的时候可以组合使用多个属性来定位具体的控件。如果没有找到控件则会抛出 UiAutomatorObjectNotFoundException 异常。还可以使用childSelector()函数来嵌套UiSelector 对象。

例如,下面的代码演示了如何在当前界面中查找第一个ListView中的带有文本属性为Apps的子控件。

Java

1

2

3

UiObject appItem = new UiObject(new UiSelector().className("android.widget.ListView").instance(1).childSelector(new UiSelector().text("Apps")));

 

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

Java

1

2

3

4

UiObject cancelButton = new UiObject(new UiSelector().text("Cancel")

.className("android.widget.Button"));

UiObject okButton = new UiObject(new UiSelector().text("OK")

.className("android.widget.Button"));

 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)

        

UiObject

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

Java

1

2

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

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

查找到的UiObject实例可以在其他测试代码中重用。需要注意的是:每次使用UiObject做操作的时候uiautomator 都会在当前屏幕重新查找该控件

如下代码uiautomator 工具在当前界面查找文本内容为“OK”的控件。如果存在并且可用则模拟用户点击该控件。

Java

1

2

3

4

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

{

okButton.click();

}

 摘要:

返回值

函数

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)
等待对象消失

 

UiCollection

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

Java

1

2

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

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

Java

1

2

int count = videos.getChildCount(new UiSelector()

.className("android.widget.LinearLayout"));

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

Java

1

2

3

UiObject video = videos.getChildByText(new UiSelector()

.className("android.widget.LinearLayout"), "Cute Baby Laughing");

video.click();

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

Java

1

2

3

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

if(!checkBox.isSelected()) checkbox.click();

 

UiScrollable

代表可滚动的控件。可以用UiScrollable来模拟水平或者垂直滚动的UI元素。如果需要操作的元素在屏幕外需要滚动屏幕才能看到的情况下需要使用UiScrollable。

例如,下面的代码显示了如何模拟滚动到“Settings ”菜单并点击“About tablet”菜单的操作。

Java

1

2

3

4

5

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

UiObject about = settingsItem.getChildByText(new UiSelector().className("android.widget.LinearLayout"), "About tablet");

about.click()

其他API参考uiautomator api文档。

 

### 使用 Python 中的 uiautomator 框架进行 Android UI 自动化测试 #### 安装基础环境 在使用 `uiautomator` 或其升级版 `uiautomator2` 进行 Android UI 自动化测试前,需完成必要的环境配置。这包括安装 Python 和相关依赖项。具体步骤如下: 通过命令行工具执行以下指令来初始化 `uiautomator2` 环境: ```bash pip install uiautomator2 python -m uiautomator2 init ``` 上述命令会自动下载并安装所需的驱动程序以及服务端组件[^2]。 --- #### 初始化设备连接 为了与目标 Android 设备建立通信,可以通过 USB 或 Wi-Fi 方式连接设备,并确保 ADB 已正确定位到该设备。以下是基本代码示例: ```python import uiautomator2 as u2 # 通过设备序列号连接(可选) d = u2.connect('your_device_serial') # 若仅有一台设备直连,则无需指定参数 print(d.info) # 打印设备基本信息 ``` 一旦成功连接至目标设备,便可调用 API 来控制屏幕上的交互行为[^1]。 --- #### 常见的操作方法 `uiautomator2` 提供了一系列丰富的接口支持多种用户操作仿真功能,比如点击按钮、输入文字或者滚动页面等动作。下面列举几个常用的函数及其用途说明: - **点击元素** ```python d(text="Submit").click() # 根据文本找到控件并触发单击事件 ``` - **设置文本框内容** ```python d(resourceId="com.example:id/edit_text").set_text("Hello World") # 向特定ID对应的编辑区域赋值字符串数据 ``` - **滑屏手势** ```python d.swipe_ext("up", scale=0.8) # 页面向上快速拖拽一段距离;scale表示比例系数,默认取值范围为[0,1] ``` 这些简单的例子展示了如何利用属性选择器精确定位界面上的目标对象再施加相应的行为改变[^3]。 --- #### 封装 BasePage 类提升维护效率 考虑到项目长期发展需求,在实际开发过程中推荐创建一个通用的基础页面类(BasePage),这样做的好处在于当底层技术栈发生变化时只需修改一处逻辑就能适配新的解决方案而不需要逐一手动调整各个模块内部实现细节[^5]。 例如定义这样一个基底类别可能包含但不限于以下几个方面的方法重写: - 查找某个视图节点是否存在; - 长按某位置一段时间后再释放手指抬起的动作组合等等... --- #### 学习资源建议 对于初学者来说如果缺乏足够的计算机科学背景知识那么可以从一些在线平台获取入门级指导材料逐步深入理解掌握核心技术要点[^4]: - 访问官方文档阅读详细的API手册描述。 - 参考社区贡献者撰写的博文案例分析解决常见疑难杂症技巧分享等内容。 ---
### 使用 uiautomator2 进行 Android 自动化测试的学习教程 #### 安装依赖包 为了开始使用 `uiautomator2`,首先需要安装 Python 的开发环境以及必要的库文件。推荐通过清华镜像源加速下载速度: ```bash pip install uiautomator2 -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` 此命令会安装最新版本的 `uiautomator2` 库[^3]。 #### 初始化设备连接 确保手机已启用开发者选项并开启USB调试模式。接着可以通过如下方式初始化与目标设备之间的通信: ```python import uiautomator2 as u2 # 假设只有一个设备连接,则可以直接调用 connect 方法而无需指定参数 device = u2.connect() print(device.device_info) ``` 上述代码片段展示了如何建立与安卓设备间的稳定链接,并获取其基本信息[^4]。 #### 执行基本操作指令 一旦成功建立了与设备的连接,就可以执行各种交互动作了。比如点击特定的应用程序图标启动它: ```python # 替换 '微信' 为你想要打开的应用名称 device(text="微信").click() ``` 这段脚本能够模拟用户触摸屏幕上的文字标签来触发对应的操作。 #### 获取界面控件信息 除了简单的触屏事件外,还可以利用 `uiautomator2` 提供的功能遍历当前页面上所有的 UI 组件,从而实现更复杂的逻辑控制: ```python for item in device.xpath.iter(): print(item.attrib['text']) ``` 这里列举了一个简单例子用于迭代整个视图树结构中的每一个节点,并输出它们的文字属性值[^1]。 #### 实战练习建议 对于初学者来说,可以从以下几个方面入手加深理解: - 掌握基础 API 调用方法; - 尝试编写小型项目如自动登录社交媒体账号; - 阅读官方文档了解高级特性和最佳实践案例;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值