快学UiAutomator UiDevice API 详解

一、按键使用

返回值

方法名

说明

booleanpressBack()模拟短按返回back键
booleanpressDPadCenter()模拟按轨迹球中点按键
booleanpressSPadDown()模拟轨迹球向下按键
booleanpressDPadLeft()模拟轨迹球向左按键

boolean

pressDPadRight()模拟轨迹球向右按键
booleanpressDPadUp()模拟轨迹球向上按键
booleanpressDelete()模拟短按删除delete按键
booleanpressEnter()模拟短按回车enter键
booleanpressHome()模拟短按home键
booleanpressKeyCode(int keyCode,int metaState)模拟短按键盘代码keycode
booleanpressKetCode(int keyCode)模拟短按键盘代码keycode
booleanpressMenu()模拟短按menu键
booleanpressRecentApps()模拟短按最近使用程序
booleanpressSearch()模拟短按搜索键

按键主要为模拟设备的物理按键,如home键,menu键,back键,音量键等

例子:

按home键:UiDevice.getInstance().pressHome();

按menu键:UiDevice.getInstance().pressMenu();

按back键:UiDevice.getInstance().pressBack();

 keycode使用

meta_key未被激活0
shift或caps_lock被激活时1
alt被激活2
alt,shift或caps_lock同时被激活时3


对于 pressKeyCode(int keyCode) 模拟短按键盘代码。键盘代码为何物呢,其实我们键盘上的每个按键都对应一个整数的代码,比如说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);
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);//输入小写a 

UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);//输入大写a

二、获取坐标与坐标点击

返回值

方法名

说明

booleanclick(int x,int y)使用坐标点击屏幕(在任意坐标指定的坐标执行一个点击)
intgetDisplayHeight()获取屏幕高度
pointgrtDisplaySizeDp()获取显示尺寸返回显示大小(设备独立像素)
intgetDisplayWidth()获得屏幕宽度

实例:

int w=UiDevice.getInstance().getDisplayWidth();//获取屏幕宽度

int h=UiDevice.getInstance().getDisplayHeight();//获取屏幕高度

UiDevice.getInstance().click(h/2, w/2);//点击屏幕中心点

UiDevice.getInstance().click(300, 300);//点击坐标点(300,300)
或  getUiDevice().click(300, 300);

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

三、旋转

返回值方法名描述
voidsetOrientationLeft()通过禁用传感器,然后模拟设备向左旋转并且固定位置
voidsetOrientationNatural()通过禁用传感器,然后模拟设备转到其自然默认的方向,并且固定位置
voidsetOrientationRight()通过禁用传感器,然后模拟设备向又旋转并且固定位置
voidunfreezeRotation()重新启用传感器和允许物理旋转
booleanisNaturalOrientation()检测设置是否处于默认旋转状态
intgetDisplayRotation()返回当前的显示旋转,0度,90度,180度,270度值分别为:0,1,2,3
voidfreezeRotation()禁用传感器和冻结装置物理旋转在其当前旋转状态

实例1:

public void testOrientation() throws RemoteException{

    //1.模拟设备向左向右旋转

    UiDevice.getInstance().setOrientationLeft();    //设备向左旋转
    UiDevice.getInstance().setOrientationRight();   //设备向右旋转

    //2.如果设备处于默认旋转状态,就向左旋转

    if (UiDevice.getInstance().isNaturalOrientation()){ 

        UiDevice.getInstance().setOrientationLeft();

    }

    //3.变量a获取当前新鲜事旋转度数,然后进行相应if判断

    int a=UiDevice.getInstance().getDisplayRotation();

    if (a==Surface.ROTATION_0){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_90){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_180){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_270){

        UiDevice.getInstance().setOrientationLeft();

    }
}

实例2:

UiDevice.getInstance().freezeRotation();

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

四、锁屏和唤屏

返回值

方法名

描述

