1. 项目概述与核心价值

最近几年,移动应用测试的自动化需求越来越旺盛,无论是为了提升回归测试效率,还是为了进行大规模的功能验证,一个稳定可靠的自动化环境都是基础。很多朋友一听到“Appium自动化”就觉得头大,感觉要装一堆东西,配置一堆环境变量,动不动就报错。确实,我刚开始接触的时候也踩了不少坑,从JDK版本不兼容到Appium Server启动失败,再到真机连接不上,每一步都可能是个“拦路虎”。但一旦你把环境搭通了,后面写脚本、跑用例就会顺畅很多,本质上它就是一个“桥梁”,让你的Python代码能够指挥手机里的App进行各种操作。

这个“保姆级”指南,就是要把我从无数次失败中总结出来的经验,一步步拆解给你看。我们的目标很明确: 在Windows系统上,从零开始,搭建一个能稳定运行Python+Appium的自动化测试环境,并最终实现一个最简单的自动化操作——比如打开手机上的计算器App并完成一次计算。 这个过程会涵盖所有必要的组件:Python环境、Appium Server、Android SDK、以及连接真机或模拟器的驱动。我会尽量把每个步骤的“为什么”讲清楚,而不仅仅是告诉你“怎么做”,这样即使你未来遇到新版本或者不同型号的手机,也能自己举一反三去解决问题。适合所有对移动端自动化感兴趣的测试工程师、开发人员甚至是业务人员,只要你有一点Python基础,就能跟着做下来。

2. 环境搭建全景图与核心组件解析

在动手之前,我们得先搞清楚我们要搭建的这个“环境”到底由哪些部分组成,它们各自扮演什么角色。如果把整个自动化过程比作一场木偶戏,那么:

  • Python + 测试框架(如pytest/unittest) :你就是幕后的编剧和导演,用代码写好剧本(测试用例)。
  • Appium Server :它是核心的提线人,负责接收导演(Python脚本)的指令,并将其翻译成手机能听懂的语言。
  • Appium Client 库(如Appium-Python-Client) :这是导演和提线人之间的专用对讲机,让Python代码能够用特定的协议和Appium Server通信。
  • 手机/模拟器 + 待测App :这就是舞台上的木偶和道具,是最终执行操作的对象。
  • Android SDK(主要是adb) :这是提线人(Appium Server)与木偶(手机)之间的物理连接线和基础控制工具。adb(Android Debug Bridge)是调试桥梁,没有它,电脑根本认不出手机。

对于iOS环境,还需要Xcode和相关的开发者证书,过程更为复杂。考虑到大多数人的学习和工作环境,本指南将聚焦于 Android 平台。 一个常见的误区是认为装了Appium Desktop就万事大吉,其实Appium Desktop只是一个带图形界面的Server,它底层依然严重依赖JDK和Android SDK。

2.1 工具选型与版本控制心得

工具版本是环境搭建中最容易出问题的地方,不兼容的版本组合会让你在莫名其妙的错误上浪费大量时间。以下是我基于当前(可长期稳定的)主流版本给出的建议:

  1. Python :选择 Python 3.8 到 3.10 之间的版本。Python 3.11+ 有时会遇到一些第三方库的兼容性问题。我推荐使用 3.8.10 3.9.13 ,这两个版本非常稳定,社区支持度极高。
  2. JDK (Java Development Kit) :Appium Server 是基于Node.js的,但其底层驱动(特别是对于Android)需要Java环境。务必安装 JDK 8 (1.8) 。更高版本的JDK(如JDK 11, 17)可能会导致 uiautomator2 等驱动运行异常。记住,不是JRE,是JDK。
  3. Node.js :Appium Server 的运行环境。安装 Node.js 的 LTS(长期支持)版本 即可,比如 18.x。安装时注意勾选“自动安装必要的工具”选项(不建议,最好手动配置),并确保npm包管理器随之安装。
  4. Android SDK :谷歌官方已不再提供独立的SDK安装包,推荐通过 Android Studio 来安装和管理SDK。我们主要需要其中的 SDK Tools (包含adb, aapt等)和 Platform-Tools
  5. Appium Server :有两种选择。
    • Appium Desktop :图形化界面,适合新手入门和元素定位(内置Inspector)。但从自动化脚本的角度,我们更常将其作为Server后台运行。
    • Appium Server 命令行版 :通过npm安装,更轻量,更适合集成到CI/CD流水线。本指南会同时介绍两种方式的安装。

