【问题标题】:send touch events to a device via adb [duplicate]通过 adb 将触摸事件发送到设备 [重复]
【发布时间】:2011-05-22 03:34:58
【问题描述】:

我正在尝试使用adb shell 命令将触摸事件发送到设备,以便我可以为 UI 测试做一些基本的自动化。我在之前的一些帖子中对此进行了讨论。

我确认要获取事件并使用 sendevent 为每次触摸发送 6 个事件(xcoord、ycoord、2 用于新闻,2 用于发布),并且很容易将这些信息与 @ 一起使用987654326@,但触摸屏设备的getevent 命令似乎生成了太多事件。

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

我正在记录手机上的触摸事件。之后,我希望将相同的事件发送回设备作为 UI 测试的一部分。

请帮忙

【问题讨论】:

标签: android adb


【解决方案1】:

Android 带有一个input 命令行工具,可以模拟各种输入事件。
要模拟tap,请使用:

input tap x y

使用adb shell远程运行input命令:

adb shell input tap x y

其他选项有:

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>

【讨论】:

  • 我只有textkeyevent
  • 一些 android 带有残缺的二进制文件。
【解决方案2】:

要发送触摸事件你需要做的:

  1. 设置坐标:

    adb shell sendevent /dev/input/event2 3 0 x
    adb shell sendevent /dev/input/event2 3 1 y
    
  2. 发送触摸事件(必须有0 0 0对):

    adb shell sendevent /dev/input/event2 1 330 1
    adb shell sendevent /dev/input/event2 0 0 0
    
  3. 发送释放手指事件(必须有0 0 0对):

    adb shell sendevent /dev/input/event2 1 330 0
    adb shell sendevent /dev/input/event2 0 0 0
    

请注意:

  1. 您可以记录事件:

    adb shell getevent
    
  2. 如果您使用getevent,所有事件值都是十六进制的。

【讨论】:

  • 你的意思是,getevent以十六进制记录,而sendevent只接受十进制???
  • 是的,getevent 以十六进制打印,但仅适用于十进制。没有打印错误,只是不做任何事情:)
  • 这里的解决方案是什么?我必须手动将所有十六进制转换为十进制吗?
  • 是的,您只需将其转换为十进制即可。
【解决方案3】:

我设法记录了一个会话并仅使用 bash 和 adb 重播它。

这是我做的,我希望它对某人有所帮助。

记录一系列事件

  1. 设置电脑将数据记录到文件中(/tmp/android-touch-events.log

    $ adb shell getevent | grep --line-buffered ^/ | tee /tmp/android-touch-events.log
    
  2. 在手机上做一些事情
  3. ctrl-c停止电脑上的adb命令

回放记录的事件

此命令将在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

【讨论】:

  • "awk: bailing out at source line 1" 这个错误来了。你有什么想法吗?
  • 重播命令在 OSX 上不起作用。 xargs:非法选项--l; awk: 调用未定义的函数 strtonum
  • @geeth 似乎是someone has found it, too。抱歉,我使用的是 GNU/Linux。
  • 这对我很有用,但是我需要在每行之间有一个延迟。我试过这个,但没有用: awk '{printf "%s %d %d %d\n", substr($1, 1, length($1) -1), strtonum("0x"$2), strtonum("0x"$3), strtonum("0x"$4);sleep 5}' android-touch-events.log | xargs -l adb shell 发送事件
  • 我仍然得到 xargs: 非法选项 -- l。命令中使用了哪个选项?
【解决方案4】:

您可能想像这样使用monkeyrunner

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    相关资源
    最近更新 更多