Вопрос:
Возможно ли, что консоль 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,