Android自动化测试之 Uiautomator-UiDevice-API

UIdevice提供关于设备的状态信息。你也可以使用这个类来模拟装置上的用户的行为,如按方向键或按菜单按钮。

click

boolean

click(int x, int y)

在任意坐标指定的坐标执行一个点击

.

例子:

点击坐标点(300,300:

UiDevice.getInstance().click(300, 300);
或  getUiDevice().click(300, 300);


推荐使用上面的UiDevice.getInstance()进行书写,如果使用下面的书写,在同一个类中没问题,如果要在其他类中的方法使用了getUiDevice,调用到本类中不会有语法错误,但是执行的时候会出错。以下也是如此,不再写getUiDevice。

freezeRotation

void

freezeRotation()

禁用传感器和设备的旋转且在当前的旋转状态冻结。

例子:

当前手机状态为竖屏,锁定当前手机为竖屏,不让手机跟随着手机物理旋转而旋转。

UiDevice.getInstance().freezeRotation();


getCurrentPackageName


String

getCurrentPackageName()

返回当前界面的包名的字符串

例子:

当前在QQ界面,我想要知道QQ的包名

StringqQpackagenameString=UiDevice.getInstance().getProductName();


getDisplayHetght与getDisplayWidth

int

getDisplayHeight()

获取显示器的高度,以像素为单位。

int

getDisplayWidth()

获取显示器的宽度,以像素为单位。

例子:

获得当前手机的屏幕宽度与高度,即获得当前手机的屏幕分辨率

int width=UiDevice.getInstance().getDisplayWidth();
int height=UiDevice.getInstance().getDisplayHeight();


getDisplayRotation

int

getDisplayRotation()

返回当前的显示旋转,090180270

返回整数

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


getDisplaySizeDp

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


getProductName

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)

启用或禁用布局层次压缩。

 


你可能感兴趣的:(android,UIautomate)