วิธีใช้ ADB เพื่อส่งเหตุการณ์การสัมผัสไปยังอุปกรณ์โดยใช้คำสั่ง sendevent


91

ฉันพยายามส่งเหตุการณ์การสัมผัสไปยังอุปกรณ์ที่ใช้ AndroidDebugBridge เพื่อที่ฉันจะได้ทำการทดสอบ UI โดยอัตโนมัติ ผมได้ติดตามการอภิปรายในLINK ฉันสามารถใช้ sendevent เพื่อจำลองการสัมผัสบนอีมูเลเตอร์ได้ แต่ไม่สามารถทำแบบเดียวกันนี้บนอุปกรณ์

เช่นเดียวกับในลิงค์ด้านบนโปรแกรมจำลองดูเหมือนว่าจะส่ง 6 เหตุการณ์สำหรับการสัมผัสแต่ละครั้ง (xcoord, ycoord, 2 สำหรับการกด, 2 สำหรับการเปิดตัว) และมันง่ายที่จะใช้ข้อมูลนี้เพื่อส่งเหตุการณ์ แต่สิ่งที่ได้รับสำหรับหน้าจอสัมผัสสำหรับอุปกรณ์ดูเหมือนจะ สร้างเหตุการณ์มากเกินไป

มีใครจัดการส่งสัมผัสจาก ADB ไปยังอุปกรณ์ได้บ้าง? คุณช่วยกรุณาแบ่งปันวิธีแก้ปัญหา


ในอุปกรณ์คุณตรวจสอบว่าคุณส่งต่อเหตุการณ์ไปยัง "อุปกรณ์อินพุต" ที่เหมาะสมหรือไม่ กล่าวคือ. อุปกรณ์อินพุตที่ลงทะเบียนเป็นไดรเวอร์สัมผัส?
TheCodeArtist

คำตอบ:


138

Android มาพร้อมกับinputเครื่องมือบรรทัดคำสั่งที่สามารถจำลองเหตุการณ์การป้อนข้อมูลเบ็ดเตล็ด ในการจำลองการแตะให้ทำดังนี้

input tap x y

คุณสามารถใช้ adb shell (> 2.3.5) เพื่อรันคำสั่งจากระยะไกล:

adb shell input tap x y

2
มันทำงานได้อย่างสมบูรณ์แบบบน Nox App โดยใช้ nox_adb.exe ขอบคุณ!
Smeterlink

2
สำหรับการทดสอบการแตะสองครั้งฉันเขียนการคลิกแบบวนซ้ำเช่นนี้ i = 0; ในขณะที่ [$ (($ i)) -le 2]; ฉัน = $ (($ i + 1)); อินพุตแตะ 500800; เสร็จแล้ว; แต่มันคือการคลิกสถานที่ทุก ๆ วินาที ฉันสามารถทำได้เร็วขึ้นโดยใช้เทอร์มินัลหรือไม่
Vignesh KM

67

ในการดำเนินการบางอย่าง (เช่นเปิดเว็บเบราว์เซอร์) คุณต้องหาตำแหน่งที่จะแตะก่อน ก่อนอื่นคุณสามารถเรียกใช้:

adb shell getevent -l

เมื่อคุณกดอุปกรณ์ในตำแหน่งที่คุณต้องการคุณจะเห็นผลลัพธ์นี้:

<...>
/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 กำลังแจ้งให้คุณทราบว่ามีการกดปุ่ม (ปุ่มลง) ที่ตำแหน่ง 2f5, 69e ในเลขฐานสิบหกซึ่งเท่ากับ 757 และ 1694 เป็นทศนิยม

หากตอนนี้คุณต้องการสร้างเหตุการณ์เดียวกันคุณสามารถใช้คำสั่งแตะอินพุตที่ตำแหน่งเดียวกัน:

adb shell input tap 757 1694

สามารถดูข้อมูลเพิ่มเติมได้ที่:

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


12
ในการค้นหาพิกัดการสัมผัสฉันขอแนะนำให้ใช้ตัวเลือกสำหรับนักพัฒนา -> แสดงตำแหน่งการสัมผัส นอกจากนี้ยังให้ค่าเป็นทศนิยม
ประวีณ

3
adb shell input tap $((16#2f5)) $((16#69e))หากคุณไม่ต้องการให้มีการแปลงฐานสิบหกทศนิยมคุณสามารถให้เปลือกของคุณทำมันได้ นอกจากนี้เพื่ออวดรู้ 0x2F5 และ 0x69E คือ 757 และ 1694 ตามลำดับ ... คุณใช้อะไรในการแปลงระหว่างฐาน?
ghoti

ขอบคุณ @ghoti ไม่แน่ใจว่าฉันต้องคัดลอกออกจากจุดอื่นหรืออะไรทำนองนั้น ...
Tomas

จากสิ่งนี้ฉันสร้างคำสั่ง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))}'ที่ทำให้ตำแหน่งการแตะเป็นจำนวนเต็ม
kyczawon

12

2.3.5 ไม่มีinput tapเพียงinput keyeventและinput text คุณสามารถใช้ Monkeyrunner ได้: (นี่คือสำเนาของคำตอบที่https://stackoverflow.com/a/18959385/1587329 ):

คุณอาจต้องการใช้Monkeyrunnerดังนี้:

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

นอกจากนี้คุณยังสามารถทำลากเริ่มต้นกิจกรรมอื่น ๆ มีลักษณะที่ API สำหรับMonkeyDevice


5

คุณไม่จำเป็นต้องใช้

adb เชลล์ getevent -l

คุณต้องเปิดใช้งานในตัวเลือกสำหรับนักพัฒนาบนอุปกรณ์ [แสดงข้อมูลการสัมผัส] เพื่อรับ X และ Y

ข้อมูลเพิ่มเติมสามารถพบได้ในบทความของฉันที่นี่: https://mobileqablog.wordpress.com/2016/08/20/android-automatic-touchscreen-taps-adb-shell-input-touchscreen-tap/


5

จากคำตอบของ Tomas นี่เป็นวิธีที่ดีที่สุดในการค้นหาตำแหน่งการแตะตำแหน่งเป็นจำนวนเต็มที่ฉันพบ:

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 -lเพื่อรับรายการเหตุการณ์โดยใช้ grep สำหรับABS_MT_POSITION (รับบรรทัดที่มีเหตุการณ์การสัมผัสเป็นเลขฐานสิบหก) และสุดท้ายใช้ awk เพื่อรับค่าฐานสิบหกที่เกี่ยวข้องดึงค่าศูนย์ออกและแปลงฐานสิบหกเป็นจำนวนเต็ม สิ่งนี้จะพิมพ์พิกัด x และ y ในเทอร์มินัลอย่างต่อเนื่องเมื่อคุณกดบนอุปกรณ์เท่านั้น

จากนั้นคุณสามารถใช้คำสั่ง adb shell เพื่อส่งคำสั่ง:

adb shell input tap x y

4

ลองใช้uiautomatorของ Android กับ adb shell uiautomator [... ] หรือใช้. jar ที่มาพร้อมกับ SDK โดยตรง


BTW มีเครื่องมือบางอย่างในตลาดที่ทำให้การทดสอบระบบอัตโนมัติของ Android ง่ายขึ้นสำหรับคุณ
Elist
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.