Использование 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,