1. 为什么 adb 连接总是先给你一个下马威Windows 上搭 Appium Python Client 夜神模拟器真正卡人的往往不是写脚本而是环境连通。你打开夜神敲下adb devices结果要么列表空空要么蹦出一句adb server version(31) doesnt match this client (36)。这不是你代码写错了而是两个 adb 在打架夜神自带一份 adbAndroid SDK 里又有一份版本号对不上服务端和客户端互相不认。这篇就按“能跑起来”的顺序走一遍先把 adb 版本冲突解决掉让夜神设备被正确识别再启动 Appium Server用 Python Client 建立 session最后跑通第一个测试用例并顺手把包名、Activity、元素定位这些后续要用的东西拿到手。适合刚接触移动端自动化、在 Windows 上用夜神做练习环境的同学。全程命令和配置都可以直接复制遇到报错我也会把排查路径写清楚。需要说明的是Appium 本身是开源测试框架Python Client 只是它的一个客户端库两者配合夜神模拟器就能完成大部分 Android UI 自动化练习。下面所有操作都在 Windows 本机完成不涉及任何网络穿透类工具。2. 前置准备TaoToken 与依赖清单在动手之前先把要装的东西列清楚避免中途缺件。Appium 生态里版本兼容比较敏感建议按下面这套组合来组件作用建议版本/来源Node.jsAppium Server 运行依赖16 LTS 及以上Appium Server提供 WebDriver 接口通过 npm 全局安装Appium-Python-ClientPython 侧调用库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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chatCoding Planhttps://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan控制台https://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsoleAPI Keyshttps://taotoken.net/api?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi_keys官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基础地址为 https://taotoken.net/api 。这些和 Appium 环境本身不冲突属于你后续写脚本时可能用到的配套能力先知道入口在哪即可。3. 解决 adb 版本冲突并连接夜神3.1 定位两份 adb报错adb server version(31) doesnt 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\bin3.2 用 SDK 的 adb 替换夜神的操作前先彻底关掉夜神模拟器然后打开任务管理器确认adb.exe和nox_adb.exe两个进程都已经结束。有残留就手动结束否则文件被占用替换会失败。接着做替换把 SDK 目录下的adb.exe复制到夜神bin目录把夜神原本的adb.exe改名为adb_bak.exenox_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: namecom.taobao.taobao launchable-activity: namecom.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, optionsoptions) time.sleep(5) print(driver.current_activity) driver.quit()注意新版 Appium-Python-Client 推荐用UiAutomator2Options对象传参老教程里的字典写法在部分版本会提示弃用。no_resetTrue表示不重置应用状态练习时能省去反复登录的麻烦。4.4 元素定位与常用操作session 建立后定位元素是核心。几种方式对照如下定位方式方法对应属性idfind_element(By.ID, ...)resource-idxpathfind_element(By.XPATH, ...)层级路径下标从 1 开始classfind_element(By.CLASS_NAME, ...)classaccessibility idfind_element(By.ACCESSIBILITY_ID, ...)content-descnamefind_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 doesnt 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 节列好了按需取用即可。