重要心得 :我强烈建议在电脑上创建一个专门的文件夹,例如 D:\AutomationEnv ,将所有工具的安装路径都规划在这里。清晰的路径管理会为后续的环境变量配置减少大量麻烦。

3. 分步详解:手把手搭建环境

接下来,我们进入实操环节。请严格按照顺序操作。

3.1 第一步:安装Python并配置环境变量

  1. 下载安装 :前往Python官网,下载上述推荐的版本(如3.9.13)的Windows安装程序。运行安装程序时, 务必勾选最下方的 “Add Python 3.9 to PATH” 选项,这样安装程序会自动为你添加用户级别的环境变量。然后将安装路径改为我们规划的目录,例如 D:\AutomationEnv\Python39
  2. 验证安装 :打开命令提示符(CMD)或 PowerShell,输入 python --version pip --version 。如果能正确显示版本号,说明安装成功。
  3. 配置pip镜像源(国内加速) :为了后续安装库时速度更快,建议配置国内镜像。在用户目录( C:\Users\你的用户名\ )下创建 pip 文件夹,里面新建一个 pip.ini 文件,内容如下:
    [global]
    index-url = https://pypi.tuna.tsinghua.edu.cn/simple
    trusted-host = pypi.tuna.tsinghua.edu.cn
    
    这样,以后使用 pip install 命令时就会从清华镜像站下载,速度飞起。

3.2 第二步:安装JDK 8

  1. 下载安装 :搜索“Oracle JDK 8”或使用OpenJDK版本(如AdoptOpenJDK)。下载Windows x64安装包。安装时,同样将路径改为规划目录,如 D:\AutomationEnv\Java\jdk1.8.0_xxx
  2. 配置环境变量 :这是关键步骤,很多问题都出在这里。
    • 新建系统变量 JAVA_HOME ,值为你的JDK安装路径,例如 D:\AutomationEnv\Java\jdk1.8.0_341
    • 编辑系统变量 Path 新建 两条记录:
      • %JAVA_HOME%\bin
      • %JAVA_HOME%\jre\bin
  3. 验证安装 :打开新的CMD窗口,输入 java -version javac -version 。应能正确显示Java 1.8相关的版本信息。

3.3 第三步:安装Node.js与Appium Server

  1. 安装Node.js :从官网下载LTS版本的Windows安装包。安装过程简单,一路下一步即可,安装路径可以设为 D:\AutomationEnv\nodejs 。安装程序会自动将Node和npm添加到Path。
  2. 验证Node.js :CMD中输入 node -v npm -v
  3. 安装Appium Server命令行版 :通过npm全局安装。在CMD中运行:
    npm install -g appium
    
    如果速度慢,可以设置npm淘宝镜像: npm config set registry https://registry.npmmirror.com
  4. 安装Appium Desktop(可选但推荐) :从Appium官网的Releases页面下载最新的 .exe 安装包。安装它主要是为了使用其内置的 Appium Inspector 工具,这个工具对于定位应用元素(如按钮、输入框的ID)至关重要。

3.4 第四步:安装Android SDK(通过Android Studio)

这是步骤最多的一环,请耐心操作。

  1. 下载安装Android Studio :从官网下载安装程序。安装时,同样建议将路径改到规划目录,如 D:\AutomationEnv\AndroidStudio 。SDK的安装位置会随后设置。
  2. 首次运行与SDK配置 :启动Android Studio,在欢迎界面选择“More Actions” -> “SDK Manager”。
    • SDK Platforms 标签页:至少选择一个Android版本进行安装,例如 Android 11.0 (R) 。选择你手机或模拟器对应的API Level。
    • SDK Tools 标签页:勾选以下必选项:
      • Android SDK Build-Tools (选择最新的一个版本,如33.0.0)
      • Android SDK Platform-Tools (包含adb,必选)
      • Android SDK Tools (Obsolete) (旧版工具,有时需要,建议勾选)
      • Android Emulator (如果你要用模拟器)
    • 注意看下方的 Android SDK Location ,这就是你的SDK根目录。我建议将其设置为 D:\AutomationEnv\AndroidSDK 。点击“Apply”开始下载安装。
  3. 配置Android环境变量
    • 新建系统变量 ANDROID_HOME ,值为你的SDK根目录,例如 D:\AutomationEnv\AndroidSDK
    • 编辑系统变量 Path 新建 以下两条记录:
      • %ANDROID_HOME%\platform-tools (这是adb所在目录)
      • %ANDROID_HOME%\tools (和 tools\bin ,一些旧工具可能需要)
  4. 验证adb :打开新的CMD,输入 adb version 。应能显示adb的版本信息。

