自动化工具 想请教一下目前的自己的 App UI 自动化平台比如 monkey 自动化里面都是怎么处理应用安装弹窗和登录问题的,都是通过前置脚本去处理的吗?有没有什么办法是可以直接安装的?

TD · 2022年03月14日 · 最后由 哲豪 回复于 2022年03月23日 · 4148 次阅读

目前要做一个 monkey 和自动化遍历的平台,想了解一下大家都是怎么实现的,有没有方案参考一下呢?

共收到 30 条回复 时间 点赞

OV 手机应该都是需要安装密码的,这种只能通过监控弹窗的方式去自动点击继续安装

TD #7 · 2022年03月15日 Author

是的,我们之前的做法也是监控有弹窗了就遍历判断是什么情况,需要输入密码还得固定密码,感觉这样执行时间会比较长,所以想问下有没有更好的办法?

TD #8 · 2022年03月15日 Author
Time 回复

我们之前就是类似这样的,我用 airtest 的写了一个,想问下还有没有其他办法?

这个本来就是 OV 手机的安全特性,虽然感觉没啥用,不可能避开,不然的话相当于破解了手机这块的安全问题

TD 回复

你用 airtest 怎么写的呢?不同的手机的控件属性好像都不大一样,楼主有啥好的思路吗?

TD #2 · 2022年03月16日 Author

因为看 testin 里面也有 ov 的手机,如果他们也是这样脚本监听的话,算应用的的安装耗时啥的也不准确吧?所以比较好奇他们是怎么做到的

你需要一个自动化测试框架,如 Appium 来处理登录的问题,不过不可能支持所有的应用, 要针对特定的应用来写登录脚本。然后借助于字节的 fastbot_android 来实现自动化测试,就可以了!

TD #4 · 2022年03月16日 Author
Dirty不加冰 回复

和上面提到的帖子差不多就是 uiautomator2 换成 airtest 的 Python 脚本,airtest 可以文字点击的比如,poco(text="继续安装").click() ,就是遍历判断有就点击这样

TD 回复

我希望能把它另起一个进程进行持续监听,不影响脚本的正常流程,这样也能方便处理应用内部随时冒出来的权限申请的弹窗,但是没搞成功,楼主对这种情况有涉及么

对于 ov 的安装弹窗,目前貌似除了用自动化脚本针对性去点掉外,没啥特别好的办法,除非能搞到内部版系统之类的。不过这个只是安装时用到,而且相对比较通用,写一个性价比还可以。

至于登录,我们是复用 UI 自动化里的登录用例的,不过在原来登录基础上加上了多账号管理机制,多设备同时跑的时候,会额外传一个机器序号的字段(比如跑 2 台机器,1 台传 1,另一台传 2),避免账号互踢导致实际并没有登录。登录完再开始跑遍历程序(可以理解为是前置脚本)。

而针对内部随时冒出来的权限弹窗,这个应该要在遍历程序内处理的,这个是自动遍历类工具的标配吧。

TD #14 · 2022年03月17日 Author
陈恒捷 回复

我之前想的也是这样,大神讲解一下放心了。

TD #15 · 2022年03月17日 Author
Dirty不加冰 回复

我们没有持续监听,也是在安装的时候判断的,如果是普通的 UI 自动化也是在脚本里面处理意外弹窗的,可以封装一下比如点击的方法这样或者异常的时候在失败重试里面判断一下。

以前做过一个 ov 安装免输密码的 apk,需提前安装到手机上,当时仅是为了避免安装时需要密码,但依然需要点击安装 ,所以后续更换了其他。
实现思路:当时采用 com.qihoo.appstore 这个做为包名,(好像这个包名在白名单)通过这个包去拉起安装 apk,不需要输入密码。前段时间看到的岩鼠的 ov 安装好像也是类似的方法,通过他们的 IRMA 管家来拉起安装的。

哲豪 回复

