android 如何通过 adb 检测屏幕变化

how to detect a screen change via adb in android

我正在寻找一种方法来检测屏幕是否与之前的屏幕发生了变化.. 我的意思是:我有 "Screen A" 满是按钮 - 我试图按下所有按钮,但只有其中 1 个会带我到 "Screen B"..

我正在寻找一种可以遍历所有按钮并在到达 "Screen B" 后中断的方法 - 通过 adb

我尝试从上一个屏幕查看 uiautomator dump 并在每次单击按钮后获取 "new" 屏幕的 UI 层次结构并进行比较 - 但结果不成功.

有什么想法吗? 谢谢

我假设您已经涵盖了 input tap X Yadb 命令。

我建议在 input tap 前后拉动 screencap 1 秒,然后比较屏幕截图以查看屏幕是否发生变化。 screencap 的代码如下所示:

adb shell screencap -p /sdcard/screen.png
adb pull /sdcard/screen.png
adb shell rm /sdcard/screen.png

有几种方法可以比较图像。由于您使用的是 Python,因此您可以轻松比较图像内部的像素,但我会使用的另一种方法是比较两幅图像的确切文件大小,同一屏幕的 .jpg 屏幕截图将具有完全相同的文件大小,除非右上角的时钟更新或其他通知滚动。如果两个屏幕截图之间存在重大差异 windows,您可以使用简单的 greater-than/less-than if 语句来确定。

希望这对您有所帮助,

比较 层次转储 的想法比比较屏幕截图要好得多:转储只是文本数据(~10KB 而不是~100KB)并且可以比较它们而不会出现不准确当你比较图像时。这意味着您可以准确地看到 UI 层次结构中是否发生了某些变化。

它对您不起作用的原因可能是转储包含一些特定于时间的数据。例如,状态栏中的当前时间。因此,这里的解决方案是删除所有文本数据,例如使用这个函数

    def normalize(hierarchy):
        return re.sub(r'text=".*"', 'text=""', hierarchy)

还可以考虑使用此 uiautomator Python wrapper,还有 device.dump() 方法,它将 return 您的层次结构转储为字符串。那么整个代码将如下所示:

# 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