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?
android
automation
adb
touchscreen
Harkish
fuente
fuente
Respuestas:
Android viene con una
input
herramienta 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
fuente
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:
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
fuente
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?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 entero2.3.5 no tenía
input tap
, soloinput keyevent
yinput text
puede usar el monkeyrunner para ello: (esta es una copia de la respuesta en https://stackoverflow.com/a/18959385/1587329 ):$ monkeyrunner >>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice >>> device = MonkeyRunner.waitForConnection() >>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)
fuente
No necesitas usar
comando, solo necesita habilitar en Opciones de desarrollador en el dispositivo [Mostrar datos táctiles] para obtener X e Y.
Puede encontrar más información en mi artículo aquí: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
fuente
Considere usar el uiautomator de Android , con adb shell uiautomator [...] o usar directamente el .jar que viene con el SDK.
fuente
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 -l
para obtener una lista de eventos, use grep forABS_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
fuente