UIdevice提供关于设备的状态信息。你也可以使用这个类来模拟装置上的用户的行为,如按方向键或按菜单按钮。
boolean |
click(int x, int y) 在任意坐标指定的坐标执行一个点击 |
.
例子:
点击坐标点(300,300:
UiDevice.getInstance().click(300, 300);
或 getUiDevice().click(300, 300);
推荐使用上面的UiDevice.getInstance()进行书写,如果使用下面的书写,在同一个类中没问题,如果要在其他类中的方法使用了getUiDevice,调用到本类中不会有语法错误,但是执行的时候会出错。以下也是如此,不再写getUiDevice。
void |
freezeRotation() 禁用传感器和设备的旋转且在当前的旋转状态冻结。 |
例子:
当前手机状态为竖屏,锁定当前手机为竖屏,不让手机跟随着手机物理旋转而旋转。
UiDevice.getInstance().freezeRotation();
String |
getCurrentPackageName() 返回当前界面的包名的字符串 |
例子:
当前在QQ界面,我想要知道QQ的包名
StringqQpackagenameString=UiDevice.getInstance().getProductName();
int |
getDisplayHeight() 获取显示器的高度,以像素为单位。 |
int |
getDisplayWidth() 获取显示器的宽度,以像素为单位。 |
例子:
获得当前手机的屏幕宽度与高度,即获得当前手机的屏幕分辨率
int width=UiDevice.getInstance().getDisplayWidth();
int height=UiDevice.getInstance().getDisplayHeight();
int |
getDisplayRotation() 返回当前的显示旋转,0,90,180,270 |
返回整数
0代表当前物理旋转0度
1代表当前物理旋转90度
2代表当前物理寻转180度
3代表当前物理旋转270度
例子:
获取当前界面的旋转状态:
switch(UiDevice.getInstance().getDisplayRotation()){
case 0:
System.out.println("当前旋转状态0度");
break;
case 1:
System.out.println("当前旋转状态90度");
break;
case 2:
System.out.println("当前旋转状态180度");
break;
case 3:
System.out.println("当前旋转状态270度");
break;
default:
break;
}
Point |
getDisplaySizeDp() 返回显示DP大小(设备独立的像素)返回的显示大小根据每个屏幕旋转。 |
DP知识:
在android系统中单位DP也就是DIP:deviceindependent pixels(设备独立像素).
dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素).主要用于字体显示best fortextsize。
dp也就是dip。这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。如果屏幕密度为160,这时dp和sp和px是一样的。1dp=1sp=1px,但如果使用px作单位,如果屏幕大小不变(假设还是3.2寸),而屏幕密度变成了320。那么原来TextView的宽度设成160px,在密度为320的3.2寸屏幕里看要比在密度为160的3.2寸屏幕上看短了一半。但如果设置成160dp或160sp的话。系统会自动将width属性值设置成320px的。也就是160 * 320 /160。其中320 / 160可称为密度比例因子。也就是说,如果使用dp和sp,系统会根据屏幕密度的变化自动进行转换.
例子:
PointaPoint=getUiDevice().getDisplaySizeDp();
System.out.println("width:"+aPoint.x);
System.out.println("height:"+aPoint.y);
String |
getProductName() 返回当前设备的产品名 |
例子:
获取当前产品名
Stringproduct=UiDevice.getInstance().getProductName();
void |
registerWatcher(String name, UiWatcher watcher) 注册一个监听器,运行指定步骤被打断的时候,处理中断异常 |
void |
removeWatcher(String name) 移除之前注册的监听器 |
void |
resetWatcherTriggers() 重置一个监听器 |
void |
runWatchers() 强制运行所有的监听器 |
boolean |
hasAnyWatcherTriggered() 检查是否有监听器触发过 |
boolean |
hasWatcherTriggered(String watcherName) 检查某个特定的监听器是否触发过 |
监听器用于处理中断,当脚本其他未知情况打断执行的时候,如果有监听器则会跳转到监听器中执行,我们可以使用监听器做一些特殊的测试如,来电,来闹钟日常等测试。还可以处理异常中断,如我最先设计的测试步骤,中途突然10086来了封短信,弹窗短信,直接打断我的脚本步骤,如果我没有做预先的处理则,这条用例最终就执行失败。另外监听器需要写在脚本的开头。
例子:
在循环打开百度关闭百度应用过程中来电话,使用监听器挂断电话,让脚本继续执行。
//注册监听器,处理来电
UiDevice.getInstance().registerWatcher("hangUpThePhone",new UiWatcher() {
@Override
public boolean checkForCondition(){
// TODO Auto-generated methodstub
UiObject text=new UiObject(newUiSelector().text("来电"));
UiObject call=new UiObject(newUiSelector().className(""));
if(text.exists()){
try {
call.swipeRight(10);
} catch(UiObjectNotFoundException e) {
// TODO Auto-generatedcatch block
e.printStackTrace();
}
return true;
}else{
return false;
}
}
});
//测试脚本
UiObject baiduObject=new UiObject(newUiSelector().text("百度"));
for(int i=0;i<100;i++){
baiduObject.clickAndWaitForNewWindow();
sleep(2000);
UiDevice.getInstance().pressHome();
sleep(1000);
}
boolean |
pressBack()模拟短按返回键. |
boolean |
pressDPadCenter()轨迹球 |
boolean |
pressDPadDown()轨迹球 |
boolean |
pressDPadLeft()轨迹球 |
boolean |
pressDPadRight()轨迹球 |
boolean |
pressDPadUp()轨迹球 |
boolean |
pressDelete()模拟短按删除键. |
boolean |
pressEnter()模拟短按回车键. |
boolean |
pressHome()模拟短按HOME键. |
boolean |
pressKeyCode(int keyCode, int metaState)模拟短按键盘代码. |
boolean |
ressKeyCode(int keyCode)模拟短按键盘代码. |
boolean |
pressMenu()模拟短按MENU键 |
boolean |
pressRecentApps()模拟短按最近应用程序按键 |
boolean |
pressSearch()模拟短按搜索键 |
按键主要为模拟设备的物理按键,如home键,menu键,back键,音量键等
例子:
按home键:UiDevice.getInstance().pressHome();
按menu键:UiDevice.getInstance().pressMenu();
按back键:UiDevice.getInstance().pressBack();
对于 pressKeyCode(intkeyCode) 模拟短按键盘代码。键盘代码为何物呢,其实我们键盘上的每个按键都对应一个整数的代码,比如说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);
void |
freezeRotation() 禁用传感器和冻结装置物理旋转在其当前旋转状态 |
void |
unfreezeRotation()重新启用传感器和允许物理旋转 |
boolean |
isNaturalOrientation()检查设置是否是在其自然旋转竖屏的位置上 |
void |
setOrientationLeft() 通过禁用传感器,然后模拟设备向左转,并且固定位置 |
void |
setOrientationNatural()通过禁用传感器, 然后模拟设备转到其自然默认的方向,并且固定位置 |
void |
setOrientationRight() 通过禁用传感器,然后模拟设置向右转,并且固定冻结在那 |
例子:
需要测试横屏界面,固定在向左转的横屏状态
UiDevice.getInstance().setOrientationLeft();
//判断当前是否在竖屏位置,如不是返回原始的竖屏状态
if(!UiDevice.getInstance().isNaturalOrientation()){
UiDevice.getInstance().setOrientationNatural();
}
void |
sleep()锁屏 模拟按电源键,如果屏幕已经是关闭的则没有任何作用 |
void |
wakeUp()唤醒 模拟按电源键,如果屏幕是唤醒的没有任何作用 |
boolean |
isScreenOn()检查屏幕是否唤醒 |
例子
检查屏幕是否唤醒,如果不是则唤醒
if(UiDevice.getInstance().isScreenOn()){
UiDevice.getInstance().wakeUp();
}
void |
waitForIdle(long timeout) 等待当前应用程序处于空闲状态 |
void |
waitForIdle() 等待当前的应用程序处于空闲状态 |
boolean |
waitForWindowUpdate(String packageName, long timeout) 等待窗口内容更新事件的发生 |
等待当前应用处于空闲状态,如打开应用程序,打开载入的动作一直在进行,当前完全载入程序,处于应用主界面,而没有去操作他,此时的状态就是空闲状态。
窗口更新事件,如点击一个按钮这个按钮会跳转到其他的activity中,则点击这个按钮就发生了窗口更新事件。
例子:
通过坐标点击界面上的,一个应用,点开应用后点击界面上的“搜索”按钮
UiDevice.getInstance().click(580,654);
//等待500000,如果界面还没有打开则,超时异常
UiDevice.getInstance().waitForIdle(500000);
UiObject searchObject=new UiObject(newUiSelector().text("搜索"));
searchObject.click();
超时等待等待时间为0到500000,如果在这个时间内,界面载入完成则算成功。
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
返回:
True:截图成功
False:截图失败
参数为File类,注意参数的使用形式,请参照以下例子
例子:
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) 从一个坐标到另一个坐标进行拖拽 |
参数:
segments:Poing[]点阵列,可以多个点
segmentSteps:滑动步长
StartX-StartY: 具体坐标值
返回:
True:滑动成功
False:滑动
例子:
从左往右扫动屏幕
int height=UiDevice.getInstance().getDisplayHeight();
int width=UiDevice.getInstance().getDisplayWidth();
UiDevice.getInstance().swipe(50,height/2, width-50, height/2, 10);
boolean |
openNotification()Opens the notification shade. 打开通知栏 |
boolean |
openQuickSettings()Opens the Quick Settings shade. 打开快速设置 |
void |
dumpWindowHierarchy(String fileName) 用于调试转储当前窗口的布局层次结构。文件保存在/data/local/tmp |
void |
setCompressedLayoutHeirarchy(boolean compressed) 启用或禁用布局层次压缩。 |