• 6.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

    说明

    void registerWatcher(String name,UiWatcher watcher) 注册一个监听器,当UiSelector无法匹配到对象的时候,触发监听器
    void removeWatcher(String name) 取消之前注册的指定监听器
    void resetWatcherTriggers() 重置已触发过的UiWatcher,重置后相当于没运行过
    void runWatchers() 强制运行所有的监听器
    boolean hasAnyWatcherTriggered() 检查是否有监听器触发过
    boolean hasWatcherTriggered(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();
        }
    }
  • 相关阅读:
    MySQL案例:一次单核CPU占用过高问题的处理
    编写你的第一个Django应用
    ks.cfg文件相关
    Kickstart部署多系统
    Kickstart部署之FTP架构
    Kickstart部署之HTTP架构
    Kickstart部署之NFS架构
    Kickstart无人值守原理及简介
    Linux下面Oracle实列实如何登录的
    welogic的受管理服务器无法启动
  • 原文地址:https://www.cnblogs.com/JianXu/p/5225049.html
Copyright © 2020-2023  润新知