Appium Ui2.0 弹窗问题更新源码并测试通过

bauul · 2017年05月04日 · 最后由 snowLiang 回复于 2019年07月16日 · 2377 次阅读

缘由

最近为了兼容 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 时的弹窗验证问题

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 26 条回复 时间 点赞

adb shell settings put global package_verifier_enable 0

这个不错,但是我的意思解决一系列的弹窗问题

bauul #27 · 2017年05月08日 Author

HI, 请教一个问题,这个命令是不是需要 ROOT 才可以啊,我这儿一台 MEIZU 的 android 6.0 的手机执行并没有效果

原生 AOSP 不需要
国内魔改系统就难说了

bauul #23 · 2017年05月08日 Author

嗯,我找了一台原生的 android 手机,上面的 “通过 USB 验证应用” 菜单是可以设置开启或关闭的,但是更多的是不能设置的手机,针对不能设置的手机,本方法应该是一个思路。

uiautomator2.0 作为 apk,安装起来肯定也受限于安卓系统的安全管理策略
如果有方法可以跳过这个,那岂不是一个很大的漏洞
所以每个魔改系统都有自己的策略,想要一招搞定所有系统,难

另外,如果实在不想 root,可以用障碍辅助服务
比如每个手机预先安装类似酷市场的酷安装,然后去障碍辅助里开启

bauul #25 · 2017年05月08日 Author

辅助服务功能和 ui2.0 没有冲突吗,印象中 uiautomator 测试应用起来后,accessbility service 就不能再工作了。
@Lihuazhang @chenhengjie123 @seveniruby
是这样吧?

bauul 回复

好久没搞这个了,不大清楚。

bauul 修改 appium 源码以修改启动 ui2.0 server 的顺序 中提及了此贴 07月12日 16:09
匿名 #20 · 2017年07月12日

弱弱的问下,怎么样切换到 UI2.0 呢?

bauul #19 · 2017年07月12日 Author

搜索一下本站,appium uiautomator2

bauul Appium 中没有 UiWatcher,有可以代替的么? 中提及了此贴 10月10日 22:24

“因为 ui2.0 server 本身是 apk,存在安装时弹窗验证的问题,所以不能解决安装这两个 server apk 时的弹窗验证问题” ui2.0 的两个 server APK 的弹窗可以用什么方法处理呢

Tina 回复

如果手机支持 adb install -g 命令的话,是可以通过-g 参数安装 APP 的,在安装的时候就不会有弹窗了,
如果手机不支持-g 参数,那么就没什么好方法了,
另一个角度来看呢,这两个 APK 是不经常更新的,所以偶尔手动点一下也还好啦

bauul 回复

我每次运行,启动 APP 时都会重新安装那两个 server

Tina 回复

照理说不会的,不过具体的也要 debug 下代码才知道原因,另外一种方法 就是修改 appium 的源码了

bauul 回复


是的,我在官网上看是这个文档,server 的版本是 12.0,看不出来怎么修改

bauul #12 · 2018年06月22日 Author
Tina 回复

我好久没碰这块儿了,你可以单独发个帖子来问一下的

bauul 回复

嗯,好的,谢谢

baxia 修改 Bootstrap 源码,添加自定义监听代码实现 中提及了此贴 06月22日 14:51

麻烦问一下 errorHandle 这个 方法,是写在哪里的呢?跟 AndroidServer 在一个类里面吗?我写了总是报错

bauul #12 · 2019年07月11日 Author
snowLiang 回复
import static com.x.x.appium.utils.Device.getUiDevice;
bauul 回复

我写了呀~errorHandle 这个方法是写在 app/src/main/java/io/appium/uiautomator2/server/AndroidServer.java 里面的嘛?

bauul #14 · 2019年07月11日 Author
snowLiang 回复

是的啊

bauul 回复

还需要引入其他的什么包嘛 我的好多报错~或者楼主能不能把你的这个文件贴一下呀 😉

snowLiang 回复

没有原代码咯,这是原单位写的,没带走

bauul 回复

可以再问一下,UiWatcher 是引入的那个包里面的嘛,我这边一直报错,😂

snowLiang 回复

不记得啦,你到那个包目录中找找吧

bauul 回复

找不到诶~不然就不问你啦 😂

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册