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.
la source
Réponses:
Android est livré avec un
input
outil 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
la source
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:
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
la source
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?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'entier2.3.5 n'avait pas
input tap
, justeinput keyevent
etinput text
vous pouvez utiliser le monkeyrunner pour cela: (ceci est une copie de la réponse à 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)
la source
Vous n'avez pas besoin d'utiliser
, il vous suffit d'activer dans les options du développeur sur l'appareil [Afficher les données tactiles] pour obtenir X et Y.
Quelques informations supplémentaires peuvent être trouvées dans mon article ici: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
la source
Pensez à utiliser uiautomator d'Android , avec le shell adb uiautomator [...] ou directement à l'aide du .jar fourni avec le SDK.
la source
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 -l
pour obtenir une liste d'événements, utilisez grep pourABS_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
la source