Làm cách nào để sử dụng ADB để gửi các sự kiện chạm tới thiết bị bằng lệnh sendevent?


88

Tôi đang cố gắng gửi các sự kiện chạm đến một thiết bị bằng AndroidDebugBridge để tôi có thể thực hiện một số tự động hóa cơ bản cho các bài kiểm tra giao diện người dùng. Tôi đã theo dõi cuộc thảo luận trong LINK . Tôi có thể sử dụng sendevent để mô phỏng thao tác chạm trên trình giả lập, nhưng không thể làm điều tương tự trên thiết bị.

Giống như trong liên kết trên, trình giả lập dường như gửi ra 6 sự kiện cho mỗi lần chạm (xcoord, ycoord, 2 cho báo chí, 2 cho phát hành) và thật dễ dàng để sử dụng thông tin này cho người gửi, nhưng một sự kiện dành cho màn hình cảm ứng cho một thiết bị dường như tạo ra quá nhiều sự kiện.

Ai đó đã quản lý để gửi liên lạc từ ADB tới một thiết bị chưa? Bạn có thể vui lòng chia sẻ giải pháp.


Trên thiết bị, bạn đã kiểm tra xem mình có đang chuyển các sự kiện đến "thiết bị đầu vào" thích hợp không? I E. thiết bị đầu vào được đăng ký làm trình điều khiển cảm ứng?
TheCodeArtist

Câu trả lời:


135

Android đi kèm với một inputcông cụ dòng lệnh có thể mô phỏng các sự kiện đầu vào khác. Để mô phỏng thao tác khai thác, đó là:

input tap x y

Bạn có thể sử dụng adb shell (> 2.3.5) để chạy lệnh từ xa:

adb shell input tap x y

2
Nó hoạt động hoàn hảo trên Ứng dụng Nox bằng cách sử dụng nox_adb.exe cảm ơn bạn!
Smeterlink

2
Đối với Thử nghiệm nhấn đúp, tôi đã viết một cú nhấp chuột lặp lại như thế này i = 0; while [$ (($ i)) -le 2]; do i = $ (($ i + 1)); tap đầu vào 500 800; làm xong; Nhưng nó đang nhấp vào vị trí mỗi giây. tôi có thể làm điều đó nhanh hơn bằng cách sử dụng thiết bị đầu cuối không?
Vignesh KM

66

Để thực hiện một hành động cụ thể (ví dụ: mở trình duyệt web), trước tiên bạn cần tìm ra nơi để nhấn. Để làm điều đó, trước tiên bạn có thể chạy:

adb shell getevent -l

Khi bạn nhấn vào thiết bị, tại vị trí bạn muốn, bạn sẽ thấy đầu ra này:

<...>
/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 cho bạn biết rằng một phím đã được nhấn (nút xuống) ở vị trí 2f5, 69e trong hệ thập lục phân là 757 và 1694 trong hệ thập phân.

Nếu bây giờ bạn muốn tạo cùng một sự kiện, bạn có thể sử dụng lệnh gõ đầu vào ở cùng một vị trí:

adb shell input tap 757 1694

Thông tin thêm có thể được tìm thấy tại:

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


11
Để tìm các tọa độ cảm ứng, tôi khuyên bạn nên sử dụng Tùy chọn nhà phát triển -> Hiển thị Vị trí cảm ứng. Ngoài ra, nó cung cấp các giá trị ở dạng số thập phân.
Praveen

3
Nếu bạn không muốn phải chuyển đổi hex để thập phân, bạn có thể cho vỏ của bạn làm điều đó: adb shell input tap $((16#2f5)) $((16#69e)). Ngoài ra, chỉ để nói về pedantic, 0x2F5 và 0x69E lần lượt là 757 và 1694 ... Bạn đã sử dụng gì để chuyển đổi giữa các base?
ghoti

Cảm ơn @ghoti không chắc tôi phải sao chép nó đi một điểm hoặc một cái gì đó như thế ...
Tomas

Xây dựng trên cơ sở này, tôi đã tạo lệnh 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))}'lấy vị trí nhấn dưới dạng số nguyên
kyczawon

12

2.3.5 không có input tap, chỉ input keyeventinput text Bạn có thể sử dụng Monkeyrunner cho nó: (đây là bản sao của câu trả lời tại https://stackoverflow.com/a/18959385/1587329 ):

Bạn có thể muốn sử dụng Monkeyrunner như thế này:

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

Bạn cũng có thể thực hiện kéo, bắt đầu các hoạt động, v.v. Hãy xem api cho MonkeyDevice .



4

Cân nhắc sử dụng uiautomator của Android , với adb shell uiautomator [...] hoặc trực tiếp sử dụng .jar đi kèm với SDK.


BTW, có một số công cụ trên thị trường có thể giúp bạn kiểm tra Tự động hóa của Android dễ dàng hơn.
Elist

4

Dựa trên câu trả lời của Tomas, đây là cách tiếp cận tốt nhất để tìm vị trí nhấn vị trí dưới dạng số nguyên mà tôi đã tìm thấy:

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

Sử dụng adb shell getevent -l để lấy danh sách các sự kiện, sử dụng grep for ABS_MT_POSITION(lấy dòng có các sự kiện chạm trong hex) và cuối cùng sử dụng awk để lấy các giá trị hex có liên quan, loại bỏ chúng bằng số không và chuyển hex thành số nguyên. Thao tác này liên tục in các tọa độ x và y trong thiết bị đầu cuối chỉ khi bạn nhấn vào thiết bị.

Sau đó, bạn có thể sử dụng lệnh adb shell này để gửi lệnh:

adb shell input tap x y
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.