Come utilizzare ADB per inviare eventi touch al dispositivo utilizzando il comando sendevent?


91

Sto cercando di inviare eventi di tocco a un dispositivo utilizzando AndroidDebugBridge, in modo da poter eseguire un'automazione di base per i test dell'interfaccia utente. Ho seguito la discussione in LINK . Sono in grado di utilizzare sendevent per simulare il tocco sugli emulatori, ma non posso fare lo stesso su un dispositivo.

Come nel link sopra, l'emulatore sembra inviare 6 eventi per ogni tocco (xcoord, ycoord, 2 per la stampa, 2 per il rilascio) ed è stato facile usare queste informazioni per inviare eventi, ma sembra che un getevent per il touchscreen di un dispositivo generare troppi eventi.

Qualcuno è riuscito a inviare il tocco da ADB a un dispositivo? Potresti condividere la soluzione.


Sul dispositivo, hai controllato se stai passando gli eventi al "dispositivo di input" appropriato? cioè. il dispositivo di input che è registrato come touch-driver?
TheCodeArtist

Risposte:


138

Android viene fornito con uno inputstrumento da riga di comando in grado di simulare eventi di input vari. Per simulare il tocco, è:

input tap x y

Puoi usare la shell adb (> 2.3.5) per eseguire il comando da remoto:

adb shell input tap x y

2
Funziona perfettamente sull'app Nox usando nox_adb.exe grazie!
Smeterlink

2
Per il doppio tocco di prova ho scritto un clic del ciclo come questo i = 0; mentre [$ (($ i)) -le 2]; faccio io = $ (($ i + 1)); rubinetto di ingresso 500800; fatto; Ma fa clic sul luogo ogni secondo. posso farlo più velocemente usando il terminale?
Vignesh KM

67

Per eseguire un'azione particolare (ad esempio per aprire il browser web), è necessario prima capire dove toccare. Per farlo, puoi prima eseguire:

adb shell getevent -l

Una volta premuto sul dispositivo, nella posizione che desideri, vedrai questo output:

<...>
/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 ti sta dicendo che è stato premuto un tasto (pulsante giù) nella posizione 2f5, 69e in esadecimale che è 757 e 1694 in decimale.

Se ora vuoi generare lo stesso evento, puoi usare il comando input tap nella stessa posizione:

adb shell input tap 757 1694

Maggiori informazioni possono essere trovate su:

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


12
Per trovare le coordinate di tocco, consiglierei di utilizzare Opzioni sviluppatore -> Mostra posizione tocco. Inoltre, fornisce i valori in decimali.
Praveen

3
Se non si desidera avere per convertire l'esagono in decimale, si può lasciare che la shell farlo: adb shell input tap $((16#2f5)) $((16#69e)). Inoltre, giusto per essere pedanti, 0x2F5 e 0x69E sono rispettivamente 757 e 1694 ... Cosa hai usato per convertire tra le basi?
ghoti

Grazie @ghoti, non sono sicuro di averlo copiato da un altro punto o qualcosa del genere ...
Tomas

Sulla base di questo, ho creato il comando 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))}'che ottiene la posizione del tocco come numero intero
kyczawon

12

2.3.5 non aveva input tap, solo input keyevente input text Puoi usare il monkeyrunner per questo: (questa è una copia della risposta su https://stackoverflow.com/a/18959385/1587329 ):

Potresti voler usare monkeyrunner in questo modo:

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

Puoi anche trascinare, avviare attività, ecc . Dai un'occhiata all'API per MonkeyDevice .



5

Basandosi sulla risposta di Tomas, questo è l'approccio migliore per trovare la posizione del tocco della posizione come numero intero che ho trovato:

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))}'

Utilizzare adb shell getevent -lper ottenere un elenco di eventi, utilizzare grep per ABS_MT_POSITION(ottiene la riga con eventi di tocco in esadecimale) e infine utilizzare awk per ottenere i valori esadecimali pertinenti, toglierli di zeri e convertire esadecimale in intero. Questo stampa continuamente le coordinate xey nel terminale solo quando si preme sul dispositivo.

È quindi possibile utilizzare questo comando della shell adb per inviare il comando:

adb shell input tap x y

4

Prendi in considerazione l'utilizzo di uiautomator di Android , con adb shell uiautomator [...] o direttamente l'utilizzo del .jar fornito con l'SDK.


A proposito, ci sono alcuni strumenti sul mercato che possono semplificare i test di automazione di Android per te.
Elist
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.