Использование ADB для доступа к определенному элементу управления пользовательским интерфейсом на экране

Вопрос:Возможно ли, что консоль adb shell получит доступ к специальной кнопке приложения для Android, используя свой идентификатор? или текст? Я пытаюсь автоматизировать нажатие кнопки на устройстве. Это веб-приложение, доступное из браузера. Итак, если у меня есть этот идентификатор кнопки, я могу отправить действие на эту кнопку? Лучший ответ: Я думаю, что лучшее, что вы можете

Вопрос:

Возможно ли, что консоль adb shell получит доступ к специальной кнопке приложения для Android, используя свой идентификатор? или текст?

Я пытаюсь автоматизировать нажатие кнопки на устройстве. Это веб-приложение, доступное из браузера. Итак, если у меня есть этот идентификатор кнопки, я могу отправить действие на эту кнопку?

Лучший ответ:

Я думаю, что лучшее, что вы можете сделать, это ввести прикосновение на основе координаты.

Смотрите отправка сенсорного события из АБР на устройство
и имитация касания с использованием ADB

Вы можете получить координаты кнопки из окна или действия dumpsys.

Вы также можете проверить Monkeyrunner.

Ответ №1

Автоматизатор пользовательского интерфейса предоставляет идентификаторы ресурсов, текст и границы элемента пользовательского интерфейса. Для лучшего просмотра файла можно использовать просмотрщик XML или браузер Chrome.

adb pull $(adb shell uiautomator dump | grep -oP ‘[^ ]+.xml’) /tmp/view.xml

Можно извлечь границы элемента пользовательского интерфейса и рассчитать среднюю точку. Замените text= на resource-id= или на content-desc= при необходимости.

coords=$(perl -ne ‘printf «%d %dn», ($1+$3)/2, ($2+$4)/2 if /text=»MY_BUTTON_TEXT»[^>]*bounds=»[(d+),(d+)][(d+),(d+)]»/’ /tmp/view.xml)

Теперь у нас есть координаты центра элемента пользовательского интерфейса в $coords и нам просто нужно отправить событие касания.

adb shell input tap $coords Ответ №2

Вы не сможете использовать идентификатор кнопки, но вы можете получить координаты кнопок и имитировать событие крана.

Android поставляется с инструментом командной строки ввода, который может имитировать разные входные события. Чтобы имитировать постукивание, используйте:

input tap x y

Вы можете использовать оболочку adb для удаленного запуска команды:

adb shell input tap x y

Другие варианты:

shell@m0:/ $ input input usage: input … input text <string> input keyevent <key code number or name> input [touchscreen|touchpad|touchnavigation] tap <x> <y> input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)] input trackball press input trackball roll <dx> <dy> Ответ №3

Да, вы можете, хотя это не красиво.

Вы можете получить иерархию представлений с помощью этой команды:

adb exec-out uiautomator dump /dev/tty, который печатает вывод на экран в виде файла XML. К сожалению это не верный XML, так как там добавлен некоторый текст. Итак, давайте отфильтруем это:

adb exec-out uiautomator dump /dev/tty | awk ‘{gsub(«UI hierchary dumped to: /dev/tty», «»);print}’

Теперь у нас есть действительный XML. Давайте запустим это через XPath:

adb exec-out uiautomator dump /dev/tty | awk ‘{gsub(«UI hierchary dumped to: /dev/tty», «»);print}’ | xpath ‘//node[@resource-id=»com.example:id/btnDone»]’ 2> /dev/null, который будет искать все узлы с определенным идентификатором. Теперь у вас есть узел, и вы можете сделать еще кое-что для этого.

Если бы вам нужно было получить только границы просмотра, вам нужно было бы сделать это:

adb exec-out uiautomator dump /dev/tty | awk ‘{gsub(«UI hierchary dumped to: /dev/tty», «»);print}’ | xpath ‘//node[@resource-id=»com.example:id/btnDone»]/@bounds’ 2> /dev/null | awk ‘{$1=$1};1’ | awk ‘{gsub(«bounds=», «»);print}’ | awk ‘{gsub(«»», «»);print}’, который впоследствии очищает строку и просто выводит [294,1877][785,1981].

Источник конкретного узла:

<node index=»1″ text=»Lets get started!» resource-id=»com.example:id/btnDone» class=»android.widget.Button» package=»com.example» content-desc=»» checkable=»false» checked=»false» clickable=»true» enabled=»true» focusable=»true» focused=»false» scrollable=»false» long-clickable=»false» password=»false» selected=»false» bounds=»[294,1877][785,1981]» />

Ответ №4

если я, я использую python для этого, объединить команду cmd с subprocess.Popen, сценарий будет:

from subprocess import Popen, PIPE import os adbpath = r’YOUR ADB DIR’ adbfile = ‘adb.exe’ adb = os.path.join(adbpath, adbfile) def tap(a): cor = a t = Popen([adb, ‘shell’, ‘input’, ‘tap’, str(a[0]), str(a[1])]) #i give you extra script def swipe(a, b): first = a last = b sab = Popen([adb, ‘shell’, ‘input’, ‘swipe’, str(first[0]), str(first[1]), str(last[0]), str(last[1]), ‘200’])

затем, когда у вас есть кнопка координат, просто нажмите это:

ok_coord = 122,137 tap(ok_coord)

когда вы хотите провести

coord1 = 122,373 coord2 = 122,26 swipe(coord1, coord2)

чтобы получить координату кнопки или точки, используйте “uiautomatorviewer.bat”, который существует в папке “sdktoolsbin”

или вы можете использовать метод абрикос, erm3nda или Vinicius Dantas,

Оцените статью
Добавить комментарий