核心工具:uiautomator2
对于 Python 自动化 Android uiautomator2 (简称 u2) 是目前最主流、功能最强大的库,它的工作原理如下:
- 在手机端安装一个“Agent”:这个 Agent 是一个 Android App,它运行在你的手机上,负责执行具体的操作(如点击、输入、获取界面元素等)。
- PC 端的 Python 脚本:你的 Python 脚本通过 HTTP 协议向手机上的 Agent 发送指令。
- 交互流程:Python 脚本 -> 发送指令 -> 手机 Agent 接收并执行 -> 返回结果 -> Python 脚本接收结果。
第一步:环境搭建
你需要准备两样东西:一台 Android 手机/模拟器 和一台电脑。
手机端设置(以 Android 手机为例)
a. 开启开发者选项和 USB 调试
- 进入手机的 “设置” -> “关于手机”。
- 连续点击 “版本号” 或 “内部版本号” 7次左右,直到提示“您已处于开发者模式”。
- 返回 “设置”,找到 “开发者选项”。
- 在开发者选项中,开启 “USB 调试”。
b. 安装 uiautomator2 的 Agent App
最简单的方法是使用 uiautomator2 库自带的命令行工具。
在你的电脑上(确保已安装 Python 和 pip),执行以下命令:
pip install --pre uiautomator2
通过 USB 线将手机连接到电脑,在电脑上执行:
python -m uiautomator2 init
这个命令会自动完成以下操作:
- 检查 ADB 是否可用。
- 在你的手机上安装一个名为
ATX的 App(也就是 Agent)。 - 启动一个 HTTP 服务器,监听来自电脑的连接。
手机上会弹出授权请求,允许 USB 调试和安装应用,请点击“允许”。
电脑端设置
确保你的电脑上安装了:
- Python 3.x
- Android Platform Tools (包含
adb命令),这是uiautomator2依赖的工具,用于与设备通信。
在 Windows 上,你可以直接下载 SDK Platform Tools for Windows,在 macOS 或 Linux 上,可以通过包管理器安装,例如在 Ubuntu 上:sudo apt-get install android-tools-adb。
第二步:编写你的第一个自动化脚本
手机和电脑已经连接好了,我们来写一个简单的脚本,实现“打开微信 -> 点击搜索框 -> 输入 'Python'”的功能。
安装 Python 库
pip install uiautomator2
编写 Python 代码 (test_wechat.py)
import uiautomator2 as u2
import time
# 1. 连接设备
# 如果是通过 USB 连接,u2 会自动识别
# 如果是通过 Wi-Fi 连接,需要指定 IP, d = u2.connect("192.168.1.100:5555")
d = u2.connect()
print("设备已连接:", d.info)
# 2. 启动微信
print("正在启动微信...")
d.app_start("com.tencent.mm")
time.sleep(5) # 等待微信启动
# 3. 点击搜索框
# 使用 resourceId 定位元素,这是最稳定的方式之一
# 你可以使用 uiautomator2 的 dump 命令来获取元素属性
print("正在点击搜索框...")
d(resourceId="com.tencent.mm:id/h9").click()
# 4. 在搜索框中输入文字
print("正在输入 'Python'...")
d(resourceId="com.tencent.mm:id/f0").set_text("Python")
# 5. 等待几秒,观察效果
time.sleep(5)
# 6. (可选)关闭微信
# d.app_stop("com.tencent.mm")
print("脚本执行完毕!")
如何获取元素的 resourceId?
这是一个非常关键的问题。uiautomator2 提供了一个强大的命令来帮你获取当前界面的所有 UI 元素信息。
- 在电脑上,连接你的设备。
- 打开你想要操作的 App 界面(比如微信的聊天列表)。
- 在电脑命令行中执行:
python -m uiautomator2 dump
- 这会在当前目录生成一个
hierarchy.xml文件,用浏览器打开这个文件,你就能看到当前界面上所有元素的树形结构,包括它们的resourceId,text,className等信息,方便你编写定位代码。
第三步:uiautomator2 的核心 API
uiautomator2 提供了非常丰富的 API 来操作设备。
设备控制
d.screen_on: 检查屏幕是否亮着。d.wake_up: 唤醒屏幕。d.press("home"): 按下 Home 键。d.press("back"): 按下返回键。d.press("recent"): 按下多任务键。d.swipe(start_x, start_y, end_x, end_y, duration=0.5): 滑动屏幕。d.orientation: 获取或设置屏幕方向 ("natural","left","right","upsidedown")。
App 控制
d.app_start("com.example.app"): 启动 App。d.app_stop("com.example.app"): 停止 App(不保留后台)。d.app_clear("com.example.app"): 清除 App 数据。d.current_app(): 获取当前正在运行的 App 信息。
元素定位与操作
这是最常用的部分,u2 提供了多种定位方式,推荐优先使用 resourceId。
-
单个元素
d(resourceId="com.tencent.mm:id/h9"): 通过 resourceId 定位。d(text="微信"): 通过 text 定位。d(description="搜索"): 通过 contentDescription 定位。d(className="android.widget.Button"): 通过 className 定位。d(index=0): 通过索引定位(第几个元素)。
-
元素操作
.click(): 点击。.long_click(): 长按。.set_text("hello"): 输入文本(通常用于输入框)。.get_text(): 获取元素的文本。.exists(): 判断元素是否存在。.info: 获取元素的详细信息(坐标、大小、属性等)。
-
多个元素
d(textContains="搜索"): 定位 text 包含 "搜索" 的所有元素。d(classNameMatches="android.widget.*Button"): 定位 className 匹配正则表达式的所有元素。- 遍历:
for el in d(text="联系人"): el.click()
第四步:其他自动化方案
虽然 uiautomator2 是首选,但在某些特定场景下,你可能需要其他工具。
Airtest
- 简介:网易出品的一个跨平台(Android & iOS)的自动化测试框架,它底层也使用了
uiautomator2,但提供了更友好的图形化界面和脚本录制功能。 - 特点:
- 图形化界面:可以像玩游戏一样,在界面上点击、滑动来生成脚本,对新手非常友好。
- 断言:内置了丰富的断言方法,方便进行 UI 测试。
- 报告生成:可以一键生成包含截图、步骤和日志的 HTML 测试报告。
- 适用场景:UI 自动化测试、快速原型验证。
ADB (Android Debug Bridge) 命令
- 简介:这是 Android 官方提供的命令行工具,是所有自动化工具的底层基础。
- 特点:
- 无需安装 App:直接与系统交互。
- 功能强大:可以执行很多
uiautomator2无法做到的操作,如安装/卸载 App、获取日志、屏幕录制等。 - 无法操作 UI:ADB 本身不能直接点击或输入文本,它主要是用于系统级操作。
- 适用场景:结合
uiautomator2使用,用uiautomator2操作 UI,用 ADB 命令来安装测试包或获取系统日志。
Frida
- 简介:一个动态代码注入工具,它可以在 App 运行时修改其代码,实现hook函数、调用方法等操作。
- 特点:
- 深入应用内部:可以绕过一些基于 UI 的限制(如加密、签名验证)。
- 性能影响小:比 Instrumentation 等方式更轻量。
- 学习曲线陡峭:需要一定的 Java/Kotlin 和逆向工程知识。
- 适用场景:应用安全分析、协议分析、深度自动化(处理非 UI 层的逻辑)。
总结与选择
| 工具 | 核心原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| uiautomator2 | 手机 Agent + HTTP | 功能强大、API丰富、稳定、社区活跃 | 需要安装 Agent App | UI自动化测试、数据爬取、通用自动化任务(首选) |
| Airtest | 基于 uiautomator2 | 图形化界面、易上手、报告生成友好 | 灵活性不如直接写代码 | UI自动化测试、快速脚本录制与生成 |
| ADB | 官方命令行 | 无需安装、系统级操作强大 | 无法操作 UI 元素 | 辅助工具(安装/卸载、日志、屏幕录制) |
| Frida | 动态代码注入 | 功能最强大、可深入应用内部 | 学习成本高、技术门槛高 | 安全研究、逆向分析、破解自动化 |
给你的建议:
- 如果你是初学者,或者想完成大多数自动化任务:从
uiautomator2开始,它是目前最平衡、最实用的选择。 - 如果你是专业的 QA 工程师,需要编写大量 UI 测试用例:可以尝试 Airtest,它的图形化界面和报告功能能极大提升效率。
- 如果你需要获取 App 内部数据或绕过某些限制:在掌握
uiautomator2的基础上,可以学习 Frida 来实现更高级的目标。
希望这份详细的指南能帮助你顺利开启 Android Python 自动化的旅程!
