Как использовать 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

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 .


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.


Кстати, на рынке есть несколько инструментов, которые могут значительно упростить вам тестирование 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.