14、文本输入与剪贴板:adb shell input text(输入文本)、adb shell am broadcast(操作剪贴板)、实战:自动化填写表单

各位好,欢迎来到第十四章。

前面我们聊了那么多ADB命令,大部分都是在「看」——看日志、看设备信息、看进程。今天咱们来点实际的:让手机自己打字

你想想看,如果你能通过一条命令,让手机自动在输入框里填上内容,甚至复制粘贴,那自动化测试、批量填表单、甚至帮女朋友抢购,是不是就变得简单多了?

嗯,这一章我们就来搞定这件事。

14.1 文本输入:adb shell input text

先来最基础的——input text。这个命令的作用很简单:模拟键盘输入。说白了,就是你在电脑上敲一行字,它帮你打到手机当前聚焦的输入框里。

14.1.1 基本用法

用法非常直接:

adb shell input text "Hello World"

执行之后,如果手机当前光标在某个输入框里,就会自动填入 Hello World

但这里有个坑——空格和特殊字符。我刚开始用的时候,直接写了个带空格的字符串,结果发现只输出了前半段。为什么呢?因为shell会把空格当成参数分隔符。

解决办法有两个:

  • 用双引号把整个字符串包起来:"Hello World"
  • 或者用 %s 转义空格:Hello%sworld
注意:特殊字符如 &|$! 也需要转义。比如输入 a&b,要写成 adb shell input text "a\&b"。我曾经在测试密码框时被这个坑过,调试了半天才发现是shell把 & 解释成了后台运行符号。

14.1.2 输入Unicode字符

中文怎么办?input text 原生不支持中文。你直接写 adb shell input text "你好",大概率会报错或者显示乱码。

我个人习惯的做法是:用剪贴板配合粘贴。后面会讲到。

不过如果你非要硬来,可以试试用 adb shell input keyevent 模拟按键,但那个效率太低了,不推荐。

14.2 操作剪贴板:adb shell am broadcast

好,重点来了。既然 input text 搞不定中文,那我们就换个思路——先把内容放到剪贴板,再粘贴

Android系统里,剪贴板是通过 ClipboardManager 来管理的。我们可以用 am broadcast 发送一个广播,让系统帮我们把文本塞进剪贴板。

14.2.1 设置剪贴板内容

命令长这样:

adb shell am broadcast -a android.intent.action.CLIPBOARD_CHANGED --es "android.intent.extra.TEXT" "你要复制的内容"

等等,这个命令其实有点「取巧」。它并不是直接设置剪贴板,而是模拟一次剪贴板变化事件。真正靠谱的做法,是用 content 命令或者写一个小工具。

不过别急,我给大家一个更实用的方案——input keyevent 模拟长按 + 粘贴

小技巧:如果你只是想快速复制一段文本到剪贴板,可以用 adb shell am broadcast -a clipper.set --es text "内容"。但注意,这个需要设备有 clipper 工具(部分定制ROM自带)。没有的话,可以用下面这个通用方案。

14.2.2 通用剪贴板操作方案

我个人最常用的方法是:settings 命令配合 input 实现。具体来说:

  1. 先用 input keyevent KEYCODE_MOVE_END 把光标移到末尾
  2. 再用 input keyevent KEYCODE_PASTE 粘贴

但前提是——剪贴板里得有内容。所以我们需要先「塞」内容进去。

这里我分享一个我在项目中用过的脚本思路:

# 1. 用 input text 输入一段临时内容(比如一个特殊标记)
adb shell input text "###TEMP###"

# 2. 模拟全选 + 复制
adb shell input keyevent KEYCODE_MOVE_HOME
adb shell input keyevent --longpress KEYCODE_SHIFT_LEFT
adb shell input keyevent KEYCODE_MOVE_END
adb shell input keyevent KEYCODE_COPY

# 3. 现在剪贴板里有 "###TEMP###" 了
# 4. 再用 am broadcast 替换?不行,这个方案太绕了。

# 更直接的方法:用 adb 执行一个简单的 Java 代码
adb shell "echo 'android.content.ClipboardManager clipboard = (android.content.ClipboardManager) getSystemService(CLIPBOARD_SERVICE); clipboard.setText(\"你的内容\");' | dalvikvm -cp /system/framework/framework.jar"

嗯,上面这个有点复杂。实际工作中,我建议直接用 ADB 配合第三方工具,比如 adb shell input text%s 转义,或者用 adb exec-out 配合 clipboard 工具。

核心思路:如果你只是想在自动化测试中填表单,最稳定的方案是——先用 input text 输入英文/数字,再用 input keyevent 模拟粘贴。中文内容提前用其他方式(比如PC端复制)放到剪贴板里。

14.3 实战:自动化填写表单

