快学UiAutomator UiDevice API 详解
一、按键使用
返回值 |
方法名 |
说明 |
boolean | pressBack() | 模拟短按返回back键 |
boolean | pressDPadCenter() | 模拟按轨迹球中点按键 |
boolean | pressSPadDown() | 模拟轨迹球向下按键 |
boolean | pressDPadLeft() | 模拟轨迹球向左按键 |
boolean |
pressDPadRight() | 模拟轨迹球向右按键 |
boolean | pressDPadUp() | 模拟轨迹球向上按键 |
boolean | pressDelete() | 模拟短按删除delete按键 |
boolean | pressEnter() | 模拟短按回车enter键 |
boolean | pressHome() | 模拟短按home键 |
boolean | pressKeyCode(int keyCode,int metaState) | 模拟短按键盘代码keycode |
boolean | pressKetCode(int keyCode) | 模拟短按键盘代码keycode |
boolean | pressMenu() | 模拟短按menu键 |
boolean | pressRecentApps() | 模拟短按最近使用程序 |
boolean | pressSearch() | 模拟短按搜索键 |
按键主要为模拟设备的物理按键,如home键,menu键,back键,音量键等
例子:
按home键:UiDevice.getInstance().pressHome(); 按menu键:UiDevice.getInstance().pressMenu(); 按back键:UiDevice.getInstance().pressBack();
keycode使用
meta_key未被激活 | 0 |
shift或caps_lock被激活时 | 1 |
alt被激活 | 2 |
alt,shift或caps_lock同时被激活时 | 3 |
对于 pressKeyCode(int keyCode) 模拟短按键盘代码。键盘代码为何物呢,其实我们键盘上的每个按键都对应一个整数的代码,比如说delete键为67。 具体键盘代码请到谷歌官网查询,附上网址,需要查什么按键只需搜索相应的英文就可以了。 http://developer.android.com/reference/android/view/KeyEvent.html 例子: 如按字母A,打开上面网页Ctrl+f 打开搜索 KEYCODE_A 查到代码为29 int KEYCODE_A=29; UiDevice.getInstance().pressKeyCode(KEYCODE_A);
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);//输入小写a UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);//输入大写a
二、获取坐标与坐标点击
返回值 |
方法名 |
说明 |
boolean | click(int x,int y) | 使用坐标点击屏幕(在任意坐标指定的坐标执行一个点击) |
int |
getDisplayHeight() | 获取屏幕高度 |
point |
grtDisplaySizeDp() | 获取显示尺寸返回显示大小(设备独立像素) |
int |
getDisplayWidth() | 获得屏幕宽度 |
实例:
int w=UiDevice.getInstance().getDisplayWidth();//获取屏幕宽度 int h=UiDevice.getInstance().getDisplayHeight();//获取屏幕高度 UiDevice.getInstance().click(h/2, w/2);//点击屏幕中心点 UiDevice.getInstance().click(300, 300);//点击坐标点(300,300)
或 getUiDevice().click(300, 300); 推荐使用上面的UiDevice.getInstance()进行书写,如果使用下面的书写,在同一个类中没问题,如果要在其他类中的方法使用了getUiDevice,调用到本类中不会有语法错误,但是执行的时候会出错。以下也是如此,不再写getUiDevice。
三、旋转
返回值 | 方法名 | 描述 |
void | setOrientationLeft() | 通过禁用传感器,然后模拟设备向左旋转并且固定位置 |
void | setOrientationNatural() | 通过禁用传感器,然后模拟设备转到其自然默认的方向,并且固定位置 |
void | setOrientationRight() | 通过禁用传感器,然后模拟设备向又旋转并且固定位置 |
void | unfreezeRotation() | 重新启用传感器和允许物理旋转 |
boolean | isNaturalOrientation() | 检测设置是否处于默认旋转状态 |
int | getDisplayRotation() | 返回当前的显示旋转,0度,90度,180度,270度值分别为:0,1,2,3 |
void | freezeRotation() | 禁用传感器和冻结装置物理旋转在其当前旋转状态 |
实例1:
public void testOrientation() throws RemoteException{ //1.模拟设备向左向右旋转 UiDevice.getInstance().setOrientationLeft(); //设备向左旋转
UiDevice.getInstance().setOrientationRight(); //设备向右旋转 //2.如果设备处于默认旋转状态,就向左旋转 if (UiDevice.getInstance().isNaturalOrientation()){ UiDevice.getInstance().setOrientationLeft(); } //3.变量a获取当前新鲜事旋转度数,然后进行相应if判断 int a=UiDevice.getInstance().getDisplayRotation(); if (a==Surface.ROTATION_0){ UiDevice.getInstance().setOrientationLeft(); } if (a==Surface.ROTATION_90){ UiDevice.getInstance().setOrientationLeft(); } if (a==Surface.ROTATION_180){ UiDevice.getInstance().setOrientationLeft(); } if (a==Surface.ROTATION_270){ UiDevice.getInstance().setOrientationLeft(); }
}
实例2:
UiDevice.getInstance().freezeRotation(); 当前手机状态为竖屏,锁定当前手机为竖屏,不让手机跟随着手机物理旋转而旋转。
四、锁屏和唤屏
返回值 |
方法名 |
描述 |
void | wakeUp() | 模拟按电源键,如果屏幕是唤醒的没有任何作用 |
void | sleep() | 模拟按电源键,如果屏幕已经是关闭的则没有任何作用 |
boolean | isScreenOn() | 检查屏幕是否亮屏 |
实例:
public void testScreenOn() throws RemoteException{
//检查屏幕是否唤醒,如果不是则唤醒
//如果屏幕是亮屏,则关闭屏幕 if (UiDevice.getInstance().isScreenOn()){ UiDevice.getInstance().sleep(); //灭屏操作 } //如果屏幕是灭屏状态则转为亮屏状态 if (!UiDevice.getInstance().isScreenOn()){ UiDevice.getInstance().wakeUp(); //亮屏操作 } }
五、等待对象
返回值 |
方法名 |
描述 |
void | waitForIdle(long timeuot) | 自定义超时等待当前应用处于空闲状态 |
void | waitForIdle() | 等待当前应用处于空闲状态,默认等待10s |
boolean | waitForWindowUpdate(Steing packageName,long timeout) | 等待窗口内容更新时间的发生窗口更新事 |
实例:
public void testIdle(){
//通过坐标点击界面上的,一个应用,点开应用后点击界面上的“搜索”按钮 UiDevice.getInstance().click(580, 654); //等待500000,如果界面还没有打开则,超时异常
UiDevice.getInstance().waitForIdle(500000); UiObject searchObject=new UiObject(new UiSelector().text("搜索")); searchObject.click(); //超时等待等待时间为0到500000,如果在这个时间内,界面载入完成则算成功。 //[0,417][64,480]这个是浏览器坐标 UiDevice.getInstance().click(32, (480-417)/2+417);//点击浏览器 UiDevice.getInstance().waitForIdle(20000);//超时等待20s }
等待当前应用处于空闲状态,如打开应用程序,打开载入的动作一直在进行,当前完全载入程序,处于应用主界面,而没有去操作他,此时的状态就是空闲状态。
窗口更新事件,如点击一个按钮这个按钮会跳转到其他的activity中,则点击这个按钮就发生了窗口更新事件。
六:截图
返回值 |
方法名 |
描述 |
boolean | takeScreenshot(FilestorePath) | 把当前窗口截图并将其存储为png默认的1.0f的规格(原尺寸)和90%质量,参数为file类的文件路径 |
boolean | takeScreenshot(File storePath,float scale,int quality) | 把当前窗口截图为png格式图片,可以自 |
参数说明:
参数 | 说明 |
storePath | 存储路径,必须为png格式 |
Scale | 缩放比例,1.0为原图 |
Quality | 图片压缩质量,范围为0-100 |
返回 | 说明 |
True | 截图成功 |
False | 截图失败 |
实例:
//把当前窗口截图并将其存储为png默认的1.0f的规格(原尺寸)和90%质量,参数为file类的文件路径为"sdcard/test1.png" public void testScreen(){ UiDevice.getInstance().takeScreenshot(new File("sdcard/test1.png")); } //参数为File类,注意参数的使用形式,请参照以下例子
//截图保存到sd卡更目录中,图片文件名为test1 UiDevice.getInstance().takeScreenshot(new File("/sdcard/test1.png"));
七:拖拽与滑动
返回值 | 方法名 | 说明 |
boolean |
swipe(Point[] segments, int segmentSteps) |
在点阵列中滑动,5ms一步 |
boolean |
swipe(int startX, int startY, int endX, int endY, int steps) |
通过坐标滑动屏幕 |
boolean |
drag(int startX, int startY, int endX, int endY, int steps) |
从一个坐标到另一个坐标进行拖拽 |
拖拽:将一个组件从一个坐标移动到另一个坐标处
滑动:从一个坐标点移动到另一个坐标点
步长:从一点滑动到另一点使用的时间(1步长=5毫秒,1秒=1000毫秒);步长越长,即两点之间移动越慢
参数说明:
参数 | 说明 |
segments |
Poing[]点阵列,可以多个点 |
segmentSteps | 滑动步长 |
StartX-StartY | 具体坐标值 |
返回 | 说明 |
True | 滑动成功 |
False | 滑动失败 |
实例:
//1.拖动对象从一个坐标移动到另一个坐标 public void testDrag(){ //[64,417][128,480] 找到坐标位置先 int startX, startY, endX, endY, steps; startX=(128-64)/2+64; startY=(480-417)/2+417; endX=startX=(128-64)/2+64; endY=startY-200; steps=30; UiDevice.getInstance().drag(startX, startY, endX, endY, steps); }
//2.通过坐标滑动屏幕 public void testSwipe(){ int h=UiDevice.getInstance().getDisplayHeight(); //获取屏幕高度 int w=UiDevice.getInstance().getDisplayWidth(); //获取屏幕宽度 UiDevice.getInstance().swipe(w-10, h/2, 10, h/2, 30); //从左往右进行滑动 }
//3.在点阵列中滑动(例子中为画了一个不规则矩形) public void testSwipe2(){ //227,318 746,335 784,814 221,840 矩形的四个定点,比如随意画手势,滚动,滑动等都会用到这个 Point p1=new Point(); Point p2=new Point(); Point p3=new Point(); Point p4=new Point(); p1.x=227;p1.y=318; p2.x=746;p1.y=335; p3.x=784;p1.y=814; p4.x=221;p1.y=840; Point[] pp={p1,p2,p3,p4}; UiDevice.getInstance().swipe(pp, 50); }
八:获取包名&开启通知栏&快速设置&获取布局文件
返回值 | 方法名 | 描述 |
void | getCurrentPackageName() | 获取当前界面的包名 |
void | dumpWindowHierarchy(String fileName) | 获取当前界面的布局文件,保存在/data.local/tmp/目录下 |
boolean | openNotification() | 打开通知栏 |
boolean | openQuickSettings() | 打开快速设置 |
void |
setCompressedLayoutHeirarchy(boolean compressed) |
启用或禁用布局层次压缩。 |
实例:
//1.获取并输出包名 public void testGet(){ String packageName=UiDevice.getInstance().getCurrentPackageName(); //获取包名 System.out.print("浏览器的包名为:"+packageName); //在控制台输出包名 UiDevice.getInstance().openNotification(); //打开通知栏 UiDevice.getInstance().openQuickSettings(); //打开快速设置栏 UiDevice.getInstance().dumpWindowHierarchy("n.xml");//获取当前界面的布局文件并命名为n //对于该文件可以使用命令"adb pull /data/local/tmp/n.xml F:\"命令将该文件导出来 }
九:监听器
返回值 | 方法名 | 说明 |
void |
registerWatcher(String name, UiWatcher watcher) |
注册一个监听器,当前运行指定步骤被打断的时候,处理中断异常 |
void |
removeWatcher(String name) |
移除之前注册的监听器 |
void | 重置一个监听器 | |
void | 强制运行所有的监听器 | |
boolean | hasAnyWatcherTriggered() | 检查是否有监听器触发过 |
boolean |
hasWatcherTriggered(String watcherName) |
检查某个特定的监听器是否触发过 |
实例:
//在循环打开百度关闭百度应用过程中来电话,使用监听器挂断电话,让脚本继续执行
//注册监听器,处理来电
UiDevice.getInstance().registerWatcher("hangUpThePhone", new UiWatcher() {
@Override
public boolean checkForCondition() {
// TODO Auto-generated method stub
UiObject text=new UiObject(new UiSelector().text("来电"));
UiObject call=new UiObject(new UiSelector().className(""));
if(text.exists()){
try {
call.swipeRight(10);
} catch (UiObjectNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}else{
return false;
}
}
});
//测试脚本
UiObject baiduObject=new UiObject(new UiSelector().text("百度"));
for(int i=0;i<100;i++){
baiduObject.clickAndWaitForNewWindow();
sleep(2000);
UiDevice.getInstance().pressHome();
sleep(1000);
}
监听器用于处理中断,当脚本其他未知情况打断执行的时候,如果有监听器则会跳转到监听器中执行,我们可以使用监听器做一些特殊的测试如,来电,来闹钟日常等测试。还可以处理异常中断,如我最先设计的测试步骤,中途突然10086来了封短信,弹窗短信,直接打断我的脚本步骤,如果我没有做预先的处理则,这条用例最终就执行失败。另外监听器需要写在脚本的开头。
快学UiAutomator UiDevice API 详解的更多相关文章
- hibernate学习(2)——api详解对象
1 Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户 ...
- [转]百度地图API详解之地图坐标系统
博客原文地址:http://www.jiazhengblog.com/blog/2011/07/02/289/ 我们都知道地球是圆的,电脑显示器是平的,要想让位于球面的形状显示在平面的显示器上就必然需 ...
- 大数据学习笔记——Spark工作机制以及API详解
Spark工作机制以及API详解 本篇文章将会承接上篇关于如何部署Spark分布式集群的博客,会先对RDD编程中常见的API进行一个整理,接着再结合源代码以及注释详细地解读spark的作业提交流程,调 ...
- Java 8 Stream API详解--转
原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...
- jqGrid APi 详解
jqGrid APi 详解 jqGrid皮肤 从3.5版本开始,jqGrid完全支持jquery UI的theme.我们可以从http://jqueryui.com/themeroller/下载我们所 ...
- 网络编程socket基本API详解(转)
网络编程socket基本API详解 socket socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信. socket ...
- 转】Mahout推荐算法API详解
原博文出自于: http://blog.fens.me/mahout-recommendation-api/ 感谢! Posted: Oct 21, 2013 Tags: itemCFknnMahou ...
- dom4j api 详解--XPath 节点详解
dom4j api 详解 http://871421448.iteye.com/blog/1546955 XPath 节点 http://www.w3school.com.cn/xpath/xpath ...
- 百度地图API详解之事件机制,function“闭包”解决for循环和监听器冲突的问题:
原文:百度地图API详解之事件机制,function"闭包"解决for循环和监听器冲突的问题: 百度地图API详解之事件机制 2011年07月26日 星期二 下午 04:06 和D ...
随机推荐
- 51nod 1013【快速幂+逆元】
等比式子: Sn=(a1-an*q)/(1-q) n很大,搞一发快速幂,除法不适用于取膜,逆元一下(利用费马小定理) 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p).刚好 ...
- 稳定UI运行结果-自动化测试失败重试和截图
运行自动化测试的时候,有时会因为网络不稳定,测试环境或者第三方环境正在重启而造成用例运行结果不稳定,时而能跑过时而跑不过.这些难以重现的环境因素造成的用例失败会让测试人员很困扰,排查即耗费时间也没有太 ...
- 最简大数据Spark-2.1.0
0.0 前言 本文主要基于最新的Spark 2.1.0版本.阅读本文可以对Spark 2.1.0的学习过程,运行流程,关键组件,原理有所了解.文章有点长,你也可以直接阅读感兴趣的部分,但是还是建议全面 ...
- iOS 7:漫谈#define 宏定义(转)
iOS :漫谈#define 宏定义 #define宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步 ...
- docker+jenkins实现持续集成
持续集成的概念我就不多说了,网上一大堆,今日主要讲讲怎么通过docker 和jenkins实现项目的持续集成.看着简单,网上完整教程很少,本人摸索很久才搞定!!! 一.首先安装docker.安装过程可 ...
- E. XOR and Favorite Number (莫队板子题)
题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...
- 虚拟机无法分配内存 virtual memory exhausted: Cannot allocate memory
1.内存交换空间(swap)的构建 安装Linux时一定需要的两个分区:根目录和swap(内存交换空间). swap的功能:在应付物理内存不足的情况下所造成的内存扩展记录的功能. 物理内存不足的时候, ...
- C# 面向对象之封装
封装是指将类的内部数据隐藏起来不让对象实例直接对其操作,C#中提供了属性机制来对类内部的状态进行操作. 在C#中封装可以通过public.private.protected和internal等关键字来 ...
- vue初级学习--使用 vue-resource 请求数据
一.导语 我发现好像我最近几次写文,都是在7号,很恰巧啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...
- 物体检测丨Faster R-CNN详解
这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...