Sendevent komutunu kullanarak dokunmatik olayları cihaza göndermek için ADB nasıl kullanılır?


91

Kullanıcı arayüzü testleri için bazı temel otomasyon işlemleri yapabilmek için AndroidDebugBridge kullanan bir cihaza dokunma olayları göndermeye çalışıyorum. LINK'deki tartışmayı takip ettim . Emülatörlerde dokunma simülasyonu yapmak için sendevent'i kullanabiliyorum ancak aynısını bir cihazda yapamıyorum.

Yukarıdaki bağlantıda olduğu gibi, emülatör her dokunuş için 6 olay gönderiyor gibi görünüyor (xcoord, ycoord, 2 baskı için, 2 yayın için) ve bu bilgiyi olayları göndermek için kullanmak kolaydı, ancak bir cihaz için dokunmatik ekran için bir olay gibi görünüyor çok fazla olay üretir.

Biri ADB'den bir cihaza dokunmatik göndermeyi başardı mı? Lütfen çözümü paylaşır mısınız?


Aygıtta, olayları uygun "giriş aygıtına" geçirip geçirmediğinizi kontrol ettiniz mi? yani. dokunmatik sürücü olarak kaydedilen giriş cihazı?
TheCodeArtist

Yanıtlar:


138

Android, inputçeşitli giriş olaylarını simüle edebilen bir komut satırı aracıyla birlikte gelir . Dokunmayı simüle etmek için:

input tap x y

Komutu uzaktan çalıştırmak için adb kabuğunu (> 2.3.5) kullanabilirsiniz:

adb shell input tap x y

2
Nox_adb.exe kullanarak Nox Uygulamasında mükemmel çalışır, teşekkür ederim!
Smeterlink

2
Çift tıklamayı test etmek için bunun gibi bir döngü yazdım i = 0; süre [$ (($ i)) -le 2]; i = $ (($ i + 1)); giriş musluğu 500800; bitti; Ama her saniyede bir yere tıklıyor. terminal kullanarak daha hızlı yapabilir miyim?
Vignesh KM

67

Belirli bir eylemi gerçekleştirmek için (örneğin web tarayıcısını açmak için), önce nereye dokunmanız gerektiğini bulmanız gerekir. Bunu yapmak için önce şunu çalıştırabilirsiniz:

adb shell getevent -l

İstediğiniz yerde cihaza bastığınızda şu çıktıyı göreceksiniz:

<...>
/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 size ondalık sayı olarak 757 ve 1694 olan hex'de 2f5, 69e konumunda bir tuşa basıldığını (düğme aşağı) söylüyor.

Şimdi aynı olayı oluşturmak istiyorsanız, aynı konumda giriş dokunma komutunu kullanabilirsiniz:

adb shell input tap 757 1694

Daha fazla bilgi şu adreste bulunabilir:

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


12
Dokunma koordinatlarını bulmak için, Geliştirici Seçenekleri -> Dokunma Konumunu Göster'i kullanmanızı tavsiye ederim. Ayrıca değerleri ondalık sayılar halinde verir.
Praveen

3
Eğer ondalık için onaltılık dönüştürmek zorunda kalmak istemiyorsanız, size kabuk yapmasını sağlayabilirsiniz: adb shell input tap $((16#2f5)) $((16#69e)). Ayrıca, bilgiçlik taslamak için, 0x2F5 ve 0x69E sırasıyla 757 ve 1694'tür ... Tabanlar arasında dönüştürmek için ne kullandınız?
ghoti

Teşekkürler @ghoti, onu başka bir noktadan veya onun gibi bir şeyden kopyaladığımdan emin değilim ...
Tomas

Bunun üzerine 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))}', dokunma konumunu bir tam sayı olarak alan komutu oluşturdum
kyczawon

12

2.3.5 yoktu input tap, sadece input keyeventve input text bunun için monkeyrunner'ı kullanabilirsiniz: (bu, https://stackoverflow.com/a/18959385/1587329 adresindeki cevabın bir kopyasıdır ):

Monkeyrunner'ı şöyle kullanmak isteyebilirsiniz :

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

Ayrıca sürükle, aktiviteleri başlat vb . De yapabilirsiniz . MonkeyDevice için api'ye bir göz atın .



5

Tomas'ın cevabına dayanarak, bulduğum bir tam sayı olarak konum kademe konumunu bulmanın en iyi yaklaşımı şudur:

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

adb shell getevent -lGrep'i kullanarak ABS_MT_POSITION(onaltılık dokunma olayları içeren satırı alır) olayların bir listesini elde etmek için kullanın ve son olarak, ilgili onaltılık değerleri almak, onları sıfırlardan ayırmak ve onaltıyı tam sayıya dönüştürmek için awk kullanın. Bu, yalnızca cihaza bastığınızda terminaldeki x ve y koordinatlarını sürekli olarak yazdırır.

Daha sonra komutu göndermek için bu adb kabuğu komutunu kullanabilirsiniz:

adb shell input tap x y

4

Android'in uiautomator'ını , adb shell uiautomator [...] ile veya doğrudan SDK ile birlikte gelen .jar'ı kullanmayı düşünün .


BTW, piyasada Android'in Otomasyon testini sizin için oldukça kolaylaştırabilecek birkaç araç var.
Elist
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.