如何通过android中的adb检测屏幕更改

时间:2016-01-26 18:23:28

标签: android python adb uiautomator fullscreenchange

我正在寻找一种方法来检测屏幕是否从之前的屏幕改变了.. 我的意思是:我有一个带有按钮的“屏幕A” - 我试图按下所有按钮,但只有其中一个会带我去“屏幕B”..

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

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

有什么想法吗? 感谢

2 个答案:

答案 0 :(得分:1)

我假设您已经为adb提供了input tap X Y个命令。

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

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

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

希望这有帮助,

答案 1 :(得分:0)

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