【问题标题】:how to detect a screen change via adb in android如何通过android中的adb检测屏幕变化
【发布时间】:2016-05-03 10:35:27
【问题描述】:

我正在寻找一种方法来检测屏幕是否从以前的屏幕发生变化.. 我的意思是:我有一个充满按钮的“屏幕 A” - 我正在尝试按下所有按钮,但只有其中一个会将我带到“屏幕 B”..

我正在寻找一种可以循环遍历所有按钮并在到达“屏幕 B”后中断的方法 - 通过 adb

我尝试从前一个屏幕查看uiautomator dump,并在每次单击按钮后获取“新”屏幕的 UI 层次结构并进行比较 - 但结果并不成功。

有什么想法吗? 谢谢

【问题讨论】:

  • 你成功了吗?我会编辑我的答案以包含更多细节,但我不熟悉 Python!

标签: android python adb android-uiautomator fullscreenchange


【解决方案1】:

比较层次转储的想法比比较屏幕截图要好得多:转储只是文本数据(~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

【讨论】:

    【解决方案2】:

    我假设您已经涵盖了 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 屏幕截图将具有完全相同的文件大小,除非右上角的时钟更新或其他通知滚动。如果两个窗口的屏幕截图之间存在较大的大小差异,您可以使用简单的大于/小于 if 语句来确定。

    希望这会有所帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      相关资源
      最近更新 更多