3.5 第五步:连接真机与必备驱动安装

  1. 真机准备
    • 在手机上进入“设置”->“关于手机”,连续点击“版本号”7次,开启“开发者选项”。
    • 在“开发者选项”中,开启 “USB调试” 。部分手机还需要开启“USB调试(安全设置)”或“允许通过USB安装应用”。
  2. 连接电脑 :用USB数据线连接手机和电脑。在CMD中输入 adb devices 。如果一切正常,你会看到设备列表中出现你的设备序列号,后面跟着 device 字样。如果显示 unauthorized ,需要在手机上弹出的授权对话框中点击“允许”。
  3. 安装Appium驱动 :Appium通过不同的驱动来支持不同平台。对于Android,我们需要安装 uiautomator2 驱动,它是目前最稳定和主流的Android自动化驱动。在CMD中运行:
    appium driver install uiautomator2
    
    同样,如果你需要测试iOS,可以安装 xcuitest 驱动(需在macOS环境下): appium driver install xcuitest

至此,所有基础环境已经准备就绪。你可以通过 appium -v appium driver list 来验证Appium及其驱动是否安装成功。

4. 第一个自动化脚本实战:操控手机计算器

环境搭好了,我们来点实际的,写一个脚本让手机自动打开计算器,计算“9+5=”。这里我们使用最常用的 Appium-Python-Client 库和 uiautomator2 驱动。

4.1 创建项目与安装客户端库

在你喜欢的位置创建一个项目文件夹,例如 D:\MyAppiumProject 。在该文件夹打开CMD或PowerShell,或者使用VSCode打开此文件夹。

  1. 安装客户端库
    pip install Appium-Python-Client
    
    这个库提供了所有与Appium Server交互的Python方法。
  2. 可选但推荐:安装pytest
    pip install pytest
    
    虽然第一个脚本我们可以用简单的Python文件,但后续构建测试套件,pytest是更专业的选择。

4.2 使用Appium Inspector定位元素

