Как обнаружить изменение экрана через 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