缘由

最近为了兼容 android 端的 toast 消息验证,切到了 ui2.0,但是 ui2.0 没有弹窗自动点掉的实现

查看 uiautomator2-server 的源码并增加自动点掉弹窗的实现


public class AndroidServer {
    private final int driverPort;
    private final HttpServer webServer;

    public AndroidServer(int port) {
        driverPort = port;
        webServer = new HttpServer(driverPort);
        init();
        errorHandle();
        Logger.info("AndroidServer created on port " + port);
    }
    ……


public void errorHandle() {
        getUiDevice().registerWatcher("installAPP", new UiWatcher() {
            @Override
            public boolean checkForCondition() {
                /**meizu **/
                //Logger.info("安装应用时,检查弹窗并点击允许");
                if (getUiDevice().hasObject(By.pkg(Pattern.compile("android")).text(Pattern.compile("允许")))) {
                    Logger.info("find the button: By.pkg(Pattern.compile(\"android\")).text(Pattern.compile(\"允许\")), click it");
                    getUiDevice().findObject(By.pkg(Pattern.compile("android")).text(Pattern.compile("允许"))).click();
                }
                return false; // no trigger);
            }
        });

        new Thread(new Runnable() {

            @Override
            public void run() {
                while(true) {
                    getUiDevice().runWatchers();
                    getUiDevice().waitForIdle(2000);//避免第一次runWatchers还没有完成,立即运行了第二次
                }
            }
        }).start();

    }

增加调用

法一:在起 server 时即调用该方法
法二:在创建 session 时调用该方法
因为现在 session 是单例的,所以这两个没什么区别,我选择的是第一个

没有解决的问题

因为 ui2.0 server 本身是 apk,存在安装时弹窗验证的问题,所以不能解决安装这两个 server apk 时的弹窗验证问题


↙↙↙阅读原文可查看相关链接,并与作者交流