[在此处键入]范翰卿整理联系邮箱:fanhq1@lenovo.comAndroid自动化测试之Uiautomator-UiDevice-API详解目录UiDevice-API.............................................21.click.......................................................22.freezeRotation......................................23.getCurrentPackageName.........................34.getDisplayHetght与getDisplayWidth.35.getDisplayRotation...............................36.getDisplaySizeDp..................................47.getProductName......................................58.监听器...................................................59.按键事件.................................................810.旋转.......................................................911.锁屏与唤醒.........................................1012.等待对象..............................................1113.截图......................................................1214.拖拽与滑动...........................................1215.通知栏·快速设置................................1316.窗口布局结构.......................................13UiDevice-APIuidevice提供关于设备的状态信息。你也可以使用这个类来模拟装置上的用户的行为,如按方向键或按菜单按钮。1.clickbooleanclick(intx,inty)在任意坐标指定的坐标执行一个点击.例子:点击坐标点(300,300)UiDevice.getInstance().click(300,300);或getUiDevice().click(300,300);推荐使用上面的UiDevice.getInstance()进行书写,如果使用下面的书写,在同一个类中没问题,如果要在其他类中的方法使用了getUiDevice,调用到本类中不会有语法错误,但是执行的时候会出错。以下也是如此,不再写getUiDevice。2.freezeRotationvoidfreezeRotation()禁用传感器和设备的旋转且在当前的旋转状态冻结。例子:当前手机状态为竖屏,锁定当前手机为竖屏,不让手机跟随着手机物理旋转而旋转。UiDevice.getInstance().freezeRotation();3.getCurrentPackageNameStringgetCurrentPackageName()返回当前界面的包名的字符串例子:当前在QQ界面,我想要知道QQ的包名StringqQpackagenameString=UiDevice.getInstance().getProductName();4.getDisplayHetght与getDisplayWidthintgetDisplayHeight()获取显示器的高度,以像素为单位。intgetDisplayWidth()获取显示器的宽度,以像素为单位。例子:获得当前手机的屏幕宽度与高度,即获得当前手机的屏幕分辨率intwidth=UiDevice.getInstance().getDisplayWidth();intheight=UiDevice.getInstance().getDisplayHeight();5.getDisplayRotationintgetDisplayRotation()返回当前的显示旋转,0,90,180,270返回整数0代表当前物理旋转0度1代表当前物理旋转90度2代表当前物理寻转180度3代表当前物理旋转270度例子:获取当前界面的旋转状态:switch(UiDevice.getInstance().getDisplayRotation()){case0:System.out.println(当前旋转状态0度);break;case1:System.out.println(当前旋转状态90度);break;case2:System.out.println(当前旋转状态180度);break;case3:System.out.println(当前旋转状态270度);break;default:break;}6.getDisplaySizeDpPointgetDisplaySizeDp()返回显示DP大小(设备独立的像素)返回的显示大小根据每个屏幕旋转。DP知识:在android系统中单位DP也就是DIP:deviceindependentpixels(设备独立像素).dip:deviceindependentpixels(设备独立像素).不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。px:pixels(像素).不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。pt:point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;sp:scaledpixels(放大像素).主要用于字体显示bestfortextsize。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);7.getProductNameStringgetProductName()返回当前设备的产品名例子:获取当前产品名Stringproduct=UiDevice.getInstance().getProductName();8.监听器voidregisterWatcher(Stringname,UiWatcherwatcher)注册一个监听器,当前运行指定步骤被打断的时候,处理中断异常voidremoveWatcher(Stringname)移除之前注册的监听器voidresetWatcherTriggers()重置一个监听器voidrunWatchers()强制运行所有的监听器booleanhasAnyWatcherTriggered()检查是否有监听器触发过booleanhasWatcherTriggered(StringwatcherName)检查某个特定的监听器是否触发过监听器用于处理中断,当脚本其他未知情况打断执行的时候,如果有监听器则会跳转到监听器中执行,我们可以使用监听器做一些特殊的测试如,来电,来闹钟日常等测试。还可以处理异常中断,如我最先设计的测试步骤,中途突然10086来了封短信,弹窗短信,直接打断我的脚本步骤,如果我没有做预先的处理则,这条用例最终就执行失败。另外监听器需要写在脚本的开头。例子:在循环打开百度关闭百度应用过程中来电话,使用监听器挂断电话,让脚本继续执行。//注册监听器,处理来电UiDevice.getInstance().registerWatcher(hangUpThePhone,newUiWatcher(){@OverridepublicbooleancheckForCondition(){//TODOAuto-generatedmethodstubUiObjecttext=newUiObject(newUiSelector().text(来电));UiObjectcall=newUiObject(newUiSelector().className());if(text.exists()){try{call.swipeRight(10);}catch(UiObjectNotFoundExceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}returntrue;}else{returnfalse;}}});//测试脚本UiObjectbaiduObject=newUiObject(newUiSelector().text(百度));for(inti=0;i100;i++){baiduObject.clickAndWaitForNewWindow();sleep(2000);UiDevice.getInstance().pressHome();sleep(1000);}9.按键事件booleanpressBack()模拟短按返回键.booleanpressDPadCenter()轨迹球booleanpressDPadDown()轨迹球booleanpressDPadLeft()轨迹球booleanpressDPadRight()轨迹球booleanpressDPadUp()轨迹球booleanpressDelete()模拟短按删除键.booleanpressEnter()模拟短按回车键.booleanpressHome()模拟短按HOME键.booleanpressKeyCode(intkeyCode,intmetaState)模拟短按键盘代码.booleanpressKeyCode(intkeyCode)模拟短按键盘代码.booleanpressMenu()模拟短按MENU键booleanpressRecentApps()模拟短按最近应用程序按键booleanpressSearch()模拟短按搜索键按键主要为模拟设备的物理按键,如home键,menu键,back键,音量键等例子:按home键:UiDevice.getInstance().pressHome();按menu键:UiDevice.getInstance().pressMenu();按back键:UiDevice.getInstance().pressBack();对于pressKeyCode(intkeyCode)模拟短按键盘代码。键盘代码为何物呢,其实我们键盘上的每个按键都对应一个整数的代码,比如说delete键为67。具体键盘代码请到谷歌官网查询,附上网址,需要查什么按键只需搜索相应的英文就可以了。