如何使用ADB通过sendevent命令将触摸事件发送到设备?


89

我正在尝试使用AndroidDebugBridge将触摸事件发送到设备,以便可以进行UI测试的一些基本自动化操作。我关注了LINK中的讨论。我能够使用sendevent在模拟器上模拟触摸,但是无法在设备上执行相同操作。

就像上面的链接一样,仿真器似乎每次触摸都会发送6个事件(xcoord,ycoord,2个用于新闻,2个用于释放),并且很容易使用此信息发送事件,但是设备触摸屏的getevent似乎可以产生太多事件。

是否有人设法将触摸从ADB发送到设备?您能否分享解决方案。


在设备上,您是否检查过是否将事件传递给正确的“输入设备”?即。输入设备已注册为触摸驱动器?
TheCodeArtist 2011年

Answers:


135

Android随附了input可模拟其他输入事件的命令行工具。为了模拟点击,它是:

input tap x y

您可以使用adb shell(> 2.3.5)远程运行命令:

adb shell input tap x y

2
它使用nox_adb.exe在Nox应用程序上完美运行,谢谢!
Smeterlink

2
为了测试双击,我编写了一个循环单击,例如i = 0;而[$(($ i))-le 2]; i = $((($ i + 1)); 输入抽头500800; 完成 但是它每秒钟点击一次该位置。我可以使用终端更快吗?
Vignesh KM

66

为了执行特定操作(例如,打开Web浏览器),您需要首先确定点击位置。为此,您可以先运行:

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。

如果现在要生成相同的事件,则可以在相同位置使用input tap命令:

adb shell input tap 757 1694

可以在以下位置找到更多信息:

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


11
要找到触摸坐标,我建议使用开发人员选项->显示触摸位置。同样,它以十进制形式给出值。
Praveen

3
如果您不想将十六进制转换为十进制,则可以让您的shell执行: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 tapinput keyeventinput 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)

您还可以进行拖动,启动活动等。看一下MonkeyDevice的api 。



4

考虑使用带有adb shell uiautomator [...]的Android uiautomator或直接使用SDK随附的.jar。


顺便说一句,市场上有一些工具可以使您的Android自动化测试相当容易。
Elist 2013年

4

以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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.