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

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

缘由

最近为了兼容 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 #20 · 2017年05月05日 Author

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

bauul #21 · 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
匿名 #28 · 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 的弹窗可以用什么方法处理呢

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

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

bauul 回复

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

Tina 回复

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

bauul 回复


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

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 回复

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

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