voidwakeUp()模拟按电源键,如果屏幕是唤醒的没有任何作用
voidsleep()模拟按电源键,如果屏幕已经是关闭的则没有任何作用
booleanisScreenOn()检查屏幕是否亮屏

实例:

public void testScreenOn() throws RemoteException{
  //检查屏幕是否唤醒,如果不是则唤醒
    //如果屏幕是亮屏,则关闭屏幕

    if (UiDevice.getInstance().isScreenOn()){

        UiDevice.getInstance().sleep();     //灭屏操作

    }

    //如果屏幕是灭屏状态则转为亮屏状态

    if (!UiDevice.getInstance().isScreenOn()){

        UiDevice.getInstance().wakeUp();    //亮屏操作

    }

}

五、等待对象

返回值

方法名

描述

voidwaitForIdle(long timeuot)自定义超时等待当前应用处于空闲状态
voidwaitForIdle()等待当前应用处于空闲状态,默认等待10s
booleanwaitForWindowUpdate(Steing packageName,long timeout)等待窗口内容更新时间的发生窗口更新事

实例:

public void testIdle(){
    //通过坐标点击界面上的,一个应用,点开应用后点击界面上的“搜索”按钮

   UiDevice.getInstance().click(580, 654);

   //等待500000,如果界面还没有打开则,超时异常
    UiDevice.getInstance().waitForIdle(500000);

    UiObject searchObject=new UiObject(new UiSelector().text("搜索"));
		
    searchObject.click();

    //超时等待等待时间为0到500000,如果在这个时间内,界面载入完成则算成功。
    
    //[0,417][64,480]这个是浏览器坐标

    UiDevice.getInstance().click(32, (480-417)/2+417);//点击浏览器

    UiDevice.getInstance().waitForIdle(20000);//超时等待20s

    
} 
等待当前应用处于空闲状态,如打开应用程序,打开载入的动作一直在进行,当前完全载入程序,处于应用主界面,而没有去操作他,此时的状态就是空闲状态。
窗口更新事件,如点击一个按钮这个按钮会跳转到其他的activity中,则点击这个按钮就发生了窗口更新事件。

六:截图

返回值

方法名

描述

booleantakeScreenshot(FilestorePath)把当前窗口截图并将其存储为png默认的1.0f的规格(原尺寸)和90%质量,参数为file类的文件路径
booleantakeScreenshot(File storePath,float scale,int quality)把当前窗口截图为png格式图片,可以自

参数说明:

参数说明
storePath存储路径,必须为png格式
Scale缩放比例,1.0为原图
Quality图片压缩质量,范围为0-100
  
返回    说明
True截图成功
False截图失败

实例:

//把当前窗口截图并将其存储为png默认的1.0f的规格(原尺寸)和90%质量,参数为file类的文件路径为"sdcard/test1.png"

public void testScreen(){

    UiDevice.getInstance().takeScreenshot(new File("sdcard/test1.png"));

}

//参数为File类,注意参数的使用形式,请参照以下例子
//截图保存到sd卡更目录中,图片文件名为test1

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)

从一个坐标到另一个坐标进行拖拽

 

拖拽:将一个组件从一个坐标移动到另一个坐标处
滑动:从一个坐标点移动到另一个坐标点
步长:从一点滑动到另一点使用的时间(1步长=5毫秒,1秒=1000毫秒);步长越长,即两点之间移动越慢

  

参数说明:

参数说明
segments

Poing[]点阵列,可以多个点

segmentSteps滑动步长
StartX-StartY具体坐标值
  
返回    说明
True滑动成功
False滑动失败

实例:

//1.拖动对象从一个坐标移动到另一个坐标

public void testDrag(){

    //[64,417][128,480] 找到坐标位置先

    int startX, startY, endX, endY, steps;                          

    startX=(128-64)/2+64;                                           

    startY=(480-417)/2+417;

    endX=startX=(128-64)/2+64;

    endY=startY-200;

    steps=30;

    UiDevice.getInstance().drag(startX, startY, endX, endY, steps);

}
//2.通过坐标滑动屏幕