后来安装时采用 uiautomator runtest 的方式去处理安装前的解锁、弹窗处理、输入密码和点击安装,但后续发现在 SDK30 以上 已经不支持这种方式了,又修改为 app_process 的方式运行。这种方式打包后是个 apk 但不需要安装,没有前置条件,只需要 push 到/data/local/tmp 后运行即可。目前使用在公司的云真机平台。
有 demo 可以试试。github

TD #16 · 2022年03月18日 Author
哲豪 回复

那一般 App 都是开发的,我们也没代码权限也重新打包不了,能对 apk 做处理的吗?类似重签名这样的。

通过 adb install 安装的时候这个阶段,做一个接口,把手机型号,品牌 请求到服务端,然后会根据这个接口返回相应的控件信息,前提服务端做好对应机型的数据,如果类似 0/V 点击不到确定按钮,可以通过旁边的控件 ID 对应的最表去点击。通过请求回来的控件信息,直接通过 appium 去点击,这样的方式,目前任意的品牌型号手机都没有问题。并且可以大批量的手机进行测试。

TD 回复

不是哦,我说的第一种方式是有开发打包好一个专门用于拉起 apk 安装的包,然后你去调用 比如通过 am start 命令将需要安装 apk 路径传给它。
你可以看看我的第二种方式,这种方式 没有任何依赖(包括 appium)只需要一个 adb 环境 。

TD #19 · 2022年03月21日 Author
哲豪 回复


你的第二种方式是这样吧,不是说打包后是个 apk 吗?我看了一下 demo 里面的代码有处理弹窗的逻辑,如果是普通的其他 apk 我不明白要怎么做就可以用 adb 环境直接安装了?麻烦具体举例说一下哈,谢谢了~

哲豪 回复

这个是个新思路,可以开个帖子详细说下?

陈恒捷 回复

可以的,我得好好整理下 毕竟文采一般 😂

TD 回复

是的,demo 编译打包后是个 apk
执行adb push uiwatcher.apk /data/local/tmp 到手机里
后执行 adb shell 'export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher' 运行即可(后置参数可以看 demo 介绍)
然后你在通过 adb install 命令安装其他 apk 时 会自动检测进行点击、输入等操作。

TD #25 · 2022年03月22日 Author
哲豪 回复


这样正常吗?直接启动就提示 killed 了?试了没有效果呢

TD 回复

找到问题了。ActivityThread.systemMain().getSystemContext() 之前在测试拿到 context,现在看来还有手机不兼容😂 已经注释修复了。

TD #21 · 2022年03月22日 Author
哲豪 回复

可以了,谢谢啦。有个小插曲:第一次输错密码了然后一直 find 确定直接给手机锁住了,哈哈,这个相同的动作能不能不超过三次这样的。

TD 回复

😂 首先抱歉让你的帐号锁住了。。。 正常密码错误后应该会清空输入框的,是否是在程序未停止下进行了手动输入。之前考虑过用 toast 监测密码错误弹窗然后停止程序,但还没加上,如果你觉得这方案可行我后面可以更新。或者你有更好的建议也可以提,“相同操作不能超过三次” 这个可以考虑 但如果 需要安装多个 apk 时,可能会出现不点的情况。

TD #27 · 2022年03月22日 Author
哲豪 回复

嗯嗯,确实,可以再想想,如果服务停了后面的 apk 安装应该也不能操作了吧,你们是把这个命令 adb shell 'export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher' 一直启着的吗,-t 时间调的很长。还是说需要执行安装命令的时候启动一下?

TD 回复

只在需要安装前启动,结束后会杀掉进程或者时间短的可以等它自己结束

TD #29 · 2022年03月23日 Author
哲豪 回复

好的,我还有一个问题弱弱的问一下,这个命令 adb shell 'export CLASSPATH=/data/local/tmp/uiwatcher.apk; app_process /system/bin com.tinypace.uiwathcer.UiWatcher'在 Windows 上执行会提示 not found,这要怎么解决呢?我们有些执行机是 Windows 上的。

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