Как обнаружить изменение экрана через ADB в Android

Я ищу способ определить, изменился ли экран с предыдущего экрана.. Я имею в виду: у меня есть "Экран A" с полными кнопками - я пытаюсь нажать все из них, но только 1 из них заберет меня на "Экран B"..

Я ищу способ, которым я мог бы пройтись по всем кнопкам и сломаться после достижения "Screen B" - через ADB

Я пытался заглянуть в uiautomator dump из предыдущего экрана и после каждого нажатия на кнопку, получая иерархию пользовательского интерфейса "нового" экрана и сравнивая их - но результаты не были успешными.

Есть идеи? Спасибо

2 ответа

Решение

Я предполагаю, что у вас есть 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 на одном экране будет иметь точно такой же размер файла, если только обновлены часы в верхнем правом углу или свернуты другие уведомления. Если между скриншотами двух окон есть существенная разница в размерах, вы можете использовать простое выражение "больше / меньше, чем если" для определения.

Надеюсь это поможет,

Идея сравнения дампов иерархии намного лучше, чем сравнение снимков экрана: дампы - это просто текстовые данные (~10 КБ вместо ~100 КБ), и их можно сравнивать без неточностей, возникающих при сравнении изображений. Это означает, что вы можете точно увидеть, изменилось ли что-то в иерархии пользовательского интерфейса.

Причина, по которой это не сработало для вас, вероятно, состоит в том, что дампы содержат некоторые данные с привязкой ко времени. Например, текущее время в строке состояния. Итак, решение здесь - удалить все текстовые данные, например, используя эту функцию

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

Также рассмотрите возможность использования этой оболочки Python uiautomator , там <tcode id="4414409"></tcode>, который вернет вам дамп иерархии в виде строки. Тогда весь код будет выглядеть так:

      # 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
Другие вопросы по тегам