Использование ADB для доступа к определенному элементу управления пользовательским интерфейсом на экране
Возможно ли, что консоль adb shell
получит доступ к специальной кнопке приложения для Android, используя свой идентификатор? или текст?
Я пытаюсь автоматизировать нажатие кнопки на устройстве. Это веб-приложение, доступное из браузера. Итак, если у меня есть этот идентификатор кнопки, я могу отправить действие на эту кнопку?
Ответы
Ответ 1
Я думаю, что лучшее, что вы можете сделать, это ввести прикосновение на основе координаты.
Смотрите отправка сенсорного события из АБР на устройство
и имитация касания с использованием ADB
Вы можете получить координаты кнопки из окна или действия dumpsys.
Вы также можете проверить Monkeyrunner.
Ответ 2
Автоматизатор пользовательского интерфейса предоставляет идентификаторы ресурсов, текст и границы элемента пользовательского интерфейса. Для лучшего просмотра файла можно использовать просмотрщик XML или браузер Chrome.
adb pull $(adb shell uiautomator dump | grep -oP '[^ ]+.xml') /tmp/view.xml
Можно извлечь границы элемента пользовательского интерфейса и рассчитать среднюю точку. Замените text=
на resource-id=
или на content-desc=
при необходимости.
coords=$(perl -ne 'printf "%d %d\n", ($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
Ответ 3
Вы не сможете использовать идентификатор кнопки, но вы можете получить координаты кнопок и имитировать событие крана.
Android поставляется с инструментом командной строки ввода, который может имитировать разные входные события. Чтобы имитировать постукивание, используйте:
input tap x y
Вы можете использовать оболочку adb для удаленного запуска команды:
adb shell input tap x y
Другие варианты:
[email protected]:/ $ 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>
Ответ 4
Да, вы можете, хотя это не красиво.
Вы можете получить иерархию представлений с помощью этой команды:
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]" />
Ответ 5
если я, я использую 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", который существует в папке "sdk\tools\bin"
или вы можете использовать метод абрикос, erm3nda или Vinicius Dantas,