UiAutomator笔记之UiDevice API(二)
一、UiDevice类简介
1、UiDevice代表设备状态。如屏幕的大小、旋转方向、按压各种按键等。
2、UiDevice为单例模式,可有2种方式获取其实例。
(1)UiDevice.getInstance();--->推荐
(2)getUiDevice.pressHome();---->在类A中封装方法,方法被类B调用的时候会出现空指针异常
3、主要功能
(1)获取设备信息:屏幕分辨率、旋转状态、亮灭屏......
(2)操作:按键、坐标操作、滑动、拖拽、截图......
(3)监听器功能
二、按键与KEYCODE使用
1、点击按键 相关API
UiDevice实例调用以下方法即可实现点击按键操作。
返回值 | 方法名 | 描述 |
boolean | pressBack() | 模拟短按返回back键 |
boolean | pressDPadCenter() | 模拟按轨迹球中点按键 |
boolean | pressDPadDown() | 模拟轨迹球向下按键 |
boolean | pressDPadLeft() | 模拟轨迹球向左按键 |
boolean | pressDPadRight() | 模拟轨迹球向右按键 |
boolean | pressDPadUp() | 模拟轨迹球向上按键 |
boolean | pressDelete() | 模拟短按删除delete按键 |
boolean | pressEnter() | 模拟短按回车键 |
boolean | pressHome() | 模拟短按HOME键 |
boolean | pressKeyCode(int keyCode, int metaState) | 模拟短按键盘代码keycode |
boolean | pressKeyCode(int keyCode) | 模拟短按键盘代码keycode |
boolean | pressMenu() | 模拟短按menu键 |
boolean | pressRecentApps() | 模拟短按最近使用程序 |
boolean | pressSearch() | 模拟短按搜索键 |
2、KEYCODE 键盘映射码
(1)KeyEvent:按键事件,每个键盘映射码都保存在keyEvent的常量中。
(2)META Key
<1>辅助功能键: ALT、SHIFT、CAPS_LOCK
<2>辅助功能键的状态
**状态 | metaState | |
base | META_key未被** | 0 |
caps | SHIFT或CAPS_LOCK被**时 | 1 |
fn | ALT被** | 2 |
caps_fn | ALT,SHIFT或CAPS_LOCK同时被**时 | 3 |
<3>示例
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);//点击输入小写字母a
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);//点击输入大写字母A
三、获取坐标与坐标点击
1、坐标相关知识
(1)手机屏幕坐标:从左上角(0,0)开始到右下角(X,Y)
(2)dp:设备独立像素,例如,320像素显示到640像素上要拉伸一倍
(3)Point:代表一个点(x,y)
2、坐标相关API
UiDevice实例调用以下方法即可实现获取坐标和点击操作。
返回值 | 方法名 | 描述 |
boolean | click(int x, int y) | 使用坐标点击屏幕 |
int | getDisplayHeight() | 获取屏幕高度 |
Point | getDisplaySizeDp() | 获取显示尺寸返回显示大小(设备独立像素);屏幕旋转返回的显示大小调整 |
int | getDisplayWidth() |
获得屏幕宽度 |
3、Uiautomator Viewer
(1)功能:获取屏幕快照,并通过快照获取到控件的属性。
(2)启用方式
方式一、启动路径:adt/sdk/tools/UiautomatorViewer
方式二、Eclipse/DDMS/Devices/UiautomatorViewer
(3)屏幕快照参数之控件坐标
通过UiautomatorViewer获取屏幕快照,选中目标控件,通过Node Detail / bounds[左上角顶点坐标][右下角顶点坐标] 可获取到控件的位置。
4、示例
(1)
UiDevice.getInstance().click(399,355);//点击[399,355]坐标点
(2)
int h = UiDevice.getInstance().getDisplayHeight();
int w = UiDevice.getInstance().getDisplayWidth();
UiDevice.getInstance().click(w/2,h/2); //点击屏幕的中心点
(3)
UiObject object = new UiObject(new UiSelector.resoutceId("com.andr....控件Id"));//根据ID获取控件
Rect r = object.getBounds();//获取控件对应的矩形区域相关属性
r.left; //矩形左上角顶点X坐标
r.top; //矩形左上角顶点Y坐标
r.right; //矩形右下角顶点X坐标
r.bottom; //矩形右下角顶点Y坐标
r.centerX(); //矩形的中心点X坐标
r.centerY(); //矩形的中心点Y坐标
四、拖拽与滑动
1、相关概念
(1)拖拽:将一个组件从一个坐标移动到另一个坐标处。
(2)滑动:手指从一个坐标点移动到另一个坐标点。
(3)步长:从一点滑动到另一点使用的时间,步长越短说明移动越快。
2、拖拽与滑动相关API
返回值 | 方法名 | 描述 |
boolean | drag(int startX, int startY, int endX, int endY, int steps) | 拖动对象从一个坐标拖动到另一个坐标,step表示拖拽过程使用的时间(ms) |
boolean | swipe(Point[] segments, int segmentSteps) | 在点阵列中滑动,5ms一步 |
boolean | swipe(int startX, int startY, int endX, int endY, int steps) | 通过坐标滑动屏幕 |
3、示例:按照一个矩形的路径滑动
Point p1 = new Point();
Point p2 = new Point();
Point p3 = new Point();
Point p4 = new Point();
p1.x =277;
p1.y =318;
...... //设置四个顶点的横纵坐标
Point[] pp = {p1,p2,p3,p4};
UiDevice.getInstance().swipe(pp,50); //每50毫秒走一步(从一个点滑动到下一个点)
五、旋转屏幕
1 、旋转屏幕相关知识
(1)旋转方向:4个方向,分别为 0度,90度,180度,270度
(2)重力感应器
(3)固定位置与物理旋转
固定位置:屏幕的方向固定在0、90、180、270度;
物理旋转:与重力感应器连接,关闭了物理旋转就是关闭了重力感应器。
2、屏幕旋转相关API
返回值 | 方法名 | 描述 |
void | setOrientationLeft() | 通过禁用传感器,然后模拟设备向左转,并且固定位置 |
void | setOrientationNatural() | 通过禁用传感器,然后模拟设备转到其自然默认的方向,并且固定位置 |
void | setOrientationRight() | 通过禁用传感器,然后模拟设备向右转,并且固定位置 |
void | unfreezeRotation() | 重新启用传感器和允许物理旋转 |
boolean | isNaturalOrientation() | 检测设置是否处于默认旋转状态 |
int | getDisplayRotation() | 返回当前的显示旋转,0度,90度,180度,270度值分别为:0(Surface.ROTATION_0)、1(Surface.ROTATION_90)、2(类推)、3(类推) |
void | freezeRotation() | 禁用传感器和冻结装置物理旋转在其当前旋转状态 |
六、灭屏与唤醒
灭屏与唤醒相关API
返回值 | 方法名 | 描述 |
void | wakeUp() | 模拟按电源键,如果屏幕是唤醒的没有任何作用 |
void | sleep() | 模拟按电源键,如果屏幕已经是关闭的则没有任何作用 |
boolean | isScreenOn() | 检查屏幕是否亮屏 |
七、截图与等待空闲
1 、截图与等待空闲相关知识
(1)图片缩放比例:如缩小1/2,即将100*100px的图片长宽都缩小为原来的1/2,50*50px。
(2)图片质量:一般是指图片的大小,质量越高图片越大。
(3)File 类:文件或者文件夹。
(4)图片格式 :截图的格式都是PNG。
(5)空闲状态:窗口没有更新或界面无动作。
(6)窗口更新事件。
2、截图相关API
返回值 | 方法名 | 描述 |
boolean | takeScreenshot(File storePath) | 把当前窗口截图并将其存储为png默认1.0f的规模(原尺寸)和90%质量,参数为file类的文件路径。 |
boolean | takeScreenshot(File storePath, float scale, int quality) | 把当前窗口截图为png格式图片,可以自定义缩放比例与图片质量。 |
参数说明:
storePath:存储路径,必须为png格式。
scale:缩放比例,1.0为原图。
quality:图片压缩质量,范围为0-100。
3、等待空闲相关API
返回值 | 方法名 | 描述 |
void | waitForIdle(long timeout) | 自定义超时等待当前应用处于空闲状态 |
void | waitForIdle() | 等待当前应用处于空闲状态,默认等待10s;即10s后还不处于空闲状态则报错,程序在该句代码处中断;10s内程序处于空闲状态,则该句代码执行完毕。 |
boolean | waitForWindowUpdate(String packageName, long timeout) | 等待窗口内容更新事件的发生 |
八、获取包名&开启通知栏&快速设置&获取布局文件
1、相关知识
包名:应用的唯一标识。
通知栏:从手机顶部下滑,出现的下拉界面即通知栏。
快速设置:即通知栏中的快速设置控件,快速设置界面可设置网络、屏幕亮度、飞行模式等。
2、相关API
返回值 | 方法名 | 描述 |
void | getCurrentPackageName() | 获取当前界面的包名,即目前处于手机前台的应用的包名 |
void | dumpWindowHierarchy(String fileName) | 获取当前界面的布局文件,fileName给布局文件命名如“layout.xml”,保存在/data/local/tmp/目录下 |
boolean | openNotification() | 打开通知栏 |
boolean | openQuickSettings() | 打开快速设置 |