Comment utiliser ADB pour envoyer des événements tactiles à l'appareil à l'aide de la commande sendevent?


88

J'essaie d'envoyer des événements tactiles à un appareil à l'aide d'AndroidDebugBridge, afin de pouvoir effectuer une automatisation de base pour les tests d'interface utilisateur. J'ai suivi la discussion dans LINK . Je peux utiliser sendevent pour simuler le toucher sur des émulateurs, mais je ne peux pas faire de même sur un appareil.

Comme dans le lien ci-dessus, l'émulateur semble envoyer 6 événements pour chaque contact (xcoord, ycoord, 2 pour la presse, 2 pour la libération) et il était facile d'utiliser ces informations pour envoyer des événements, mais un getevent pour l'écran tactile d'un appareil semble générer beaucoup trop d'événements.

Quelqu'un a-t-il réussi à envoyer le contact d'ADB vers un appareil? Pourriez-vous s'il vous plaît partager la solution.


Sur l'appareil, avez-vous vérifié si vous transmettez les événements au bon «périphérique d'entrée»? c'est à dire. le périphérique d'entrée qui est enregistré comme pilote tactile?
— TheCodeArtist

Réponses:


135

Android est livré avec un inputoutil de ligne de commande qui peut simuler divers événements d'entrée. Pour simuler le tapotement, c'est:

input tap x y

Vous pouvez utiliser le shell adb (> 2.3.5) pour exécuter la commande à distance:

adb shell input tap x y

2
Cela fonctionne parfaitement sur Nox App en utilisant nox_adb.exe merci!
— Smeterlink

2
Pour tester, appuyez deux fois, j'ai écrit un clic en boucle comme ceci: i = 0; tandis que [$ (($ i)) -le 2]; faire i = $ (($ i + 1)); prise d'entrée 500 800; terminé; Mais il clique sur le lieu toutes les secondes. puis-je le faire plus rapidement en utilisant le terminal?
— Vignesh KM

66

Pour effectuer une action particulière (par exemple pour ouvrir le navigateur Web), vous devez d'abord déterminer où appuyer. Pour ce faire, vous pouvez d'abord exécuter:

adb shell getevent -l

Une fois que vous appuyez sur l'appareil, à l'emplacement souhaité, vous verrez cette sortie:

<...>
/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 vous indique qu'une touche a été enfoncée (bouton bas) à la position 2f5, 69e en hexadécimal qui est 757 et 1694 en décimal.

Si vous souhaitez maintenant générer le même événement, vous pouvez utiliser la commande d'entrée tap à la même position:

adb shell input tap 757 1694

Plus d'informations peuvent être trouvées sur:

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


11
Pour trouver les coordonnées tactiles, je vous recommande d'utiliser Options du développeur -> Afficher l'emplacement tactile. En outre, il donne les valeurs en décimales.
— Praveen

3
Si vous ne voulez pas avoir à convertir l'hexagone en décimal, vous pouvez laisser votre shell faire: adb shell input tap $((16#2f5)) $((16#69e)). Aussi, juste pour être pédant, 0x2F5 et 0x69E sont respectivement 757 et 1694 ... Qu'avez-vous utilisé pour convertir entre les bases?
— ghoti

Merci @ghoti pas sûr que j'ai dû le copier sur un autre point ou quelque chose comme ça ...
— Tomas

En s'appuyant sur cela, j'ai construit la commande 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))}'qui obtient la position de prise sous forme d'entier
— kyczawon

12

2.3.5 n'avait pas input tap, juste input keyeventet input text vous pouvez utiliser le monkeyrunner pour cela: (ceci est une copie de la réponse à https://stackoverflow.com/a/18959385/1587329 ):

Vous voudrez peut-être utiliser monkeyrunner comme ceci:

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

Vous pouvez également faire un glisser, démarrer des activités, etc. Jetez un œil à l'API de MonkeyDevice .



4

Pensez à utiliser uiautomator d'Android , avec le shell adb uiautomator [...] ou directement à l'aide du .jar fourni avec le SDK.


BTW, il existe quelques outils sur le marché qui peuvent faciliter les tests d'automatisation d'Android.
— Elist

4

En s'appuyant sur la réponse de Tomas, c'est la meilleure approche pour trouver la position de prise de position sous forme d'entier que j'ai trouvé:

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

Utilisez adb shell getevent -lpour obtenir une liste d'événements, utilisez grep pour ABS_MT_POSITION(récupère la ligne avec les événements tactiles en hexadécimal) et enfin utilisez awk pour obtenir les valeurs hexadécimales pertinentes, supprimez-les des zéros et convertissez hexadécimal en entier. Cela imprime en continu les coordonnées x et y dans le terminal uniquement lorsque vous appuyez sur sur l'appareil.

Vous pouvez ensuite utiliser cette commande adb shell pour envoyer la commande:

adb shell input tap x y
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.