android 自动化测试检测弹窗或蒙层

背景

弹窗的分为系统级别的弹窗和应用内的。
系统弹窗 一般有几种,ANR的弹窗,APP crash的弹窗,各种权限弹窗。用户弹窗比较多的是dialog,或者是fragment dialog,最麻烦的就是各种新手引导,新手引导一般是半透明的,图像匹配和处理都有点麻烦。

分析

adb shell 检测弹窗或者蒙层,考虑这个问题有两种思路

蒙层

考虑从View Hierarchy,需要分析

dumpsys activity top

View Hierarchy的日志中,越往下,就是越顶层。

i,蒙层的显示与关闭就一个一个visibile和gone的区别 :(

举个例子

org.yeshen.test.RelativeLayout{330c237 V.E...C. ... 0,0-1080,1776 #240f05a4 org.yeshen.test.main:id/tip_container}
  org.yeshen.test.View{479a3a4 V.ED.... ... 540,888-540,888 #240f05a5 org.yeshen.test.main:id/text}
  org.yeshen.test.ImageView{c7ed50d V.ED.... ... 216,512-864,1007 #240f05a6 org.yeshen.test.main:id/image1}
  org.yeshen.test.ImageView{bf8dcc2 V.ED..C. ... 240,1104-840,1236 #240f05a7 org.yeshen.test.main:id/image2}
org.yeshen.test.RelativeLayout{330c237 G.E...C. ... 0,0-1080,1776 #240f05a4 org.yeshen.test.main:id/tip_container}
  org.yeshen.test.View{479a3a4 V.ED.... ... 540,888-540,888 #240f05a5 org.yeshen.test.main:id/text}
  org.yeshen.test.ImageView{c7ed50d V.ED.... ... 216,512-864,1007 #240f05a6 org.yeshen.test.main:id/image1}
  org.yeshen.test.ImageView{bf8dcc2 V.ED..C. ... 240,1104-840,1236 #240f05a7 org.yeshen.test.main:id/image2}

ii,通过检测有没有对应的控件挂载,这个通过diff就可以看得出来

弹窗

dumpsys window $(activityName)
dumpsys SurfaceFlinger

i,有弹窗的话,必然会增加window,在WindowManagerService中必然有备案

dumpsys window 在我的测试中是最有效的,一般一个activity中有子弹窗

如果是权限弹窗(permission)的话,需要检测permission的的packageIntall的window。当然各种系统的弹窗都可以抓。

ii,surfaceflinger渲染过程中必然会增加一层或多层layer

dumpsys SurfaceFlinger 可以抓叠加层,如果是系统级别的crash的话,那么layer上可以看出变化

Activity 当作弹窗

这个是蛮蛋疼的一种实现,目的应该是为了随时随地弹窗。
那么简单点,就是检查下最顶层的activity是什么,back一下就可以了。

adb shell dumpsys activity top | grep pid 

d.back()

检测的方法

i,每个tap,click执行前都注入一下检查,提供callback
ii,提供关注关键词的方法,让开发者在某个页面关注某个view,或者某个window的叠加
iii,在gui部分提供更便利的检测方法,分析这些dumpsys出来的东西有点工作量的

实现

# count is 0 : May be covered by a system error pop-up
# count is 1 : normal
# count is 2 : if package is None or this a ...
def top_window_count(self, filters=None):
    filters = filters if filters is not None else self.package
    windows_str, summary, = adb.dumpsys_window(serial=self.serial,
                                               port=self.port,
                                               filters=filters).split("\n\n")
    windows = windows_str.split("  Window #")
    found = re.compile(r'mFocusedApp=AppWindowToken{(?P<token>[^/\s]+)').search(summary)
    count = 0
    if found:
        token = "mRootToken=AppWindowToken{%s" % found.group('token')
        for w in windows:
            if token in w:
                count += 1
    return count
def __check_id_exists(self, identity=None):
    # org.yeshen.CustomView{a434138 V.E...C. ... 0,0-1080,1776 #240f05a4 org.yeshen:id/tip_container}
    top = adb.dumpsys_top_activity(serial=self.serial, port=self.port).split("\n")
    match = ":id/%s" % identity
    for s in top:
        if match in s:
            return " V." in s
    return False

https://github.com/wuyisheng/ATX

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值