我正在寻找一种方法来检测屏幕是否从以前的屏幕发生变化。我的意思是:我的“屏幕 A”有很多按钮 - 我正在尝试按下所有按钮,但只有其中一个会带我到“屏幕B”..
我正在寻找一种方法,可以循环遍历所有按钮并在到达“屏幕 B”后中断 - 通过 adb
我尝试uiautomator dump
从前一个屏幕查看,每次单击按钮后,获取“新”屏幕的 UI 层次结构并进行比较 - 但结果并不成功。
有任何想法吗?谢谢
我正在寻找一种方法来检测屏幕是否从以前的屏幕发生变化。我的意思是:我的“屏幕 A”有很多按钮 - 我正在尝试按下所有按钮,但只有其中一个会带我到“屏幕B”..
我正在寻找一种方法,可以循环遍历所有按钮并在到达“屏幕 B”后中断 - 通过 adb
我尝试uiautomator dump
从前一个屏幕查看,每次单击按钮后,获取“新”屏幕的 UI 层次结构并进行比较 - 但结果并不成功。
有任何想法吗?谢谢
我假设您已经拥有了涵盖的adb
命令。input tap X Y
我建议screencap
在 之前和之后拉 1 秒,input tap
然后比较屏幕截图以查看屏幕是否发生了变化。screencap 的代码将如下所示:
adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png
有几种方法可以比较图像。由于您使用的是 Python,因此您可以轻松比较图像内的像素,但我会使用的另一种方法是比较两个图像的确切文件大小,同一屏幕的 .jpg 屏幕截图将具有完全相同的文件大小,除非右上角的时钟更新或其他通知滚动。如果两个窗口的屏幕截图之间存在较大的大小差异,您可以使用简单的大于/小于 if 语句来确定。
希望这可以帮助,
比较层次转储的想法比比较屏幕截图要好得多:转储只是文本数据(~10KB 而不是~100KB),并且可以比较它们而不会在比较图像时出现不准确性。这意味着您可以准确地看到 UI 层次结构中是否发生了某些变化。
它对您不起作用的原因可能是转储包含一些特定时间的数据。例如,状态栏中的当前时间。所以,这里的解决方案是删除所有文本数据,例如使用这个函数
def normalize(hierarchy):
return re.sub(r'text=".*"', 'text=""', hierarchy)
还可以考虑使用这个uiautomator Python wrapper,有一个device.dump()
方法,它会将层次结构转储作为字符串返回。然后整个代码将如下所示:
# go to screen B
hierarchy_b = normalize(device.dump())
# go back to the screen A and press all buttons in a loop
hierarchy = normalize(device.dump())
is_screen_b = hierarchy == hierarchy_b