在写代码之前,我们需要知道计算器App里“数字9”、“加号”、“数字5”、“等号”这些按钮在App里的“身份证”(即元素定位信息)。这就是Appium Inspector的用武之地。

  1. 启动Appium Desktop,点击“Start Server”启动服务(默认地址 http://127.0.0.1:4723 )。
  2. 点击“Start Inspector Session”按钮。
  3. 会弹出一个配置窗口(Desired Capabilities),这是Appium会话的核心配置。我们需要填写一组键值对来描述我们的测试设备和应用。你可以点击左下角保存这组配置方便下次使用。一个连接真机计算器App的基础配置如下:
    {
      "platformName": "Android",
      "platformVersion": "11", // 你的手机安卓版本
      "deviceName": "你的设备名", // 通过`adb devices`查看,或自定义一个
      "appPackage": "com.android.calculator2", // 计算器包名,可能因手机品牌而异
      "appActivity": "com.android.calculator2.Calculator", // 计算器主活动
      "automationName": "UiAutomator2",
      "noReset": true // 不重置应用数据
    }
    
    • 如何获取 appPackage appActivity
      • 确保手机已连接并解锁,计算器App在前台打开。
      • 在CMD中运行: adb shell dumpsys window | findstr mCurrentFocus
      • 输出类似: mCurrentFocus=Window{... u0 com.android.calculator2/com.android.calculator2.Calculator}
      • 斜杠前是 appPackage ,后是 appActivity
  4. 点击“Start Session”。Appium会在你的手机上打开计算器App,同时电脑上Inspector窗口会加载出当前页面的UI层次结构。
  5. 在Inspector中,点击“元素选择”工具,然后去点击手机屏幕上的数字“9”。右侧会显示该按钮的所有属性,如 resource-id , text , content-desc , class 等。我们通常优先使用 resource-id ,因为它通常是唯一的。记录下 resource-id (可能是 com.android.calculator2:id/digit_9 )。同理,找到“+”、“5”、“=”的定位信息。

4.3 编写并运行Python自动化脚本

在项目文件夹中创建一个Python文件,如 first_test.py

from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
import time

# 1. 定义Desired Capabilities,与Inspector中配置一致
desired_caps = {
    "platformName": "Android",
    "platformVersion": "11", # 改为你的安卓版本
    "deviceName": "MI_9", # 可自定义,但adb devices里要有对应设备
    "appPackage": "com.android.calculator2",
    "appActivity": "com.android.calculator2.Calculator",
    "automationName": "UiAutomator2",
    "noReset": True
}

# 2. 连接Appium Server
# 确保Appium Server正在运行(http://127.0.0.1:4723)
driver = webdriver.Remote('http://127.0.0.1:4723', desired_caps)

# 给App一点启动时间
time.sleep(2)

try:
    # 3. 使用定位到的元素信息进行操作
    # 点击数字 9
    # 这里使用resource-id定位,这是最可靠的方式
    btn_9 = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/digit_9")
    btn_9.click()

    # 点击加号 +
    # 如果加号没有id,可以用 accessibility_id (content-desc) 或 XPath
    # 假设加号的 resource-id 是 `com.android.calculator2:id/op_add`
    btn_plus = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/op_add")
    btn_plus.click()

    # 点击数字 5
    btn_5 = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/digit_5")
    btn_5.click()

    # 点击等号 =
    btn_equals = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/eq")
    btn_equals.click()

    # 4. 获取结果并验证
    # 结果通常显示在一个TextView里,我们获取其文本
    result_element = driver.find_element(AppiumBy.ID, "com.android.calculator2:id/result")
    actual_result = result_element.text
    print(f"计算结果显示为: {actual_result}")

    # 简单的断言(这里只是打印,实际测试中会用assert)
    if actual_result == "14":
        print("测试通过!9 + 5 = 14")
    else:
        print(f"测试失败!预期 14,实际得到 {actual_result}")

    # 等待几秒,方便观察
    time.sleep(3)

except Exception as e:
    print(f"执行过程中出现错误: {e}")
    # 可以在这里截图保存错误现场
    # driver.save_screenshot('error_screenshot.png')

finally:
    # 5. 无论如何,最后都要关闭会话
    print("测试结束,关闭驱动会话。")
    driver.quit()

运行脚本:

  1. 确保你的手机已通过USB连接, adb devices 能看到设备,且屏幕已解锁。
  2. 确保Appium Server正在运行(无论是通过Desktop启动的,还是命令行用 appium 命令启动的)。
  3. 在终端中,进入你的脚本所在目录,运行: python first_test.py

如果一切配置正确,你将看到手机上的计算器被自动打开,并依次点击9、+、5、=,最终在控制台打印出结果。

5. 环境与脚本调试:常见问题与解决方案实录

即使按照步骤操作,也难免会遇到问题。下面是我总结的几个高频问题及排查思路。

5.1 环境类问题

问题现象 可能原因 排查与解决步骤
‘adb’ 不是内部或外部命令 Android SDK环境变量未正确配置。 1. 检查 ANDROID_HOME 变量值是否正确指向SDK根目录。
2. 检查Path中是否添加了 %ANDROID_HOME%\platform-tools
3. 重启CMD或IDE ,使环境变量生效。
4. 在CMD中直接 cd platform-tools 目录下再执行 adb 命令,验证adb本身是否可用。
‘java’ 不是内部或外部命令 JDK环境变量未正确配置。 1. 检查 JAVA_HOME 变量,路径必须指向JDK安装目录(有bin文件夹的那一层)。
2. 检查Path中是否添加了 %JAVA_HOME%\bin
3. 同样,需要重启终端。
appium 命令找不到 Node.js或npm安装问题,或非全局安装。 1. 检查Node.js是否安装成功 ( node -v )。
2. 尝试用 npm list -g appium 查看全局安装列表。
3. 如果未找到,重新全局安装: npm install -g appium
Appium Server启动失败,端口被占用 4723端口被其他程序(可能是之前未关闭的Appium实例)占用。 1. 在CMD中运行 `netstat -ano

5.2 连接与脚本执行类问题

问题现象 可能原因 排查与解决步骤
adb devices 列表为空 手机USB调试未开启;驱动问题;数据线问题。 1. 确认手机“开发者选项”和“USB调试”已开启。
2. 换一条质量好的数据线,并尝试电脑上不同的USB接口。
3. 在设备管理器中查看手机是否被识别为“Android ADB Interface”,如有感叹号则需安装驱动。
4. 手机连接时弹出的“允许USB调试吗?”对话框要点“确定”。
Appium Inspector无法启动会话 Desired Capabilities配置错误;设备未连接;appPackage/Activity错误。 1. 核对 platformVersion 必须与手机系统版本一致(设置-关于手机中查看)。
2. deviceName 可以自定义,但建议与 adb devices 列出的设备名一致。
3. 重点检查 appPackage appActivity 是否准确。不同品牌手机的计算器包名可能不同(如华为可能是 com.huawei.calculator )。
4. 可以先通过 adb shell am start -n com.android.calculator2/com.android.calculator2.Calculator 命令测试能否手动启动。
脚本报错 NoSuchElementException 元素定位信息错误或过时;页面未加载完成;元素在iframe或WebView中。 1. 最常用方法 :使用 driver.page_source 打印当前页面XML源码,在其中搜索你预期的 resource-id text ,看是否存在且唯一。
2. 在操作前增加显式等待,等待元素出现再操作:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((AppiumBy.ID, “id”)))
3. 尝试其他定位方式,如 AppiumBy.ACCESSIBILITY_ID (对应content-desc), AppiumBy.XPATH
脚本执行时手机无反应 Appium Server未启动;Desired Capabilities中设备信息错误;脚本中Remote的URL错误。 1. 确认Appium Server正在运行,并检查日志有无报错。
2. 确认脚本中 webdriver.Remote 的URL与Server地址一致(默认 http://127.0.0.1:4723 )。
3. 在Appium Desktop的Server日志中查看,当运行脚本时,是否有新的会话创建请求。这是判断连接是否成功的关键。

5.3 独家避坑技巧

  1. 环境变量Path的优先级 :系统Path变量中,上方的路径优先级高于下方。如果你安装了多个Python或Java版本,请确保你想要的版本路径在靠前的位置。修改Path后, 必须关闭所有CMD、IDE,重新打开 才能生效。
  2. 使用 appium-doctor 诊断环境 :安装这个工具可以一键检查环境配置问题。运行 npm install -g appium-doctor ,然后执行 appium-doctor ,它会给出详细的检查和修复建议。
  3. 真机比模拟器更稳定 :对于初学者,我强烈建议使用真机进行学习和调试。Android模拟器(尤其是非x86架构)可能会遇到性能、兼容性和网络方面的问题,增加学习复杂度。
  4. 养成看日志的习惯 :Appium Server的控制台输出(日志)是排查问题的金钥匙。任何错误信息都会在其中体现。遇到问题时,第一反应应该是查看Appium日志。
  5. 元素定位策略优先级 resource-id > accessibility_id > xpath resource-id 是首选,因为它通常是唯一的且性能最好。尽量避免使用绝对XPath,它非常脆弱,UI稍有改动就会失效。

6. 项目进阶与脚本优化思路

成功运行第一个脚本只是起点。要让自动化测试真正有用,还需要考虑更多。

6.1 封装与设计模式

直接把所有代码写在一个文件里会很快变得难以维护。常见的优化有:

  • 封装Capabilities :将设备配置信息单独放在一个配置文件(如 config.yaml config.ini )或类中,方便管理多设备测试。
  • 封装基础操作 :将常用的操作(如查找元素、点击、输入、滑动)封装成独立的函数或类方法,提高代码复用性。
  • 使用Page Object模式 :这是UI自动化测试的核心设计模式。为每个App页面创建一个类,页面的元素定位符和操作作为这个类的方法。测试脚本只包含业务逻辑,不直接包含元素定位。这极大提升了代码的可读性和可维护性。

6.2 等待机制

上面的脚本用了 time.sleep() ,这是一种“强制等待”,效率低下且不稳定。应该使用“显式等待”。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 等待最多10秒,直到元素可点击
element = WebDriverWait(driver, 10).until(
    EC.element_to_be_clickable((AppiumBy.ID, “some_id”))
)
element.click()

6.3 测试报告与断言

使用 pytest unittest 框架来组织测试用例,它们提供了丰富的断言方法和测试报告生成功能(如 pytest-html 插件可以生成漂亮的HTML报告)。

6.4 连接多设备与并行测试

当你有多个设备需要测试时,可以为每个设备启动一个独立的Appium Server实例(使用不同的端口,如4723, 4724, 4725),然后在你的测试框架中(如 pytest-xdist )配置多进程同时运行测试脚本,每个进程连接不同的Server端口和设备。这需要对测试框架和脚本结构有更高的规划。

环境搭建是自动化测试的基石,虽然过程繁琐,但每一步都有其意义。我个人的体会是,第一次成功搭建并运行脚本的成就感,足以抵消之前遇到的所有挫折。把这个环境当成你的“自动化工作台”,把它搭建得稳固、清晰,后续所有复杂的测试项目都将从这个坚实的基础上生长出来。如果在搭建过程中卡住了,别急着到处问,先回头仔细检查每一步,尤其是环境变量和版本兼容性,并学会阅读Appium Server的日志,你遇到的问题,十有八九都能在日志里找到线索。

更多推荐