send touch events to a device via adb [duplicate]
I am trying to send touch events to a device using adb shell
command,开发者_StackOverflow社区 so that I can do some basic automation for UI tests. I have followed the discussion in some previous threads regarding this.
I confirmed about getting the events and using sendevent
, to send out 6 events for each touch ( xcoord, ycoord, 2
for press, 2
for release) and it was easy to use this information with sendevent
, but the getevent
command for the touchscreen device seems to generate far too many events.
Has somebody managed to send touch event from adb
to a device? Could you please share the solution.
I am working on recording the touch events on phone. After that I wish to send the same event back to the device as part of UI testing.
Please help
Android comes with an input
command-line tool that can simulate miscellaneous input events.
To simulate a tap
, use:
input tap x y
Run the input
command remotely using adb shell
:
adb shell input tap x y
Other options are:
shell@m0:/ $ input
input
usage: input ...
input text <string>
input keyevent <key code number or name>
input [touchscreen|touchpad|touchnavigation] tap <x> <y>
input [touchscreen|touchpad|touchnavigation] swipe <x1> <y1> <x2> <y2> [duration(ms)]
input trackball press
input trackball roll <dx> <dy>
To send touch event you need to do:
Set coordinates:
adb shell sendevent /dev/input/event2 3 0 x adb shell sendevent /dev/input/event2 3 1 y
Send touch event (must have
0 0 0
pair):adb shell sendevent /dev/input/event2 1 330 1 adb shell sendevent /dev/input/event2 0 0 0
Send release finger event (must have
0 0 0
pair):adb shell sendevent /dev/input/event2 1 330 0 adb shell sendevent /dev/input/event2 0 0 0
Please note:
You can record events:
adb shell getevent
If you use
getevent
all event values are in hex.
I managed to record a session and replay it with only bash and adb.
This what I did, I hope it helps someone.
Record a series of events
Set up the pc to record data in a file (
/tmp/android-touch-events.log
)$ adb shell getevent | grep --line-buffered ^/ | tee /tmp/android-touch-events.log
- do some stuff on the phone
- stop the adb command on the pc with
ctrl-c
Replay the recorded events
This command will do the hex conversion in awk
$ awk '{printf "%s %d %d %d\n", substr($1, 1, length($1) -1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4)}' /tmp/android-touch-events.log | xargs -l adb shell sendevent
You might want to use monkeyrunner like this:
$ monkeyrunner
>>> from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
>>> device = MonkeyRunner.waitForConnection()
>>> device.touch(200, 400, MonkeyDevice.DOWN_AND_UP)
You can also do a drag, start activies etc. Have a look at the api for MonkeyDevice.
精彩评论