1. 为什么 adb 连接总是先给你一个下马威
Windows 上搭 Appium + Python Client + 夜神模拟器,真正卡人的往往不是写脚本,而是环境连通。你打开夜神,敲下adb devices,结果要么列表空空,要么蹦出一句adb server version(31) doesn't match this client (36)。这不是你代码写错了,而是两个 adb 在打架:夜神自带一份 adb,Android SDK 里又有一份,版本号对不上,服务端和客户端互相不认。
这篇就按“能跑起来”的顺序走一遍:先把 adb 版本冲突解决掉,让夜神设备被正确识别;再启动 Appium Server,用 Python Client 建立 session;最后跑通第一个测试用例,并顺手把包名、Activity、元素定位这些后续要用的东西拿到手。适合刚接触移动端自动化、在 Windows 上用夜神做练习环境的同学。全程命令和配置都可以直接复制,遇到报错我也会把排查路径写清楚。
需要说明的是,Appium 本身是开源测试框架,Python Client 只是它的一个客户端库,两者配合夜神模拟器就能完成大部分 Android UI 自动化练习。下面所有操作都在 Windows 本机完成,不涉及任何网络穿透类工具。
2. 前置准备:TaoToken 与依赖清单
在动手之前,先把要装的东西列清楚,避免中途缺件。Appium 生态里版本兼容比较敏感,建议按下面这套组合来:
| 组件 | 作用 | 建议版本/来源 |
|---|---|---|
| Node.js | Appium Server 运行依赖 | 16 LTS 及以上 |
| Appium Server | 提供 WebDriver 接口 | 通过 npm 全局安装 |
| Appium-Python-Client | Python 侧调用库 | pip 安装 |
| 夜神模拟器 | Android 运行环境 | 官网最新版 |
| Android SDK platform-tools | 提供 adb、aapt | 随 SDK 安装 |
| Python | 跑测试脚本 | 3.8 及以上 |
安装 Appium Server 和 Python Client 的命令如下,建议在管理员权限的终端里执行:
npm install -g appium pip install Appium-Python-Client如果你后续要长期跑编码类或 Agent 类任务,把模型调用和密钥管理集中起来会省很多事。TaoToken 的 Coding Plan 适合这种长期编码场景,模型对话入口可以用来验证接口是否通,API Key 则在控制台统一生成管理。这几个入口分别是:
- 模型对话:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=model_chat
- Coding Plan:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=coding_plan
- 控制台:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=console
- API Keys:https://taotoken.net/api?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=api_keys
官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 基础地址为 https://taotoken.net/api 。这些和 Appium 环境本身不冲突,属于你后续写脚本时可能用到的配套能力,先知道入口在哪即可。
3. 解决 adb 版本冲突并连接夜神
3.1 定位两份 adb
报错adb server version(31) doesn't match this client (36)的含义很直白:夜神目录下的 adb 是 31 版,SDK 目录下的是 36 版。谁先启动,谁就占了 5037 端口当服务端,另一个版本连上来就不认。
先确认两个路径:
- SDK 的 platform-tools,常见为
C:\Program Files (x86)\Android\android-sdk\platform-tools - 夜神安装目录,常见为
C:\Program Files (x86)\Nox\bin或D:\Program Files (x86)\Nox\bin
3.2 用 SDK 的 adb 替换夜神的
操作前先彻底关掉夜神模拟器,然后打开任务管理器,确认adb.exe和nox_adb.exe两个进程都已经结束。有残留就手动结束,否则文件被占用替换会失败。
接着做替换:
- 把 SDK 目录下的
adb.exe复制到夜神bin目录; - 把夜神原本的
adb.exe改名为adb_bak.exe,nox_adb.exe改名为nox_adb_bak.exe; - 把复制过来的
adb.exe再复制一份,重命名为nox_adb.exe。
这样夜神启动时调用的就是 SDK 同版本的 adb,版本号一致,冲突消失。改完后在终端执行一次:
adb version确认输出的是同一个版本号即可。
3.3 连接夜神设备
夜神默认的 adb 端口是 62001,不同版本可能略有差异,以你本机为准。进入夜神 bin 目录执行连接:
cd D:\Program Files (x86)\Nox\bin nox_adb.exe connect 127.0.0.1:62001然后回到任意目录验证:
adb devices看到类似下面的输出就说明设备已识别:
List of devices attached 127.0.0.1:62001 device如果显示offline,先执行adb kill-server再adb start-server,然后重新 connect 一次。如果列表为空,检查夜神是否真的启动完成,以及端口号是否写对。
4. 可复制的 Desired Capabilities 与首个脚本
4.1 启动 Appium Server
安装完成后打开 Appium Desktop,默认 host 为0.0.0.0、port 为4723,保持默认即可,点击 Start Server 启动。终端里也可以用命令行方式启动:
appium -p 4723服务起来后,Python 脚本通过http://localhost:4723/wd/hub建立 session。
4.2 获取包名与 launcherActivity
在写 capabilities 之前,得先知道被测 App 的包名和启动 Activity。把 apk 放到某个目录,用 aapt 解析:
aapt dump badging D:\test\app.apk输出里找这两行:
package: name='com.taobao.taobao' launchable-activity: name='com.taobao.tao.welcome.Welcome'前者是appPackage,后者是appActivity。这一步很多人会漏,导致 session 建不起来却找不到原因。
4.3 完整 capabilities 配置
下面这份配置可以直接复制,按你的设备信息改端口和版本号:
from appium import webdriver from appium.options.android import UiAutomator2Options import time options = UiAutomator2Options() options.platform_name = "Android" options.platform_version = "7.1.2" # 夜神设置里查看内核版本 options.device_name = "127.0.0.1:62001" # adb devices 里的设备名 options.app_package = "com.taobao.taobao" options.app_activity = "com.taobao.tao.welcome.Welcome" options.automation_name = "UiAutomator2" options.no_reset = True driver = webdriver.Remote("http://localhost:4723/wd/hub", options=options) time.sleep(5) print(driver.current_activity) driver.quit()注意新版 Appium-Python-Client 推荐用UiAutomator2Options对象传参,老教程里的字典写法在部分版本会提示弃用。no_reset=True表示不重置应用状态,练习时能省去反复登录的麻烦。
4.4 元素定位与常用操作
session 建立后,定位元素是核心。几种方式对照如下:
| 定位方式 | 方法 | 对应属性 |
|---|---|---|
| id | find_element(By.ID, ...) | resource-id |
| xpath | find_element(By.XPATH, ...) | 层级路径,下标从 1 开始 |
| class | find_element(By.CLASS_NAME, ...) | class |
| accessibility id | find_element(By.ACCESSIBILITY_ID, ...) | content-desc |
| name | find_element(By.NAME, ...) | uiautomator 扫描的 text |
输入内容与滑动屏幕的写法:
from selenium.webdriver.common.by import By driver.find_element(By.ID, "xxxxx").send_keys("123456") width = driver.get_window_size()["width"] height = driver.get_window_size()["height"] driver.swipe(width * 9 / 10, height / 2, width / 1 / 10, height / 2, 1000)滑动参数依次是起点 x、起点 y、终点 x、终点 y、持续时间(毫秒)。练习时先用 Appium Inspector 抓元素,确认定位表达式有效再写进脚本。
5. 验证请求与成功结果
脚本跑起来后,怎么判断真的通了?看三个信号。
第一,终端里 Appium Server 日志出现Creating a new session并返回 session id,说明 capabilities 被接受。第二,夜神模拟器上目标 App 被拉起,界面发生跳转。第三,Python 侧打印出driver.current_activity,值与你配置的 appActivity 一致。
如果只想先验证连通性,不拉起具体 App,可以把app_package和app_activity去掉,只保留平台和设备信息,建立 session 后打印driver.get_window_size(),能返回宽高就说明 Appium 与设备链路正常。这一步通过后再加 App 参数,排障会轻松很多。
用 Appium Inspector 时,在 Start Inspector Session 里填入同样的 capabilities,点击启动,左侧就能看到 UI 树,点选元素会显示对应的 resource-id、class、content-desc,直接拿来写定位表达式。
6. 本篇常见报错排查
报错一:adb server version doesn't match this client回到第 3 节,用 SDK 的 adb 替换夜神目录下的 adb 和 nox_adb,替换前务必结束相关进程。
报错二:adb devices列表为空确认夜神已完全启动,端口号正确,先adb kill-server再adb start-server,然后重新 connect。端口不对是高频原因。
报错三:session 创建失败,提示 activity 不存在appActivity 写错或 App 未安装。用aapt dump badging重新确认,或先把 apk 拖进夜神安装。
报错四:UiAutomator2相关初始化超时夜神内核版本较低时,UiAutomator2 首次注入会慢,适当加大newCommandTimeout,并确认模拟器分配的内存足够。
报错五:元素定位不到优先用 Inspector 抓取,确认是 resource-id 还是 content-desc。xpath 下标从 1 开始,写 0 会直接失败。
排查顺序建议固定为:adb 设备是否在线 → Appium Server 是否启动 → capabilities 是否匹配 → 元素表达式是否有效。按这个链路走,绝大多数问题都能定位到具体环节。
如果你在接入过程中需要集中管理密钥或验证模型接口,可以从 API Keys 和接入文档入手;验证模型连通性用模型对话;长期编码和 Agent 场景则看 Coding Plan。入口都在前面第 2 节列好了,按需取用即可。