Estou tentando enviar eventos de toque para um dispositivo usando AndroidDebugBridge, para que eu possa fazer alguma automação básica para testes de IU. Acompanhei a discussão em LINK . Consigo usar sendevent para simular toque em emuladores, mas não consigo fazer o mesmo em um dispositivo.
Como no link acima, o emulador parece enviar 6 eventos para cada toque (xcoord, ycoord, 2 para impressão, 2 para liberação) e foi fácil usar essas informações para enviar eventos, mas um getevent para a tela sensível ao toque de um dispositivo parece gerar muitos eventos.
Alguém conseguiu enviar toque do ADB para um dispositivo? Você poderia, por favor, compartilhar a solução.
android
automation
adb
touchscreen
Harkish
fonte
fonte
Respostas:
O Android vem com uma
input
ferramenta de linha de comando que pode simular diversos eventos de entrada. Para simular o toque, é:input tap x y
Você pode usar o shell adb (> 2.3.5) para executar o comando remotamente:
adb shell input tap x y
fonte
Para realizar uma ação específica (por exemplo, para abrir o navegador da web), você precisa primeiro descobrir onde tocar. Para fazer isso, você pode primeiro executar:
Depois de pressionar no dispositivo, no local desejado, você verá esta saída:
<...> /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 está informando que uma tecla foi pressionada (botão para baixo) na posição 2f5, 69e em hexadecimal, que é 757 e 1694 em decimal.
Se agora você deseja gerar o mesmo evento, você pode usar o comando input tap na mesma posição:
adb shell input tap 757 1694
Mais informações podem ser encontradas em:
https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html
fonte
adb shell input tap $((16#2f5)) $((16#69e))
. Além disso, só para ser pedante, 0x2F5 e 0x69E são 757 e 1694 respectivamente ... O que você usou para converter entre as 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))}'
2.3.5 não tinha
input tap
, apenasinput keyevent
einput text
Você pode usar o monkeyrunner para isso: (esta é uma cópia da resposta em 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)
fonte
Você não precisa usar
, você só precisa habilitar em Opções do desenvolvedor no dispositivo [Mostrar dados de toque] para obter X e Y.
Mais algumas informações podem ser encontradas em meu artigo aqui: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
fonte
Com base na resposta de Tomas, esta é a melhor abordagem para encontrar a posição da torneira de localização como um inteiro que encontrei:
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 obter uma lista de eventos, use grep paraABS_MT_POSITION
(obtém a linha com eventos de toque em hexadecimal) e, finalmente, use awk para obter os valores hexadecimais relevantes, retire-os de zeros e converta hex em inteiro. Isso imprime continuamente as coordenadas xey no terminal apenas quando você pressiona no dispositivo.Você pode então usar este comando adb shell para enviar o comando:
adb shell input tap x y
fonte
Considere usar o uiautomator do Android , com adb shell [...] uiautomator ou diretamente usando o .jar que vem com o SDK.
fonte