zoukankan      html  css  js  c++  java
  • 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();
        }
    }
  • 相关阅读:
    poj 3280 Cheapest Palindrome(区间DP)
    POJ 2392 Space Elevator(多重背包)
    HDU 1285 定比赛名次(拓扑排序)
    HDU 2680 Choose the best route(最短路)
    hdu 2899 Strange fuction (三分)
    HDU 4540 威威猫系列故事――打地鼠(DP)
    HDU 3485 Count 101(递推)
    POJ 1315 Don't Get Rooked(dfs)
    脱离eclipse,手动写一个servlet
    解析xml,几种方式
  • 原文地址:https://www.cnblogs.com/JianXu/p/5225049.html
Copyright © 2011-2022 走看看