Wie verwende ich ADB, um Berührungsereignisse mit dem Befehl sendevent an das Gerät zu senden?

86

Ich versuche, Touch-Ereignisse mit AndroidDebugBridge an ein Gerät zu senden, damit ich einige grundlegende Automatisierungsfunktionen für UI-Tests durchführen kann. Ich habe die Diskussion in LINK verfolgt . Ich kann sendevent verwenden, um die Berührung von Emulatoren zu simulieren, kann dies jedoch nicht auf einem Gerät tun.

Wie im obigen Link scheint der Emulator 6 Ereignisse für jede Berührung auszusenden (xcoord, ycoord, 2 für die Presse, 2 für die Freigabe), und es war einfach, diese Informationen für Ereignisse zu verwenden, aber ein Ereignis für den Touchscreen für ein Gerät scheint dies zu tun viel zu viele Ereignisse erzeugen.

Hat es jemand geschafft, eine Berührung von ADB an ein Gerät zu senden? Könnten Sie bitte die Lösung teilen.

Harkish
quelle
Haben Sie auf dem Gerät überprüft, ob Sie die Ereignisse an das richtige "Eingabegerät" übergeben? dh. das Eingabegerät, das als Touch-Treiber registriert ist?
TheCodeArtist

Antworten:

134

Android verfügt über ein inputBefehlszeilentool, mit dem verschiedene Eingabeereignisse simuliert werden können. Um das Tippen zu simulieren, ist es:

input tap x y

Sie können die ADB-Shell (> 2.3.5) verwenden, um den Befehl remote auszuführen:

adb shell input tap x y
user643154
quelle
2
Es funktioniert perfekt auf der Nox App mit nox_adb.exe. Danke!
Smeterlink
2
Zum Testen von Double Tap habe ich einen Loop-Klick wie folgt geschrieben: i = 0; während [$ (($ i)) -le 2]; do i = $ (($ i + 1)); Eingangsabgriff 500 800; getan; Aber es klickt jede Sekunde auf die Stelle. Kann ich es mit dem Terminal schneller machen?
Vignesh KM
64

Um eine bestimmte Aktion auszuführen (z. B. um den Webbrowser zu öffnen), müssen Sie zunächst herausfinden, wo Sie tippen müssen. Dazu können Sie zunächst Folgendes ausführen:

adb shell getevent -l

Sobald Sie auf das Gerät an der gewünschten Stelle drücken, wird folgende Ausgabe angezeigt:

<...>
/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 teilt Ihnen mit, dass an der Position 2f5 eine Taste gedrückt wurde (Taste nach unten), 69e in hexadezimaler Position, 757 und 1694 in Dezimalzahl.

Wenn Sie jetzt dasselbe Ereignis generieren möchten, können Sie den Befehl input tap an derselben Position verwenden:

adb shell input tap 757 1694

Weitere Infos finden Sie unter:

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

Tomas
quelle
11
Um die Touch-Koordinaten zu finden, würde ich empfehlen, Entwickleroptionen -> Touch-Speicherort anzeigen zu verwenden. Außerdem werden die Werte in Dezimalstellen angegeben.
Praveen
3
Wenn Sie das Hex nicht in eine Dezimalzahl konvertieren möchten, können Sie es von Ihrer Shell ausführen lassen : adb shell input tap $((16#2f5)) $((16#69e)). Um pedantisch zu sein, sind 0x2F5 und 0x69E 757 bzw. 1694 ... Was haben Sie zum Konvertieren zwischen Basen verwendet?
Ghoti
Danke @ghoti nicht sicher, ob ich es von einem anderen Punkt oder so etwas kopiert haben muss ...
Tomas
Darauf aufbauend habe ich den Befehl erstellt 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))}', der die Tap-Position als Ganzzahl erhält
kyczawon
12

2.3.5 hatte nicht input tap, nur input keyeventund input text Sie können den Monkeyrunner dafür verwenden: (Dies ist eine Kopie der Antwort unter https://stackoverflow.com/a/18959385/1587329 ):

Vielleicht möchten Sie Monkeyrunner wie folgt verwenden :

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

Sie können auch ziehen, Aktivitäten starten usw. Schauen Sie sich die API für MonkeyDevice an .

serv-inc
quelle
4

Verwenden Sie den uiautomator von Android , [...] den adb shell uiautomator oder direkt die mit dem SDK gelieferte .jar-Datei.

Elist
quelle
Übrigens gibt es einige Tools auf dem Markt, die Ihnen das Testen der Automatisierung von Android erheblich erleichtern können.
Elist
3

Aufbauend auf Tomas 'Antwort ist dies der beste Ansatz, um die Position des Standortabgriffs als Ganzzahl zu ermitteln, die ich gefunden habe:

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

Verwenden Sie adb shell getevent -ldiese Option , um eine Liste der Ereignisse abzurufen, für die grep verwendet wirdABS_MT_POSITION (ruft die Zeile mit Berührungsereignissen in hexadezimal ab) und verwenden Sie schließlich awk, um die relevanten hexadezimalen Werte abzurufen, Nullen zu entfernen und hexadezimal in Ganzzahlen umzuwandeln. Dadurch werden die x- und y-Koordinaten im Terminal nur dann kontinuierlich gedruckt, wenn Sie auf das Gerät drücken.

Sie können dann diesen Befehl adb shell verwenden, um den Befehl zu senden:

adb shell input tap x y
Kyczawon
quelle