九、UiWatcher API 详细介绍

Tip:
1.监听器不是完能的,所以若用例需要设置监听器防止用例被打断,最好把延迟时间调高一点
2.UiDevice是不会触发监听功能的
3.监听器在方法体或者循环体中是程序还是会被打断的
4.监听器要在防止中断用例前执行

一、UiWatcher类介绍与中断监听检查条件
1.UiWatcher类说明

1)UiWatcher用于处理脚本执行过程中遇到的非想象的步骤
2)UiWatcher使用场景

测试过程中来了个电话

测试过程中收到个短信

测试过程中闹钟响了
……

2.中断监听检查条件

API:

说明:

public boolean checkForCondition();在测试框架无法找到一个匹配时,使用uiselector测试框架将自动调用此处理程序的方法。在超时找到匹配项时,框架调用checkForCondition()方法检查设备上的所有已注册的监听检查条件。

 

例如:


  • 如果出现一个对话框,您可以检查是否是运营商发来的服务信息而不是出现测试异常。

二、监听器操作及检查

1.相关API

返回值

API

说明

voidregisterWatcher(String name,UiWatcher watcher)注册一个监听器,当UiSelector无法匹配到对象的时候,触发监听器
voidremoveWatcher(String name)取消之前注册的指定监听器
voidresetWatcherTriggers()重置已触发过的UiWatcher,重置后相当于没运行过
voidrunWatchers()强制运行所有的监听器
booleanhasAnyWatcherTriggered()检查是否有监听器触发过
booleanhasWatcherTriggered(String watcherName)检查某个特定监听器是否触发过

 

例如:
复制代码
public void testDemo2() throws UiObjectNotFoundException{
    //1.先注册监听器(registerWatcher(String name,UiWatcher watcher))
    UiDevice.getInstance().registerWatcher("Phone", new UiWatcher(){
        public boolean checkForCondition() {
            //1.挂断电话
            UiObject call=new UiObject(new UiSelector().text("来电"));
            UiObject view=new UiObject(new UiSelector().className("android.view.View"));
            if (call.exists()){
                System.out.print("电话监听器被触发了");              
                try{
                    view.swipeLeft(20);
                    return true;
                } catch (UiObjectNotFoundException e){
                    e.printStackTrace();
                }
            }
            return false;
        }
    });
    //1.再注册一个监听器
    UiDevice.getInstance().registerWatcher("Massage", new UiWatcher(){  
        public boolean checkForCondition() {
            System.out.print("短信监控被触发了");
            return false;
        }
    });
    //2.执行用例步骤
    //使用index+classNmae定位父类+text定位子类最终定位到对象[声音按钮]
    UiObject vol =new UiObject(new UiSelector()
    .className("android.widget.LinearLayout").index(6))
    .getChild(new UiSelector().text("声音"));
    //获取下一级界面的返回按钮
    UiObject Back=new UiObject(new UiSelector().description("声音:向上导航"));
//      //使用for循环监听器不会起作用
//      for(int i=0;i<10;i++){
//          //输出循环次数:
//          System.out.println("当前循环"+(i+1)+"次;");
//          //点击对象并等到新窗口出现
//          vol.clickAndWaitForNewWindow();
//          sleep(2000);
//          //点击返回按钮
//          Back.clickAndWaitForNewWindow();
//          sleep(2000);
//      }
    //可以在下面五次操作过程中打入电话进行调试
    //第一次点击对象并等到新窗口出现
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    //点击返回按钮
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //第二次
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //第三次
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //第四次
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //第五次
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //在第五次返回后关闭指定监听器(removeWatcher(String name))这样以后就不会被触发了
    UiDevice.getInstance().removeWatcher("Phone");
    //然后再强制运行所有监控器
    UiDevice.getInstance().runWatchers();
    //第六次
    vol.clickAndWaitForNewWindow();
    sleep(2000);
    Back.clickAndWaitForNewWindow();
    sleep(2000);
    //在第五次返回后检查并输出监听器是否被触发过
    //检查是否有监听器被触发过
    boolean B=UiDevice.getInstance().hasAnyWatcherTriggered();
    //检测是否有特定监听器被触发过
    boolean Phone1=UiDevice.getInstance().hasWatcherTriggered("Phone");
    boolean Massage1=UiDevice.getInstance().hasWatcherTriggered("Massage");
    System.out.println("是否有监听器被触发过"+B);
    System.out.println("电话监听器是否被触发过"+Phone1);
    System.out.println("短信监听器是否被触发过"+Massage1);
    //逻辑判断然后进行重置和强制运行操作
    if(B==true){
        //重置被运行过的监听器
        UiDevice.getInstance().resetWatcherTriggers();
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值