最近用到uiautomator和Xposed的东西比较多一些,这篇博客就先对uiautomator进行一些讲解吧,之后可能会跟新一些xposed的东西。毕竟现在一旦涉及到反汇编的东西,那很有可能就会涉及xposed和uiautomator。
好的,进入正题。什么事uiautomator,uiautomator是谷歌官方专门为我们全自动化测试提供的一门技术。他能做到完全在不改变程序任何代码之下做到对任意一个程序进行一些自动化测试流程的工作,如点击,长按,点击返回键,home键等等一切常用的用户简单操作。
那用uiautomator在实际中能够做什么?一般来说一些简单的重复性的任务就可以交给uiautomator去进行处理。比如发送一条短信,你可以通过uiautomator写好一条逻辑进行选择要发送的联系人,要发送的内容,最后选择发送。再比如在我实际工作中,使用uiautomator来对某视频apk进行一个固定的重复性动作:启动这个apk,在选项栏中随机选择一个item页面的视频播放内容,随机选择一个视频进行播放,当播放一定时间后关闭我的uiautomator脚本程序。再次运行我的uiautomator脚本,如此反复循环之。
不废话,现在就分几步对uiautomator的一个环境配置;使用的到类的api的一个讲述;如何将写好的uiautomator自动化测试类打包为脚本程序运行,共计三个步骤进行一个讲述。
一、uiautomator的环境配置
1.JDK以及对应的环境变量配置(这个无需多说,你做安卓还想不配置JDK)
2.eclispse(最后打包为脚本的时候必须使用eclispse进行。也是无奈啊)
3.android SDK以及配置()
4.ANT(主要用于build我们的脚本,生成jar包 PS:顺带给出一个网上下载ant的链接吧http://download.youkuaiyun.com/download/gooogeair/8994195)
ant的搭建主要分几步:1.下载ant安装文件并且解压安装;
2.新建系统环境变量ANT_HOME,参数值是你的ant安装目录;
3.在Path环境变量中添加ant安装目录的bin文件夹,比如我的就是C:\cod\apache-ant-1.9.6\bin
4.配置完以后,测试一下,在命令行下输入ant -version,如果显示你所安装的ant版本信息,证明环境变量配置成功
作为androuid开发人员,各种基本环境的配置相信不用多说。
二、使用的到类的api的一个讲述
在使用uiautomator之前需要进行导入一个uiautomator.jar的包。正常导入包的逻辑导入就行。PS:同样附上一个下载jar的地址http://download.youkuaiyun.com/download/qq_30840197/9614039。 主要使用到的类只有几个,如下UiDevice,UiSelector,UiObject,UiScrollable,Uiobjection。其实基本上使用到的就是前三个类的一个api,后面两个类基本不怎么使用。
1.UiDevice
概述:
UiDevice用与访问关设备状态的信息,也可以使用这个类来模拟用户在设备上的操作。可以通过下面的方法得到实例:
UiDevice mdevice = getUiDevice();或者是
摘要:
函数返回值 | 函数体 | 说明 | 实例 |
boolean | click(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卡中 |
2.UiSelector
概述:
按照一定的条件(例如控件的text值,资源id,描述信息,包名,类名等等),定位界面上的元素。UiSelector对象的最终目的是去构造一个UiObject对象。
摘要:
1、根据text构造:
函数返回值 | 函数体 | 说明 | 用法 |
UiSelector | text(String text) | 根据“控件text属性的内容”构造出UiSelector对象 | 例如,一个控件text的值是“发现”,UiSelector s = new UiSelector().text("发现"); |
UiSelector | textContains(String text) | 根据“控件text属性包含的内容”构造出UiSelector对象 | 同上例子:UiSelector s = new UiSelector().textContains("现"); |
UiSelector | textMatches(String regex) | 根据“控件text属性正则表达式的内容”构造出UiSelector对象 | 正则表达式语法参考网上资料即可。 |
UiSelector | textStartsWith(String text) | 根据“控件text属性开始的内容”构造出UiSelector对象 | 同上例子:UiSelector s = new UiSelector().textStartsWith("发"); |
比较常用,准确度也比较高,中文查找的时候,如果遇到 “UiOjbectNotFoundException” 的时候,记得把项目的编码格式改为utf-8。
2、根据description构造:
UiSelector | description(String desc) | 根据“控件content-desc属性的内容”构造出UiSelector对象 |
UiSelector | descriptionContains(String desc) | 包含** |
UiSelector | descriptionMatches(String regex) | 正则 |
UiSelector | descriptionStartsWith(String desc) | 以**开始 |
同text的用法基本一致,也是比较靠谱的一种方式。
3、根据资源id:
UiSelector | resourceId(String id) | 根据资源id获取对象,例如:UiSelector s = new UiSelector().resourceId("com.tencent.mm:id/b8m") |
UiSelector | resourceIdMatches(String regex) | 根据资源id的正则表达式获取对象 |
4、根据类:
UiSelector className(String className):
根据控件的类名来找到UiSelector对象。
5、根据特有属性:
UiSelector | checked(boolean val) | 根据是否可check来构造出UiSelector对象 |
UiSelector | chickable(boolean val) | |
UiSelector | enabled(boolean val) | |
UiSelector | focusable(boolean val) | |
UiSelector | longClickable(boolean val) | |
UiSelector | scrollable(boolean val) | |
UiSelector | selected(boolean val) |
UiObject
概述:可以理解为 直接操作界面ui元素的实例。
摘要:
返回值 | 函数 |
void | ClearTextField() |
boolean | click() |
boolean | clickAndWaiForNewWindow(long timeout) |
boolean | clickAndWaiForNewWindow() |
boolean | clickBottomRight() |
boolean | clickTopLeft() |
boolean | exists() |
Rect | getBounds() |
UiObject | getChild(UiSelector selector) |
int | getChildCount() |
String | getContentDescription() |
UiObject | getFromParent(UiSelector selector) |
String | getPackageName() |
final UiSelector | getSelector() |
String | getText() |
Rect | getVisibleBounds() |
boolean | isCheckable() |
boolean | isChecked() |
boolean | isClickable() |
boolean | isEnabled() |
boolean | |
boolean | isFocused() |
boolean | isLongClickable() |
boolean | isScrollable() |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean | |
boolean |
UiCollection
概述: 用的不多,直接参考文档
摘要: http://android.toolib.NET/tools/help/uiautomator/UiCollection.html
UiScrollable
概述: 用的不多,直接参考文档
摘要: http://android.toolib.Net/tools/help/uiautomator/UiScrollable.html
一个基本的api大致就是以上描述的功能,通过以上api功能基本就能完成大部分自动化的要求。PS:这里重点说一下关于长按的问题。当你调用longClick()方法的时候很有可能触发不到你andoid设备的长按功能。那该怎么解决喃,其实很简单,搜索一下关键词 “uiautomator 长按”会出现许多的解决方案,本人当初也是被坑许久。这里就简单例句一种我实际应用中使用的方法
//长按 配置IP地址(长按坐标点 非固定动态获取)
UiObject ui_pptv = new UiObject(new UiSelector().resourceId("android:id/summary").text("PPTP VPN"));//获取到控件
try {
Rect bounds = ui_pptv.getBounds();//找出控件的中心点坐标位置
int x = bounds.centerX();
int y = bounds.centerY();
Log.e("auiautoa", "需要长按的坐标点" + x + "__" + y);
uiDevice.swipe(x, y, x, y, 65);
//通过调用swip()方法,起始点和结束点坐标传入一样的值。第五个参数传入大值越大长按的时间就会越长(60左右就足够了)
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
三、如何将写好的uiautomator自动化测试类打包为脚本程序运行
篇幅有限,关于如何打包为jar包部分肯直接参考https://www.testwo.com/blog/7057。其中讲解的已经非常的详细,相信我用我在赘述。
只是提一句,如果你创建了java项目后按照步骤任然无法打包成功,可以尝试在你java项目的第一层目录下面创建爱你一个libs目录然后再尝试进行打包。
https://www.testwo.com/blog/7057
最后,相信到了这,基本上你应该对uiautomator有的了解,其实uiautomator并不是很难,只需要进行实践就能够很好的掌握。