Как использовать ADB для отправки событий касания на устройство с помощью команды sendevent?

89

Я пытаюсь отправить события касания на устройство с помощью AndroidDebugBridge, чтобы выполнить базовую автоматизацию тестов пользовательского интерфейса. Я следил за обсуждением в LINK . Я могу использовать sendevent для имитации прикосновения к эмуляторам, но не могу сделать то же самое на устройстве.

Как и в приведенной выше ссылке, эмулятор, похоже, отправляет 6 событий для каждого касания (xcoord, ycoord, 2 для нажатия, 2 для выпуска), и эту информацию было легко использовать для отправки событий, но getevent для сенсорного экрана для устройства, похоже, генерировать слишком много событий.

У кого-нибудь получилось отправить тач с ADB на девайс? Не могли бы вы поделиться решением.

Харкиш
источник
На устройстве вы проверяли, передаете ли вы события на правильное «устройство ввода»? т.е. устройство ввода, прописанное как сенсорный драйвер?
TheCodeArtist

Ответы:

135

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

input tap x y

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

adb shell input tap x y
user643154
источник
2
Он отлично работает в приложении Nox с использованием nox_adb.exe, спасибо!
Smeterlink
2
Для тестирования двойного нажатия я написал щелчок цикла, подобный этому i = 0; а [$ (($ i)) -le 2]; сделать я = $ (($ я + 1)); входной кран 500 800; сделанный; Но он щелкает по месту каждую секунду. могу ли я сделать это быстрее с помощью терминала?
Vignesh KM
66

Чтобы выполнить определенное действие (например, открыть веб-браузер), вам нужно сначала выяснить, куда нажать. Для этого вы можете сначала запустить:

adb shell getevent -l

После того, как вы нажмете на устройство в нужном месте, вы увидите следующий результат:

<...>
/dev/input/event3: EV_KEY       BTN_TOUCH            DOWN
/dev/input/event3: EV_ABS       ABS_MT_POSITION_X    000002f5
/dev/input/event3: EV_ABS       ABS_MT_POSITION_Y    0000069e

adb сообщает вам, что была нажата клавиша (кнопка нажата) в позиции 2f5, 69e в шестнадцатеричном формате, что составляет 757 и 1694 в десятичном.

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

adb shell input tap 757 1694

Более подробную информацию можно найти по адресу:

https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html

Томас
источник
11
Чтобы найти координаты касания, я бы рекомендовал использовать Параметры разработчика -> Показать расположение касания. Кроме того, он дает значения в десятичных дробях.
Правин
3
Если вы не хотите, чтобы преобразовать шестнадцатеричный в десятичной, вы можете позволить вашей оболочки сделать это: adb shell input tap $((16#2f5)) $((16#69e)). Также, чтобы быть педантичным, 0x2F5 и 0x69E - это 757 и 1694 соответственно ... Что вы использовали для преобразования между базами?
ghoti
Спасибо @ghoti, не уверен, что я скопировал это с другой точки или что-то в этом роде ...
Томас
Основываясь на этом, я создал команду, adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'которая получает положение касания как целое число
kyczawon
12

2.3.5 не было input tap, просто input keyeventи input text вы можете использовать для этого monkeyrunner: (это копия ответа на https://stackoverflow.com/a/18959385/1587329 ):

Вы можете использовать monkeyrunner вот так:

$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)

Вы также можете перетаскивать, запускать действия и т. Д. Взгляните на api для MonkeyDevice .

serv-inc
источник
5

Вам не нужно использовать

adb shell getevent -l

, вам просто нужно включить в параметрах разработчика на устройстве [Показать данные касания], чтобы получить X и Y.

Дополнительную информацию можно найти в моей статье здесь: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/

Екатерина Власова
источник
4

Рассмотрите возможность использования Android uiautomator с оболочкой adb uiautomator [...] или напрямую с использованием .jar, который поставляется с SDK.

Elist
источник
Кстати, на рынке есть несколько инструментов, которые могут значительно упростить вам тестирование Android Automation.
Elist
4

Основываясь на ответе Томаса, это лучший способ найти положение касания местоположения как целое число, которое я нашел:

adb shell getevent -l | grep ABS_MT_POSITION --line-buffered | awk '{a = substr($0,54,8); sub(/^0+/, "", a); b = sprintf("0x%s",a); printf("%d\n",strtonum(b))}'

Используйте adb shell getevent -lдля получения списка событий, используя grep for ABS_MT_POSITION(получает строку с событиями касания в шестнадцатеричном формате) и, наконец, используйте awk для получения соответствующих шестнадцатеричных значений, удаления из них нулей и преобразования шестнадцатеричного числа в целое число. Это постоянно печатает координаты x и y в терминале, только когда вы нажимаете на устройство.

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

adb shell input tap x y
Кычавон
источник