public void testSwipe(){

    int h=UiDevice.getInstance().getDisplayHeight();        //获取屏幕高度

    int w=UiDevice.getInstance().getDisplayWidth();         //获取屏幕宽度

    UiDevice.getInstance().swipe(w-10, h/2, 10, h/2, 30);   //从左往右进行滑动

}
//3.在点阵列中滑动(例子中为画了一个不规则矩形)

public void testSwipe2(){

//227,318  746,335  784,814  221,840  矩形的四个定点,比如随意画手势,滚动,滑动等都会用到这个

    Point p1=new Point();

    Point p2=new Point();

    Point p3=new Point();

    Point p4=new Point();

    p1.x=227;p1.y=318;

    p2.x=746;p1.y=335;

    p3.x=784;p1.y=814;

    p4.x=221;p1.y=840;

    Point[] pp={p1,p2,p3,p4};

    UiDevice.getInstance().swipe(pp, 50);

}

八:获取包名&开启通知栏&快速设置&获取布局文件

返回值方法名描述
voidgetCurrentPackageName()获取当前界面的包名
voiddumpWindowHierarchy(String fileName)获取当前界面的布局文件,保存在/data.local/tmp/目录下
booleanopenNotification()打开通知栏
booleanopenQuickSettings()打开快速设置
void

setCompressedLayoutHeirarchy(boolean compressed)

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

实例:

//1.获取并输出包名

public void testGet(){

    String packageName=UiDevice.getInstance().getCurrentPackageName();  //获取包名

    System.out.print("浏览器的包名为:"+packageName);   //在控制台输出包名

    UiDevice.getInstance().openNotification();  //打开通知栏

    UiDevice.getInstance().openQuickSettings(); //打开快速设置栏

    UiDevice.getInstance().dumpWindowHierarchy("n.xml");//获取当前界面的布局文件并命名为n

        //对于该文件可以使用命令"adb pull /data/local/tmp/n.xml F:\"命令将该文件导出来

}

九:监听器

返回值 方法名说明
void

registerWatcher(String name, UiWatcher watcher)

注册一个监听器,当前运行指定步骤被打断的时候,处理中断异常
void

removeWatcher(String name)

移除之前注册的监听器
void

resetWatcherTriggers()

重置一个监听器
void

runWatchers()

强制运行所有的监听器
booleanhasAnyWatcherTriggered()检查是否有监听器触发过
boolean

hasWatcherTriggered(String watcherName)

检查某个特定的监听器是否触发过

实例:

//在循环打开百度关闭百度应用过程中来电话,使用监听器挂断电话,让脚本继续执行 
//注册监听器,处理来电 UiDevice.getInstance().registerWatcher("hangUpThePhone", new UiWatcher() { @Override public boolean checkForCondition() { // TODO Auto-generated method stub UiObject text=new UiObject(new UiSelector().text("来电")); UiObject call=new UiObject(new UiSelector().className("")); if(text.exists()){ try { call.swipeRight(10); } catch (UiObjectNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; }else{ return false; } } }); //测试脚本 UiObject baiduObject=new UiObject(new UiSelector().text("百度")); for(int i=0;i<100;i++){ baiduObject.clickAndWaitForNewWindow(); sleep(2000); UiDevice.getInstance().pressHome(); sleep(1000); }
监听器用于处理中断,当脚本其他未知情况打断执行的时候,如果有监听器则会跳转到监听器中执行,我们可以使用监听器做一些特殊的测试如,来电,来闹钟日常等测试。还可以处理异常中断,如我最先设计的测试步骤,中途突然10086来了封短信,弹窗短信,直接打断我的脚本步骤,如果我没有做预先的处理则,这条用例最终就执行失败。另外监听器需要写在脚本的开头。

  

 

转载于:https://www.cnblogs.com/xiaoyaowuming/p/7015900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值