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.
android
automation
adb
touchscreen
Harkish
źródło
źródło
Odpowiedzi:
Android jest wyposażony w
input
narzę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
źródło
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ć:
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
źródło
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?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ą2.3.5 nie miał
input tap
, po prostuinput keyevent
iinput text
możesz użyć do tego monkeyrunner: (jest to kopia odpowiedzi na 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)
źródło
Nie musisz używać
polecenie, wystarczy włączyć w Opcjach programisty na urządzeniu [Pokaż dane dotykowe], aby uzyskać X i Y.
Więcej informacji można znaleźć w moim artykule tutaj: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
źródło
Rozważ użycie uiautomatora Androida z adb shell uiautomator [...] lub użycie bezpośrednio pliku .jar dostarczonego z SDK.
źródło
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 -l
aby uzyskać listę zdarzeń, użyj grep forABS_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
źródło