【问题标题】:How to use ADB to send touch events to device using sendevent command?如何使用 ADB 使用 sendevent 命令向设备发送触摸事件?
【发布时间】:2010-08-09 06:09:53
【问题描述】:

我正在尝试使用 AndroidDebugBridge 将触摸事件发送到设备,以便我可以为 UI 测试做一些基本的自动化操作。我关注了LINK 的讨论。我可以使用 sendevent 来模拟模拟器上的触摸,但无法在设备上做同样的事情。

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

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

【问题讨论】:

  • 在设备上,您是否检查过是否将事件传递给正确的“输入设备”? IE。注册为触摸驱动程序的输入设备?

标签: android automation adb touchscreen


【解决方案1】:

Android 带有一个input 命令行工具,可以模拟各种输入事件。为了模拟敲击,它是:

input tap x y

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

adb shell input tap x y

【讨论】:

  • 使用 nox_adb.exe 在 Nox App 上完美运行谢谢!
  • 为了测试双击我写了一个循环点击像这样 i=0;而 [ $(($i)) -le 2 ];做 i=$(($i + 1));输入抽头 500 800;完毕;但它每秒钟都在点击这个地方。我可以使用终端更快吗?
【解决方案2】:

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

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

【讨论】:

  • 要查找触摸坐标,我建议使用开发人员选项 --> 显示触摸位置。此外,它以小数形式给出值。
  • 如果你不想将十六进制转换为十进制,你可以让你的shell来做:adb shell input tap $((16#2f5)) $((16#69e))。另外,为了迂腐,0x2F5 和 0x69E 分别是 757 和 1694……你用什么来转换基数?
  • 谢谢@ghoti 不确定我一定是从另一个点或类似的地方复制了它......
  • 在此基础上,我构建了命令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))}',它以整数形式获取点击位置
【解决方案3】:

2.3.5 没有input tap,只有input 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 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
      

      【讨论】:

      • 您的回答很好,我们可以使用此命令将这些整数进一步发送到另一个设备,例如从物理键盘读取触摸事件,同时使用 sendevents 我们可以将它们转发到另一个虚拟键盘
      【解决方案6】:

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

      【讨论】:

      • 顺便说一句,市场上有一些工具可以让您更轻松地进行 Android 的自动化测试。
      猜你喜欢
      • 1970-01-01
      • 2023-04-10
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 2013-04-02
      • 1970-01-01
      相关资源
      最近更新 更多