Як використовувати ADB для надсилання подій дотику на пристрій за допомогою команди sendevent?


88

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

Як і у наведеному вище посиланні, емулятор видає 6 подій за кожен дотик (xcoord, ycoord, 2 для преси, 2 для випуску), і цю інформацію було легко використовувати для окремих подій, але гетевент для сенсорного екрану для пристрою здається генерувати занадто багато подій.

Хтось встиг надіслати дотик з АБР на пристрій? Не могли б ви поділитися рішенням?


Чи перевіряли ви на пристрої, чи передаєте ви події відповідному "пристрою введення"? тобто пристрій введення, який зареєстрований як сенсорний драйвер?
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]; do i = $ (($ i + 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 у десятковій.

Якщо ви зараз хочете згенерувати ту саму подію, ви можете скористатися командою введення tap у тому ж положенні:

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 оболонка getevent -l

команду, вам просто потрібно ввімкнути у Параметри розробника на пристрої [Показати дані дотику], щоб отримати X та Y.

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


4

Розгляньте можливість використання uiautomator Android , з uiautomator оболонки adb [...], або безпосередньо використання .jar, що постачається з SDK.


До речі, на ринку є кілька інструментів, які можуть значно полегшити вам тестування автоматизації Android.
Еліст,

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.