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.

Harkish
la source
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
user643154
la source
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

Tomas
la source
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 .

serv-inc
la source
4

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

Elist
la source
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
kyczawon
la source