Saya mencoba mengirim peristiwa sentuh ke perangkat menggunakan AndroidDebugBridge, sehingga saya dapat melakukan beberapa otomatisasi dasar untuk pengujian UI. Saya telah mengikuti diskusi di LINK . Saya dapat menggunakan sendevent untuk mensimulasikan sentuhan pada emulator, tetapi tidak dapat melakukan hal yang sama pada perangkat.
Seperti pada tautan di atas, emulator tampaknya mengirimkan 6 peristiwa untuk setiap sentuhan (xcoord, ycoord, 2 untuk pers, 2 untuk rilis) dan mudah untuk menggunakan informasi ini untuk mengirim peristiwa, tetapi acara untuk layar sentuh untuk perangkat tampaknya menghasilkan terlalu banyak acara.
Apakah seseorang berhasil mengirim sentuhan dari ADB ke perangkat? Bisakah Anda berbagi solusinya.
android
automation
adb
touchscreen
Harkish
sumber
sumber
Jawaban:
Android hadir dengan
input
alat baris perintah yang dapat mensimulasikan kejadian masukan lain-lain. Untuk mensimulasikan penyadapan, itu:input tap x y
Anda dapat menggunakan shell adb (> 2.3.5) untuk menjalankan perintah dari jarak jauh:
adb shell input tap x y
sumber
Untuk melakukan tindakan tertentu (misalnya untuk membuka browser web), Anda harus terlebih dahulu mengetahui di mana harus mengetuk. Untuk melakukan itu, Anda dapat menjalankan:
Setelah Anda menekan perangkat, di lokasi yang Anda inginkan, Anda akan melihat output ini:
<...> /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 memberitahu Anda bahwa sebuah tombol telah ditekan (tombol ke bawah) pada posisi 2f5, 69e dalam hex yaitu 757 dan 1694 dalam desimal.
Jika sekarang Anda ingin membuat acara yang sama, Anda dapat menggunakan perintah ketukan masukan pada posisi yang sama:
adb shell input tap 757 1694
Info lebih lanjut dapat ditemukan di:
https://source.android.com/devices/input/touch-devices.html http://source.android.com/devices/input/getevent.html
sumber
adb shell input tap $((16#2f5)) $((16#69e))
. Selain itu, hanya untuk sekadar bertele-tele, 0x2F5 dan 0x69E masing-masing adalah 757 dan 1694 ... Apa yang Anda gunakan untuk mengonversi antar basis?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))}'
yang mendapatkan posisi tap sebagai integer2.3.5 tidak memiliki
input tap
, hanyainput keyevent
daninput text
Anda dapat menggunakan monkeyrunner untuk itu: (ini adalah salinan jawabannya di 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)
sumber
Anda tidak perlu menggunakan
perintah, Anda hanya perlu mengaktifkan di Opsi Pengembang pada perangkat [Show Touch data] untuk mendapatkan X dan Y.
Beberapa informasi lebih lanjut dapat ditemukan dalam artikel saya di sini: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/
sumber
Membangun di atas jawaban Tomas, ini adalah pendekatan terbaik untuk menemukan posisi tap lokasi sebagai bilangan bulat yang saya temukan:
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))}'
Gunakan
adb shell getevent -l
untuk mendapatkan daftar acara, penggunaan grep untukABS_MT_POSITION
(mendapatkan garis dengan peristiwa sentuh dalam hex) dan terakhir menggunakan awk untuk mendapatkan nilai hex yang relevan, lepaskan nol dan ubah hex menjadi integer. Ini terus menerus mencetak koordinat x dan y di terminal hanya ketika Anda menekan pada perangkat.Anda kemudian dapat menggunakan perintah adb shell ini untuk mengirim perintah:
adb shell input tap x y
sumber
Pertimbangkan untuk menggunakan uiautomator Android , dengan adb shell uiautomator [...] atau langsung menggunakan .jar yang disertakan dengan SDK.
sumber