uiautomator使用

  最近用到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.csdn.net/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.csdn.net/download/qq_30840197/9614039。  主要使用到的类只有几个,如下UiDevice,UiSelector,UiObject,UiScrollable,Uiobjection。其实基本上使用到的就是前三个类的一个api,后面两个类基本不怎么使用。

 

1.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卡中

 

2.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对象。

    5、根据特有属性:

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

 

 

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

 

 

 

 

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

手动dump 页面信息 来分析的方法

最后,相信到了这,基本上你应该对uiautomator有的了解,其实uiautomator并不是很难,只需要进行实践就能够很好的掌握。

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值