理论说完了,咱们来点真格的。假设你有一个App,里面有个注册页面,需要填用户名、手机号、邮箱。手动填太慢了,我们用ADB一键搞定。

14.3.1 准备工作

首先,你得知道每个输入框的坐标。可以用 adb shell getevent 或者 adb shell uiautomator dump 来获取。

我个人习惯用 uiautomator

adb shell uiautomator dump /sdcard/ui.xml
adb pull /sdcard/ui.xml
cat ui.xml | grep -o 'bounds="\[[0-9,]*\]"'

拿到坐标后,用 input tap 点击输入框,然后输入内容。

14.3.2 完整脚本

下面是一个完整的bash脚本示例:

#!/bin/bash

# 自动化填写注册表单

# 点击用户名输入框(假设坐标是 100, 200)
adb shell input tap 100 200
sleep 0.5
adb shell input text "test_user_001"

# 点击手机号输入框(假设坐标是 100, 350)
adb shell input tap 100 350
sleep 0.5
adb shell input text "13800138000"

# 点击邮箱输入框(假设坐标是 100, 500)
adb shell input tap 100 500
sleep 0.5
adb shell input text "test@example.com"

# 点击提交按钮(假设坐标是 200, 700)
adb shell input tap 200 700

echo "表单已自动填写并提交"

你看,就这么几行,一个注册流程就自动化了。

优化建议:实际项目中,我建议在每个 input text 之前加一个 sleep 0.3,因为有些App的输入框有动画或者验证逻辑,太快了会丢字符。我曾经在测试一个金融App时,因为输入太快,导致验证码输入框只收到了前三位,排查了半天才发现是速度问题。

14.3.3 处理中文输入

如果表单里有中文怎么办?比如姓名栏要填「张三」。

我的方案是:先用PC端复制好中文,然后用ADB模拟粘贴

具体做法:

  1. 在电脑上复制「张三」到系统剪贴板
  2. adb shell input tap 点击输入框
  3. adb shell input keyevent KEYCODE_PASTE 粘贴

但这里有个前提——电脑剪贴板和手机剪贴板是独立的。所以你需要先把内容传到手机剪贴板里。

我常用的一个技巧:

# 在电脑上把内容写到文件
echo -n "张三" > /tmp/name.txt

# 用 adb push 到手机
adb push /tmp/name.txt /sdcard/name.txt

# 用 adb shell 读取文件内容并设置到剪贴板(需要 root 或特定权限)
adb shell "cat /sdcard/name.txt | xargs -I {} am broadcast -a clipper.set --es text {}"

嗯,这个方案依赖 clipper。如果没有,那就用最笨但最稳的方法——input text 配合 Unicode 转义。虽然麻烦,但至少能跑。

14.4 知识体系总览

为了让你更直观地理解这一章的内容,我画了一张流程图:

文本输入与剪贴板知识体系 input text 命令 • 基本语法:input text "内容" • 空格转义:%s 或双引号 • 特殊字符处理 • 不支持中文(硬伤) 剪贴板操作 • am broadcast 广播方式 • clipper 工具方案 • 模拟按键复制粘贴 • 文件传输+剪贴板 实战:表单自动化 • 获取输入框坐标 • 点击 + 输入 + 粘贴 • 中文输入解决方案 • 完整脚本示例 核心原则:能粘贴就不输入,能输入就不点击,能点击就不手动 —— 自动化测试的「懒人哲学」 💡 遇到中文输入?试试「PC复制 → 文件传输 → 剪贴板设置 → 粘贴」四步法 我在项目中用这个方案处理了上千条中文测试数据,稳定可靠

14.5 避坑指南

最后,分享几个我踩过的坑:

  • 输入框没聚焦就输入input text 必须在输入框有光标时才能生效。记得先 input tap 点击一下。
  • 输入速度太快丢字符:有些App的输入框有防抖逻辑,建议每个字符间隔50ms以上。可以用 sleep 或者循环加延迟。
  • 剪贴板权限问题:Android 10+ 对剪贴板的访问限制更严了。普通App无法读取剪贴板内容,但写入还是可以的。如果你遇到权限问题,试试用 adb shell settings put global enable_clipboard_service 1 开启服务。
  • 特殊字符导致shell报错:比如输入 $ 符号,shell会把它当成变量引用。记得用单引号或者反斜杠转义。

好了,这一章的内容就到这里。文本输入和剪贴板操作,是ADB自动化里非常实用的两个技能。掌握了它们,你就能让手机「自己填表」、「自己复制粘贴」,效率提升不止一个档次。

下一章我们继续深入,聊聊更高级的自动化操作。各位先消化一下今天的内容,有问题随时交流。


公众号:蓝海资料掘金营,微信deep3321