问题背景
参考开源库 DreamMultiDevices 来实现安卓设备的自动授权安装apk
实现思路,一台PC机链接多个安卓设备,每个设备启动一个进程,
apk安装场景,每个进程启动两个线程,一个负责adb install,一个负责监控判断是否存在安装授权界面,如果有,则自动点击授权,目前问题点,出在 MultiAdb.py 中的 InputEvent 函数操作(本bug涉及的代码,不在 DreamMultiDevices 库里,但关键代码语句,已贴在下文)
问题概述
安卓apk安装授权UI存在但poco无法判断其存在,不知道为啥?
核心代码语句(对应UI树信息可参考 “附:airtestIDE获取的 UI 树结构”)
pc1 = pocoAndroid("android.widget.FrameLayout").child("android.widget.LinearLayout").child(
"android:id/content").child("vivo:id/vivo_adb_install_buttons_panel").child(
"vivo:id/vivo_adb_install_ok_button")
if pc1.exists():
pc1.click()
实际调试发现,不会触发到 pc1.click() 代码行。
日志信息提示无法找到节点
oops! Cannot find any visible node by query UIObjectProxy of "android.widget.FrameLayout/android.widget.LinearLayout"
问题分析
通过调试发现,
poco('a')、poco('b')、poco('c')都能找到,但是poco('a').offspring('b').offspring('c')找不到。
(也试过offspring改成 child一样找不到,代码中有给到足够时间、和次数,轮询20次、每次sleep(1))
下面是具体调试过程记录
pycharm 单步调试也能获取到目标节点的父节点
目标节点
type : android.widget.Button
name : vivo:id/vivo_adb_install_ok_button
text : 安装
获取父节点调试代码
# 先通过 freeze 方式判断目标节点是否存在,如果存在,则继续exists click等操作,反之继续下一轮循环。方案来自群友 m-广州
with pocoAndroid.freeze() as fz_poco:
pc0 = fz_poco("vivo:id/vivo_adb_install_ok_button")
if pc0.exists():
obj = pc0.parent()
for _ in range(10): # 这里的 10 ,如果能依据 pc0 的 UI 层级深度的属性获取就好
try:
print(f'从目标节点开始打印其父节点 {obj.attr("name")}')
obj = obj.parent()
except:
break
上述调试代码,输出的父节点信息,符合 airtestIDE 获取到的 UI 树结构
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 321 从目标节点开始打印其父节点 vivo:id/vivo_adb_install_buttons_panel
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 321 从目标节点开始打印其父节点 android.widget.RelativeLayout
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 321 从目标节点开始打印其父节点 android:id/content
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 321 从目标节点开始打印其父节点 android.widget.LinearLayout
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 321 从目标节点开始打印其父节点 android.widget.FrameLayout
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 336 UI节点分开检查 android.widget.FrameLayout
2019-06-01 15:57:16 Module: MultiAdb, Function: InputEvent, Line: 342 oops! Cannot find any visible node by query UIObjectProxy of "android.widget.FrameLayout/android.widget.LinearLayout"
2019-06-01 15:57:17 Module: MultiAdb, Function: InputEvent, Line: 307 6SS4NNZHUSMFNRGM apk安装权限确认,循环第4次
附:airtestIDE获取的 UI 树结构
环境信息
windows 7 64位 专业版 Service Package 1,16GB内存
vivo x6d手机,android 5.1,vivo ROM: Funtouch OS_2.5
airtestIDE: AirtestIDE_v1.2.1_2019-04-16_py3_win64_20190509161900