UiDevice用来与测试设备进行交互,获取设备信息,发送操作指令及保存截图布局等状态,根据其api功能的不同,以下分几个方面简单介绍其常用的功能:
1、事件操作相关。
向设备发送按钮点击事件,封装了部分常用的按钮,但所有按钮事件都可以通过pressKeyCode(int keyCode)这个方法来等效指定:
返回值 | 方法及说明 |
boolean | pressBack() / pressHome() / pressMenu() / pressSearch() 单击返回键 / Home键 / 菜单键 / 搜索键 |
boolean | pressKeyCode(int keyCode) 向设备发送事件keyCode,具体事件可见参见KeyEvent |
用法:
public void testKey() {
UiDevice device = UiDevice.getInstance();
//点击系统返回键
device.pressBack();
//点击系统home键
device.pressHome();
}
2、屏幕操作相关。
向设备发送屏幕操作事件,包含点击,拖拽,修改设备屏幕状态(亮灭屏,屏幕方向),其中双击可以使用click进行组合,多个点连续滑动可以使用swipe(Point[] segments, int segmentSteps)
返回值 | 方法及说明 |
boolean | click(int x, int y) 点击屏幕坐标点(x,y),坐标原点从屏幕左上角开始 打开开发者选项—指针位置,就可以查看点击坐标点 |
boolean | drag(int startX, int startY, int endX, int endY, int steps) 从(startX, startY)向(endX, endY)拖拽,不长为steps |
boolean | swipe(int startX, int startY, int endX, int endY, int steps) 从(startX, startY)向(endX, endY)滑动,不长为steps |
boolean | swipe(Point[] segments, int segmentSteps) 按住不动顺序完成点间的滑动,步长segmentSteps 多个点之间连续滑动可以使用此方法 |
void | sleep() 设备灭屏,进入休眠状态 |
void | wakeUp() 唤醒设备,一般配合isScreenOn查询状态进行 |
void | setOrientationLeft() / setOrientationNatural() / setOrientationRight() 设置屏幕向左旋转90度 / 恢复自然角度 / 向右旋转 90 度 |
用法:
public void testScreen() throws RemoteException {
UiDevice device = UiDevice.getInstance();
//息屏
device.sleep();
//亮屏
device.wakeUp();
//左转90度
device.setOrientationLeft();
//复原
device.setOrientationNatural();
//右转90度
device.setOrientationRight();
}
再如:
从左往右扫动屏幕
int height=UiDevice.getInstance().getDisplayHeight();
int width=UiDevice.getInstance().getDisplayWidth();
UiDevice.getInstance().swipe(50, height/2, width-50, height/2, 10);
3、快捷开关相关。
封装android通用快捷操作,包含打开通知栏,快速设置,最近任务栏,其并非通过模拟界面点击,而是通过服务事件调用,所以对不同的rom都有很好的兼容性,推荐使用。
返回值 | 方法及说明 |
boolean | pressRecentApps() 打开最近任务界面(多任务切换界面) |
boolean | openNotification() 打开通知栏 |
boolean | openQuickSettings() 打开快捷设置栏 |
4、设备截图&监听相关。
截图可指定缩放比例截图质量,质量越高,需要的时间越长,通常用于保留问题的现场,而注册监听则是为测试过程置入界面观察者,以处理终端弹窗确保测试的顺利进行。
返回值 | 方法及说明 |
boolean | takeScreenshot(File storePath) 截取当前屏幕截图,保存至指定文件 |
boolean | takeScreenshot(File storePath, float scale, int quality) 截取屏幕截图,scale为缩放比例,1.0为原图;quality为截图质量,范围为0-100; |
boolean | registerWatcher(String name, UiWatcher watcher) 注册界面观察者,以处理中断弹窗,name作为移除标示 |
boolean | removeWatcher(String name) 移除界面观察者,name与注册时对应 |
用法:
public void testTakeScreen() {
UiDevice device = UiDevice.getInstance();
File f = new File("/mnt/sdcard/test/1.png");
// 截取原比例截图
device.takeScreenshot(f);
sleep(4000);
// 截取压缩比例截图
device.takeScreenshot(new File("/mnt/sdcard/test/2.png"), 1, 10);
}
但takeScreenshot(File storePath, float scale, int quality)压缩截图比例好像没有效果,不知道为什么。
5、属性获取。
返回值 | 方法及说明 |
int | getDisplayHeight() 获取当前屏幕高度 |
int | getDisplayWidth() 获取当前屏幕宽度 |
String | getCurrentActivityName() 获取当前activity名,此方法不建议使用,取得不准 |
String | getCurrentPackageName() 获取当前页面所属应用包名 |
boolean | isSreenOn() 当前屏幕是否是亮屏状态 |
Point | getDisplaySizeDp() 返回显示DP大小(设备独立的像素)返回的显示大小根据每个屏幕旋转。 |
用法:
例子:
Point aPoint=getUiDevice().getDisplaySizeDp();
System.out.println("width:"+aPoint.x);
System.out.println("height:"+aPoint.y);
6、视图相关
返回值 | 方法及说明 |
void | dumpWindowHierarchy(File dest) dump当前你窗口视图的布局到指定文件 |
void | dumpWindowHierarchy(String fileName) dump当前你窗口视图的布局到指定文件 |
void | dumpWindowHierarchy(OutputSteam out) dump当前你窗口视图的布局到指定文件 |
String | getLastTraversedText() 获取上一次设置的text内容 |
void | clearLastTraversedText() 清除上一次设置的text内容 |
7、时间等待。
返回值 | 方法及说明 |
void | waitForIdle() / waitForIdle(long timeout) 无显示等待当前应用空闲 / 等待应用空闲,若超时则不再等待 |
boolean | waitForWindowUpdate(String packageName, long timeout) 等待指定包名的任意窗口更新,若超时则不再等待 |
等待当前应用处于空闲状态,如打开应用程序,打开载入的动作一直在进行,当前完全载入程序,处于应用主界面,而没有去操作他,此时的状态就是空闲状态。
窗口更新事件,如点击一个按钮这个按钮会跳转到其他的activity中,则点击这个按钮就发生了窗口更新事件。
例子: 通过坐标点击界面上的,一个应用,点开应用后点击界面上的“搜索”按钮
UiDevice.getInstance().click(580, 654); //等待500000,如果界面还没有打开则,超时异常
UiDevice.getInstance().waitForIdle(500000);
UiObject searchObject=new UiObject(new UiSelector().text("搜索"));
searchObject.click();
超时等待等待时间为0到500000,如果在这个时间内,界面载入完成则算成功。
脚本:
package com.uiautomator.demo;
import java.io.File;
import android.graphics.Point;
import android.os.RemoteException;
import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
public class MUiDevice extends UiAutomatorTestCase {
public static void main(String[] args) {
String testClass, testName;
testClass = "com.uiautomator.demo.MUiDevice";
testName = "testGetProperty";
new UiAutomatorHelper(testClass, testName);
}
public void testKey() {
UiDevice device = UiDevice.getInstance();
// 点击系统返回键
device.pressBack();
// 点击系统home键
device.pressHome();
}
public void testScreen() throws RemoteException {
UiDevice device = UiDevice.getInstance();
// 息屏
device.sleep();
// 亮屏
device.wakeUp();
// 左转90度
device.setOrientationLeft();
// 复原
device.setOrientationNatural();
// 右转90度
device.setOrientationRight();
}
public void testMeun() throws RemoteException {
UiDevice device = UiDevice.getInstance();
System.out.println("打开最近任务界面");
device.pressRecentApps();
sleep(1000);
device.pressHome();
sleep(1000);
System.out.println("打开通知栏");
device.openNotification();
sleep(1000);
device.pressHome();
sleep(1000);
System.out.println("打开快捷设置栏");
device.openQuickSettings();
}
public void testTakeScreen() {
UiDevice device = UiDevice.getInstance();
File f = new File("/mnt/sdcard/test/1.png");
// 截取原比例截图
device.takeScreenshot(f);
sleep(4000);
// 截取压缩比例截图
device.takeScreenshot(new File("/mnt/sdcard/test/2.png"), 1, 10);
}
public void testGetProperty() throws RemoteException {
UiDevice device = UiDevice.getInstance();
System.out.println("屏幕高度" + device.getDisplayHeight());
System.out.println("屏幕宽度" + device.getDisplayWidth());
System.out.println("当前包名" + device.getCurrentPackageName());
System.out.println("当前avtivity" + device.getCurrentActivityName());
System.out.println("当前屏幕是否点亮:" + device.isScreenOn());
// 锁屏
device.sleep();
System.out.println("当前屏幕是否点亮:" + device.isScreenOn());
Point aPoint=getUiDevice().getDisplaySizeDp();
System.out.println("width:"+aPoint.x);
System.out.println("height:"+aPoint.y);
}
}