UiAutomator API:UiDevice

高运诚
2023-12-01

UiDevice用来与测试设备进行交互,获取设备信息,发送操作指令及保存截图布局等状态,根据其api功能的不同,以下分几个方面简单介绍其常用的功能:

 

1、事件操作相关。

     向设备发送按钮点击事件,封装了部分常用的按钮,但所有按钮事件都可以通过pressKeyCode(int keyCode)这个方法来等效指定:

返回值

方法及说明

boolean

pressBack() / pressHome() / pressMenu() / pressSearch()

单击返回键 / Home键 / 菜单键 / 搜索键

boolean

pressKeyCode(int keyCode)

向设备发送事件keyCode,具体事件可见参见KeyEvent

http://blog.csdn.net/chen825919148/article/details/18732041

用法:

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);

	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 类似资料:

相关阅读

相关文章

相关问答