Java+Uiautomator自动化测试 -- 11.UiWatcher监听器学习

UiWatcher

 

类说明

UiWatcher用来处理脚本执行过程中遇到的一些弹窗,非预想的步骤

中断监听检查条件

public boolean checkForCndition();

说明:
在测试框架无法找到一个匹配时,使用uiselector测试框架将自动调用此处理程序方法。在超时找到匹配项时,框架调用checkforCondition)方法查找设备上的所有已注册的监听检查条件。1可以使用此方法来处理中断问题保证测试用例正常运行。
例子:

  1. 如果出现一个对话框,您可以检直是否是运营商发来的服务信息而不是出现测试异常。
  2. 第一次进入到一个应用,会弹出很多的权限窗口,这个时候就可以用UiWatcher来处理。

监听器API

返回值 API 说明
void registerWatcher(Stringname, UiWatcher watcher) 注册一个监听器,当UiSelector无法匹配到对象的时候,触发监听器
void removewatcher(String name) 取消之前注册的指定监听器
void resetWatcherTriggers() 重置已触发过的UiWatcher置后相当于没运行过
void runwatchers() 强制运行所有的监听器

检查监听器

返回值 API 说明
boolean hasAnyWatcherTriggered() 检查是否有监听器触发过
Boolean hasWatcherTriggered(String watcherName) 检查某个特定的监听器是否触发过
public void checkForCndition() throws UiObjectNotFoundException {
        //注册监听器
        UiDevice.getInstance().registerWatcher("phone", new UiWatcher() {
            @Override
            public boolean checkForCondition() {
                //挂断电话
                UiObject call = new UiObject(new UiSelector().text("来电"));
                UiObject view = new UiObject(new UiSelector().className(""));
                if(call.exists()) {
                    System.out.println("电话监听触发");
                    try {
                        view.swipeLeft(20);
                        return true;
                    } catch (UiObjectNotFoundException e) {
                        e.printStackTrace();
                    }
                }
                return false;
            }
        });

        UiDevice.getInstance().registerWatcher("msm", new UiWatcher() {
            @Override
            public boolean checkForCondition() {
                System.out.println("短信监听器");
                //这里是false,程序就算走到这里,也不会触发监听器,必须是true,才会触发监听器
                return false;
            }
        });

        //执行用例步骤
        UiObject vol = new UiObject(new UiSelector().resourceId("").index(4))
                .getChild(new UiSelector().text("声音"));

        UiObject back = new UiObject(new UiSelector().description(""));
        vol.clickAndWaitForNewWindow();

        System.out.println("是否有监听器被触发过:" +UiDevice.getInstance().hasAnyWatcherTriggered());
        System.out.println("电话监听器是否被触发过" +UiDevice.getInstance().hasAnyWatcherTriggered());
        System.out.println("短信监听器是否被触发过" + UiDevice.getInstance().hasAnyWatcherTriggered());

        for(int i=0;i<20;i++)
            System.out.println("当前循环:" +i);
        sleep(2000); //时间要久一点,要不监听器触发不了
        back.clickAndWaitForNewWindow();
        sleep(2000);

        //在循环体中途取消UiDevices之后就不会触发监听器
        //当你的方法体执行到一半的时候是无法被触发的,要写在开头
        UiDevice.getInstance().removeWatcher("phone");
        back.clickAndWaitForNewWindow();

        //UiDevice类的操作不会触发UiWatch
        //按菜单键不会触发
    }
}

你可能感兴趣的:(Java+Uiautomator自动化测试 -- 11.UiWatcher监听器学习)