Android 如何使用ADB使用sendevent命令向设备发送触摸事件?

Android 如何使用ADB使用sendevent命令向设备发送触摸事件?,android,automation,adb,touchscreen,Android,Automation,Adb,Touchscreen,我正在尝试使用AndroidDebugBridge将触摸事件发送到设备,以便能够对UI测试进行一些基本的自动化。我一直关注着这次讨论。我能够使用sendevent在模拟器上模拟触控,但在设备上无法做到这一点 与上面的链接类似,emulator似乎会为每次触摸发送6个事件(xcoord、ycoord、2个用于按下,2个用于释放),使用此信息发送事件很容易,但设备触摸屏的getevent似乎会生成太多的事件 是否有人成功地将触摸从ADB发送到设备?请分享解决方案。Android附带了一个输入命令行工

我正在尝试使用AndroidDebugBridge将触摸事件发送到设备,以便能够对UI测试进行一些基本的自动化。我一直关注着这次讨论。我能够使用sendevent在模拟器上模拟触控,但在设备上无法做到这一点

与上面的链接类似,emulator似乎会为每次触摸发送6个事件(xcoord、ycoord、2个用于按下,2个用于释放),使用此信息发送事件很容易,但设备触摸屏的getevent似乎会生成太多的事件


是否有人成功地将触摸从ADB发送到设备?请分享解决方案。

Android附带了一个
输入
命令行工具,可以模拟各种输入事件。要模拟攻丝,它是:

input tap x y
您可以使用adb外壳(>2.3.5)远程运行命令:

adb shell input tap x y

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

2.3.5没有
input tap
,只有
input keyevent
input text
您可以使用monkeyrunner(这是答案的副本,位于):

您可能希望这样使用:

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


要执行特定操作(例如打开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 shell getevent-l

命令,您只需在设备上启用开发者内选项[显示触摸数据]即可获得X和Y


在我的文章中可以找到更多信息:

基于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
获取事件列表,使用
ABS\u mtu\u POSITION
的grep(获取带有十六进制触摸事件的行),最后使用awk获取相关十六进制值,去掉它们的零并将十六进制转换为整数。仅当您按下设备时,才在终端上连续打印x和y坐标

然后可以使用此adb shell命令发送命令:

adb shell input tap x y

在设备上,您是否检查了是否将事件传递到正确的“输入设备”?注册为触摸驱动程序的输入设备?顺便说一句,市场上有一些工具可以让Android的自动化测试对你来说非常容易。它使用Nox_adb.exe在Nox应用程序上完美工作谢谢!为了测试双击,我写了一个循环点击,像这样i=0;而[$($i))-le2];i=$($i+1));输入抽头500 800;完成;但它每一秒钟就点击一次。我可以使用终端更快地完成吗?要查找触摸坐标,我建议使用开发者选项-->显示触摸位置。此外,它以小数形式给出值。如果您不想将十六进制转换为十进制,您可以让shell执行:
adb shell input tap$((16#2f5))$((16#69e))
。另外,为了学究的意思,0x2F5和0x69E分别是757和1694。。。你用什么在基之间转换?谢谢@ghoti我不确定我一定是从另一个点或类似的东西上复制了它…在此基础上,我构建了命令
adb shell getevent-l | grep ABS | u MT|u POSITION--line buffered | awk'{a=substr($0,54,8);sub(/^0+/,“”,a);b=sprintf(“0x%s”,a);printf(%d\n),strotum(b))}“
以整数形式获取点击位置
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 input tap x y