¿Cómo usar ADB para enviar eventos táctiles al dispositivo usando el comando sendevent?

89

Estoy tratando de enviar eventos táctiles a un dispositivo usando AndroidDebugBridge, para poder hacer una automatización básica para las pruebas de IU. He seguido la discusión en LINK . Puedo usar sendevent para simular el tacto en emuladores, pero no puedo hacer lo mismo en un dispositivo.

Al igual que en el enlace de arriba, el emulador parece enviar 6 eventos por cada toque (xcoord, ycoord, 2 para presionar, 2 para liberar) y fue fácil usar esta información para enviar eventos, pero un evento getevent para la pantalla táctil de un dispositivo parece ser generar demasiados eventos.

¿Alguien ha logrado enviar un toque de ADB a un dispositivo? ¿Podría compartir la solución?

Harkish
fuente
En el dispositivo, ¿verificó si está pasando los eventos al "dispositivo de entrada" adecuado? es decir. el dispositivo de entrada que está registrado como controlador táctil?
TheCodeArtist

Respuestas:

135

Android viene con una inputherramienta de línea de comandos que puede simular varios eventos de entrada. Para simular el tapping, es:

input tap x y

Puede usar el shell adb (> 2.3.5) para ejecutar el comando de forma remota:

adb shell input tap x y
usuario643154
fuente
2
Funciona perfectamente en la aplicación Nox usando nox_adb.exe ¡gracias!
Smeterlink
2
Para probar dos veces, escribí un clic en bucle como este i = 0; while [$ (($ i)) -le 2]; hago yo = $ (($ i + 1)); grifo de entrada 500 800; hecho; Pero está haciendo clic en el lugar cada segundo. ¿Puedo hacerlo más rápido usando la terminal?
Vignesh KM
66

Para realizar una acción en particular (por ejemplo, abrir el navegador web), primero debe averiguar dónde tocar. Para hacer eso, primero puede ejecutar:

adb shell getevent -l

Una vez que presione en el dispositivo, en la ubicación que desee, verá este resultado:

<...>
/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 le está diciendo que se presionó una tecla (botón hacia abajo) en la posición 2f5, 69e en hexadecimal, que es 757 y 1694 en decimal.

Si ahora desea generar el mismo evento, puede usar el comando input tap en la misma posición:

adb shell input tap 757 1694

Puede encontrar más información en:

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

Tomas
fuente
11
Para encontrar las coordenadas táctiles, recomendaría usar Opciones de desarrollador -> Mostrar ubicación táctil. Además, da los valores en decimales.
Praveen
3
Si no quiere tener que convertir el hexadecimal a decimal, puede dejar que su cáscara hacerlo: adb shell input tap $((16#2f5)) $((16#69e)). Además, para ser pedante, 0x2F5 y 0x69E son 757 y 1694 respectivamente ... ¿Qué usaste para convertir entre bases?
ghoti
Gracias @ghoti, no estoy seguro. Debo haberlo copiado en otro punto o algo así ...
Tomas
Sobre la base de esto, construí el 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))}'que obtiene la posición de tap como un número entero
kyczawon
12

2.3.5 no tenía input tap, solo input keyeventy input text puede usar el monkeyrunner para ello: (esta es una copia de la respuesta en https://stackoverflow.com/a/18959385/1587329 ):

Es posible que desee utilizar monkeyrunner así:

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

También puedes arrastrar, iniciar actividades, etc. Echa un vistazo a la API de MonkeyDevice .

serv-inc
fuente
4

Considere usar el uiautomator de Android , con adb shell uiautomator [...] o usar directamente el .jar que viene con el SDK.

Elist
fuente
Por cierto, hay algunas herramientas en el mercado que pueden facilitarle las pruebas de automatización de Android.
Elist
4

Sobre la base de la respuesta de Tomas, este es el mejor enfoque para encontrar la posición del toque de ubicación como un número entero que encontré:

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

Use adb shell getevent -lpara obtener una lista de eventos, use grep for ABS_MT_POSITION(obtiene la línea con eventos táctiles en hexadecimal) y finalmente use awk para obtener los valores hexadecimales relevantes, quítelos de ceros y convierta hexadecimal en entero. Esto imprime continuamente las coordenadas xey en la terminal solo cuando presiona en el dispositivo.

Luego puede usar este comando de shell adb para enviar el comando:

adb shell input tap x y
Kyczawon
fuente