自动化工具 自动化的坑:adb install 时如何处理可恶的风险管控弹窗或者未知来源应用弹窗!

TangSir61 · 2021年08月12日 · 最后由 哲豪 回复于 2021年08月19日 · 7368 次阅读

各位在自动化通过 adb install 或者 pm install 的时候,有没有遇到过华为或者小米或者一加手机的各种安装弹窗呢,除了手动设置,该如何解决呢?

目前自动化主流框架,python uiautomator2 或者 appuim 等在执行测试的时候会自动给手机安装 atx 或者 appuim 引擎,但是如果不手动的点击允许,那么会导致测试失败,这种情况改如果处理呢?

下面提供一种多线程的解决方案,亲测可行
1 个线程执行安装命令,另一个线程通过 dump ui 的方式获取 xml 文件,在通过解析 xml 文件的节点,获取文本,然后遍历 xml,如果存在弹窗,通过 adb 点击坐标点处理掉弹窗上的文本即可

th1 = threading.Thread(target=install_app, args=(id, apk_path))
th2 = threading.Thread(target=click_pop_window_by_xml, args=(id, '继续安装'))

th1.start()
th2.start()
th1.join()
th2.join()
def click_pop_window_by_xml(id, expect_text):
    # ------------------------
    # 由于处理系统安装弹窗,由于ATX UI架构会安装两个apk
    # 安装apk的时候会自动弹窗,所以提前通过adb处理掉
    # ------------------------
    print('开始处理弹窗',threading.current_thread().getName())
    nodes = parse_page_xml(id)
    if nodes is None:
        return
        raise XPathElementNotFoundError("get xml file error")
    for node in nodes:
        actual_text = node.getAttribute('text').encode('utf-8').decode('utf-8')
        x, y = get_node_bounds(node)
        if expect_text == actual_text:
            print('处理弹窗', actual_text)
            click_by_adb(id, x, y)
            break
共收到 26 条回复 时间 点赞

能举个栗子吗?

那就不用这类手机, 手机体验太糟糕, 垃圾手机装软件还要验证码, 说得好像它很安全一样. 我之前都是拿一加手机和 Pixel、三星、诺基亚这一类测的,随便开 adb 调试

做适配那逃不过,做功能建议跳过这些手机

adb install -g

开发者选项中设置一下就行了,比如华为手机:关闭监控 ADB 安装应用即可

-g 只适用于高版本的,其次如果遇到 VIVO 和 OPPO 手机 安装时需要输入密码,咋办。
目前我们是通过 app_process 运行 uiautomator,这种可以很好的解决,同时只需要 push 到手机就行。

其实我想知道,大厂怎么做的
他们一跑几百台,小米 OPPO VIVO 肯定逃不过,不知他
们怎么做的

秦岭 回复

大厂财大气粗,有充足的资源来自己改造一台手机,然后实施上百台手机跑自动化
来自某大厂的沙龙分享
https://testerhome.com/topics/30789

试试开发者模式设置
允许 USB 调试修改权限或模拟点击,或者"禁止权限监控"

我有个取巧之法,需要输入密码的手机,只要安装过的 app 没卸载,再次安装不需要输密码,只需要点 “继续安装”。。。

杰斯·李 回复

好吧
谢谢

最近我在做一款,,可以完美解决这种问题

Eason 回复

可以一起分享一下

bluepang2016 回复

有些手机是不行的,比如一加

可以试试 我这个。 不需要安装应用到手机,目前应该可以支持大部分手机。
链接: https://pan.baidu.com/s/1S1kgxmxbDdYKHbNKlUxvzQ 提取码: ndd6
先 push 到手机,执行 adb push xxx.apk /data/local/tmp
然后执行 adb shell 'export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher' -t 100000 -p xxxx
t 为超时时间 ms,p 为需要输入的密码

Yu 回复

关键是领导不让啊,哈哈

哲豪 回复

请教 uiwatcher.apk 只需要 push 到/data/local/tmp 就可以么?不需要安装么?

哲豪 回复

我按照你说的操作步骤,显示如下
adb shell 'export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher' -t 1000000 -p zby123456
/system/bin/sh: export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher: not found

TangSir61 回复

不需要安装,push 到手机就行

TangSir61 回复

我试下,有可能是 打 release 包的问题

TangSir61 回复

已修改,可以再试下

TangSir61 回复

下载的新包,试过有问题吗😄

TangSir61 回复

可以用 subprocess 执行 adb install,然后通过 uiautomator2 做后续的操作

哲豪 回复

apk 有源码吗?

干饭狂人 回复

源码暂时不公开,目前写的还很烂。。。大概 思路:主要通过反射方式实现,比如连接 uiautomator

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