UiAutomator 安卓弹窗处理,弹窗如何检测? 急急急,,,,,

sunny0330 · 2019年12月18日 · 2679 次阅读

目标:自动化脚本不需要维护,未来出现新的弹窗、文本,也可适配
问题:
技术点 1:弹窗检测 --- 如何检测弹窗?求给意见,尽量详细;
技术点 2:弹窗处理 --- 如何做到不维护,新的弹窗也可以处理,穷举法感觉太笨重了???
技术点 3:隐藏技术点,启动手机所有应用;

下面是我当前整理的一些有的方法,希望和大家一起讨论:

当前看到了这种方式:adb shell dumpsys window,https://testerhome.com/topics/11136
问题是:哪里表达了当前应用中出现了弹窗??-请指点,

adb shell dumpsys window | grep " Window #"

 Window #0 Window{5ed78e1 u0 PointerLocation - display 0}:
  Window #1 Window{5f94251 u0 Framework_SearchPanel}:
  Window #2 Window{5f5a609 u0 NavigationBar0}:
  Window #3 Window{5f89729 u0 android}:
  Window #4 Window{5f5a651 u0 StatusBar}:
  Window #5 Window{5f89609 u0 AssistPreviewPanel}:
  Window #6 Window{5ece209 u0 DockedStackDivider}:
  Window #7 Window{6052371 u0 com.sankuai.meituan/com.sankuai.meituan.activity.P
reloadedWelcome}:
  Window #8 Window{6046f29 u0 com.sankuai.meituan/com.sankuai.meituan.activity.P
reloadedWelcome}:
  Window #9 Window{600bd29 u0 com.huawei.intelligent.Workspace}:
  Window #10 Window{5f896e1 u0 com.huawei.android.launcher/com.huawei.android.la
uncher.unihome.UniHomeLauncher}:
  Window #11 Window{5f94209 u0 com.sina.weibo/com.sina.weibo.SplashActivity}:
  Window #12 Window{5ed79b9 u0 com.baidu.searchbox/com.baidu.searchbox.MainActiv
ity}:
  Window #13 Window{600bd71 u0 com.huawei.camera/com.huawei.camera}:
  Window #14 Window{5fbf8e1 u0 com.huawei.wallet/com.huawei.wallet.ui.setting.In
troductionActivity}:
  Window #15 Window{6054bb9 u0 com.android.mms/com.android.mms.ui.ConversationLi
st}:
  Window #16 Window{600bc09 u0 com.android.gallery3d/com.huawei.gallery.app.Gall
eryMain}:
  Window #17 Window{5f4efb9 u0 com.android.settings/com.android.settings.HWSetti
ngs}:
  Window #18 Window{5e6d4e1 u0 com.android.systemui.HwImageWallpaper}:

弹窗处理:
1、代码受公司管控,就不发出来了,网上也有很多; 目前最简单快捷的方法是 Python+uiautomator,但是这个方法,效率较低,整个遍历:50+APK,执行时间在 50+min,在实际自动化测试中有点难以接受,目标: 时间控制在 15min 以内;
2、adb shell uiautomator dump 会生成当前页面的 xml,可以通过解析 xml 拿到点击框的中心坐标,进行点击;大家可以试试,当前页面哦,这个是首次进入美团的界面:协议确认

<node index="0" text="退出" resource-id="" class="android.widget.TextView" package="com.sina.weibo" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[90,1503][539,1635]"/>
<node index="1" text="" resource-id="" class="android.widget.TextView" package="com.sina.weibo" content-desc="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[539,1503][541,1635]"/>
<node index="2" text="确定" resource-id="" class="android.widget.TextView" package="com.sina.weibo" content-desc="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" scrollable="false" long-clickable="false" password="false" selected="false" bounds="[541,1503][990,1635]"/>

根据上面的 bounds 的中心点 (x1+x2)/2,(y1+y2)/2,进行点击,但是整个过程也是很慢,流程上就决定了: APP 启动 - 弹窗多个 - 循环体(生成 xml-解析 xml-定位)- 点击 - 退出应用 - 启动下一个应用,在效率上需要持续优化,但是这种方法其实对新的 APK,未出现过得弹窗也是一种可行的思路,如果对时间要求不高的话!

apk 启动
launcher.db, itemtype=0,筛选出有桌面图标 APK 和启动类 activity,一个个启动即可,稳定,高效

共收到 0 条回复 时间 点赞
sunny0330 关闭了讨论 12月18日 20:56
sunny0330 重新开启了讨论 12月18日 20:56
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册