Como usar o ADB para enviar eventos de toque ao dispositivo usando o comando sendevent?

91

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.

Harkish
fonte
No dispositivo, você verificou se está passando os eventos para o "dispositivo de entrada" adequado? ie. o dispositivo de entrada que está registrado como o driver de toque?
TheCodeArtist

Respostas:

138

O Android vem com uma inputferramenta 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
user643154
fonte
2
Funciona perfeitamente no aplicativo Nox usando nox_adb.exe, obrigado!
Smeterlink
2
Para testar o toque duplo, escrevi um clique em loop como este i = 0; enquanto [$ (($ i)) -le 2]; fazer i = $ (($ i + 1)); torneira de entrada 500 800; feito; Mas está clicando no lugar a cada segundo. posso fazer isso mais rápido usando o terminal?
Vignesh KM
67

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:

adb shell getevent -l

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

Tomas
fonte
12
Para encontrar as coordenadas de toque, eu recomendaria usar Opções do desenvolvedor -> Mostrar localização de toque. Além disso, fornece os valores em decimais.
Praveen
3
Se você não quer ter que converter o hexa para decimal, você pode deixar sua shell fazê-lo: 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?
ghoti
Obrigado @ghoti não tenho certeza devo ter copiado de outro ponto ou algo parecido ...
Tomas
Com base 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))}'
nisso
12

2.3.5 não tinha input tap, apenas input keyevente input text Você pode usar o monkeyrunner para isso: (esta é uma cópia da resposta em https://stackoverflow.com/a/18959385/1587329 ):

Você pode querer usar o monkeyrunner assim:

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

Você também pode arrastar, iniciar atividades, etc. Dê uma olhada na API do MonkeyDevice .

serv-inc
fonte
5

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 -lpara obter uma lista de eventos, use grep para ABS_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
Kyczawon
fonte
4

Considere usar o uiautomator do Android , com adb shell [...] uiautomator ou diretamente usando o .jar que vem com o SDK.

Elist
fonte
BTW, existem algumas ferramentas no mercado que podem tornar o teste de automação do Android muito mais fácil para você.
Elist de