Jak używać ADB do wysyłania zdarzeń dotykowych do urządzenia za pomocą polecenia sendevent?

89

Próbuję wysłać zdarzenia dotyku do urządzenia za pomocą AndroidDebugBridge, aby móc wykonać podstawową automatyzację testów interfejsu użytkownika. Śledziłem dyskusję w LINKU . Jestem w stanie użyć sendevent do symulacji dotyku na emulatorach, ale nie mogę zrobić tego samego na urządzeniu.

Podobnie jak w powyższym linku, emulator wydaje się wysyłać 6 zdarzeń dla każdego dotyku (xcoord, ycoord, 2 dla prasy, 2 dla wydania) i łatwo było użyć tych informacji do wysyłania zdarzeń, ale zdarzenie getevent dla ekranu dotykowego dla urządzenia wydaje się generuje zbyt wiele zdarzeń.

Czy komuś udało się wysłać dotyk z ADB do urządzenia? Czy mógłbyś podzielić się rozwiązaniem.

Harkish
źródło
Czy na urządzeniu sprawdziłeś, czy przekazujesz zdarzenia do właściwego „urządzenia wejściowego”? to znaczy. urządzenie wejściowe zarejestrowane jako sterownik dotykowy?
TheCodeArtist

Odpowiedzi:

135

Android jest wyposażony w inputnarzędzie wiersza polecenia, które może symulować różne zdarzenia wejściowe. Aby zasymulować stukanie, to:

input tap x y

Możesz użyć powłoki adb (> 2.3.5), aby zdalnie uruchomić polecenie:

adb shell input tap x y
user643154
źródło
2
Działa doskonale w aplikacji Nox przy użyciu nox_adb.exe, dziękuję!
Smeterlink
2
W celu testowania podwójnego dotknięcia napisałem pętlę kliknięcia w ten sposób i = 0; podczas [$ (($ i)) -le 2]; do i = $ (($ i + 1)); zaczep wejściowy 500 800; Gotowe; Ale to klikanie w to miejsce co sekundę. czy mogę to zrobić szybciej za pomocą terminala?
Vignesh KM,
66

Aby wykonać określoną czynność (na przykład otworzyć przeglądarkę internetową), musisz najpierw dowiedzieć się, gdzie stuknąć. Aby to zrobić, możesz najpierw uruchomić:

adb shell getevent -l

Po naciśnięciu na urządzeniu w wybranej lokalizacji zobaczysz następujący wynik:

<...>
/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 informuje, że klawisz został naciśnięty (przycisk w dół) na pozycji 2f5, 69e w systemie szesnastkowym, czyli 757 i 1694 dziesiętnie.

Jeśli chcesz teraz wygenerować to samo zdarzenie, możesz użyć polecenia wejścia tap w tej samej pozycji:

adb shell input tap 757 1694

Więcej informacji można znaleźć pod adresem:

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

Tomas
źródło
11
Aby znaleźć współrzędne dotyku, polecam użycie opcji programisty -> Pokaż lokalizację dotyku. Podaje również wartości w liczbach dziesiętnych.
Praveen
3
Jeśli nie chcemy mieć do konwersji hex na dziesiętny, można pozwolić skorupa zrobić: adb shell input tap $((16#2f5)) $((16#69e)). Ponadto, żeby być pedantycznym, 0x2F5 i 0x69E to odpowiednio 757 i 1694 ... Czego użyłeś do konwersji między bazami?
ghoti
Dzięki @ghoti nie jestem pewien, że musiałem go skopiować z innego punktu lub czegoś w tym rodzaju ...
Tomas
Opierając się na tym, zbudowałem polecenie, 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))}'które pobiera pozycję zaczepu jako liczbę całkowitą
kyczawon
12

2.3.5 nie miał input tap, po prostu input keyeventi input text możesz użyć do tego monkeyrunner: (jest to kopia odpowiedzi na https://stackoverflow.com/a/18959385/1587329 ):

Możesz chcieć użyć monkeyrunner w ten sposób:

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

Możesz także przeciągnąć, rozpocząć działania itp. Spójrz na interfejs API MonkeyDevice .

serv-inc
źródło
4

Rozważ użycie uiautomatora Androida z adb shell uiautomator [...] lub użycie bezpośrednio pliku .jar dostarczonego z SDK.

Elist
źródło
Przy okazji, na rynku jest kilka narzędzi, które mogą znacznie ułatwić testowanie automatyzacji Androida.
Elist,
4

Opierając się na odpowiedzi Tomasa, jest to najlepsze podejście do znalezienia pozycji dotknięcia lokalizacji jako liczby całkowitej, którą znalazłem:

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

Użyj, adb shell getevent -laby uzyskać listę zdarzeń, użyj grep for ABS_MT_POSITION(pobiera linię ze zdarzeniami dotykowymi w postaci szesnastkowej) i na koniec użyj awk, aby uzyskać odpowiednie wartości szesnastkowe, usuń je z zer i przekonwertuj szesnastkowe na liczbę całkowitą. Powoduje to ciągłe drukowanie współrzędnych x i y w terminalu tylko po naciśnięciu urządzenia.

Następnie możesz użyć tego polecenia powłoki adb, aby wysłać polecenie:

adb shell input tap x y
kyczawon
źródło