我在我的python脚本中运行uiautomator时出现问题(类似的shell脚本运行正常)。为方便起见,我使用以下方法:
import subprocess
def host_exec(cmd):
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out= p.communicate()
return out
然后我使用
的组合 host_exec("path_to_adb shell uiautomator dump /sdcard/dump.xml")
host_exec("path_to_adb pull /sdcard/dump.xml ./dump.xml")
--read file here--
host_exec("path_to_adb shell rm /sdcard/dump.xml")
host_exec("rm ./dump.xml")
我经常使用它,并且前1-2次运行通常有效,之后它似乎偶尔在第1行失败(创建dump.xml)给出错误代码
ERROR: null root node returned by UiTestAutomationBridge.
我查看了UiTestAutomationBridge.java (http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/accessibilityservice/UiTestAutomationBridge.java) 在我看来,原因是开发者在第65行放置的超时,有时是足够的,有时不足以使桥形成正确。 (如果我错了,请纠正我。
真正让我感到困惑的是,我已经使用了相同的代码了将近一个星期,而且我今天早上第一次遇到错误,现在几乎每次都会发生错误。我已经检查过以确保在读取文件后关闭文件,我在转储和复制新文件之前删除了文件,并且我在每个命令之前和之后都尝试过time.sleep(10),但仍然没有去。我已经过了很长一段时间'命令行命令我的shell脚本还没有一次失败,整个过程大约需要2秒,所以10秒应该足以让任何陷入困境的东西都被整理出来。
答案 0 :(得分:0)
我在调试https://github.com/xiaocong/uiautomator时遇到了几乎相同的问题。 我不知道为什么在我开始并杀死uiautomator一段时间之后我总是异常,甚至重启设备无法解决它。
我尝试解决此问题的唯一方法是在设置中恢复出厂设置。
答案 1 :(得分:0)
这个问题经常出现在加载对话框之间(可能是因为“应用程序停止响应'对话框出现”)。其他需要注意的是could not get idle state
和closed
。
这些都表明手机上有一些非理想的ui状态,通常只能通过非直观的方法解决。也许快速更新的textView阻止ui锁定1000ms的空闲状态,你必须杀死应用程序或点击你知道导航向上箭头的位置,而不是这次显式引用xml转储。
无论哪种方式,它都要求你退后一步思考。我可以告诉你,通常空根节点在活动加载时自行解析,所以你只需要输入一个while循环直到满足一些条件(因为它最终是相当可靠的)。正如我建议的那样,这个条件是输出字符串以UI hierchary dumped to:
类似地,xml并不总是完美的,可能缺少等号或引号或括号,但同样的原则同样适用。采取新的转储,你很好。