1. 项目概述搞移动端自动化测试Appium 绝对是绕不开的一个名字。它就像一个“万能翻译官”让你用一套代码就能同时驱动 Android 和 iOS 设备无论是原生应用、混合应用还是移动端网页都能搞定。今天要聊的 Appium 1.7.2虽然现在看版本有点老但在当时可是一个非常稳定和经典的版本很多老项目、老教程都基于它。更重要的是从 1.x 版本入手能帮你把 Appium 的核心架构、工作原理和配置逻辑理解得透透的之后再接触 2.x 版本就会觉得豁然开朗。这篇文章我就以一个过来人的身份带你从零开始把 Appium 1.7.2 的安装、配置、环境搭建以及那些新手最容易踩的坑掰开揉碎了讲清楚。无论你是刚入行的测试新人还是想从其他自动化框架转过来的开发这篇万字长文都能让你少走至少 80% 的弯路。2. 环境准备构建自动化测试的基石在真正敲下appium启动命令之前有一堆“基建”工作要做。Appium 1.7.2 是一个基于 Node.js 的服务器它本身不直接驱动手机而是通过调用各个平台的原生测试框架Android 的 UiAutomator2/EspressoiOS 的 XCUITest来工作。所以我们的环境准备就是为这些“桥梁”和“执行器”铺路。2.1 核心依赖安装JDK、Node.js 与 Android SDKJava 开发工具包 (JDK)是首要条件因为 Android 的编译和运行都离不开 Java 环境。我强烈建议安装JDK 1.8这是经过无数项目验证与 Appium 1.x 版本兼容性最好的。不要去追新装 JDK 17 或更高版本极有可能在后续步骤中遇到各种奇怪的兼容性问题。安装完成后配置环境变量是第一个小门槛。注意环境变量配置错误是新手最常见的“拦路虎”。请务必检查系统变量而不是用户变量。你需要配置三个系统环境变量JAVA_HOME指向你的 JDK 安装目录例如C:\Program Files\Java\jdk1.8.0_301。这个变量告诉系统 Java 的“家”在哪里。CLASSPATH这是一个历史遗留的变量对于运行 Appium 本身不是必须的但为了某些 Java 工具链的完整性可以设置.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。开头的.代表当前目录。在Path变量中追加%JAVA_HOME%\bin。这是为了让系统在任何位置都能找到java,javac等命令。验证是否成功打开新的命令行窗口CMD 或 PowerShell输入java -version和javac -version应该能正确显示 1.8 的版本信息。接下来是Node.js。Appium 本身是一个 Node.js 应用所以我们需要 Node.js 的运行时和包管理器 npm。对于 Appium 1.7.2建议安装Node.js 8.x 或 10.x的 LTS长期支持版本。太新的 Node.js 版本如 16可能会导致一些旧的 npm 包安装失败。安装过程很简单从官网下载 .msi 安装包一路下一步即可安装程序会自动将 Node.js 和 npm 添加到系统 Path 中。验证命令node -v和npm -v。重头戏是Android SDK。现在谷歌官方已经不提供独立的 SDK 工具包了而是将其整合进了 Android Studio。但对于我们自动化测试来说不需要完整的 IDE。我们可以下载“Command line tools only”。这里有个关键点Appium 1.7.2 主要依赖的是 Android SDK 中的platform-tools包含 adb和build-tools。你需要设置两个环境变量ANDROID_HOME指向你的 Android SDK 根目录例如D:\Android\Sdk。在Path中追加%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\tools。验证命令行输入adb version应能显示 ADB 的版本号。如果提示找不到命令99% 是环境变量没生效请关闭所有命令行窗口重新打开或者重启电脑。2.2 平台特定工具iOS 与 Android 的额外要求如果你需要测试iOS应用那么抱歉你必须拥有一台macOS系统的电脑。这是苹果生态的限制无法绕过。在 Mac 上除了上述的 JDK 和 Node.js你还需要Xcode从 Mac App Store 安装。这不仅是一个开发工具更重要的是它提供了 iOS 模拟器和真机测试所需的命令行工具和签名证书。Carthage或Homebrew推荐使用 Homebrew 这个包管理器来安装其他依赖非常方便。安装命令/bin/bash -c $(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)。ios-deploy用于在真机上安装应用。通过 Homebrew 安装brew install ios-deploy。libimobiledevice一个与 iOS 设备通信的库。安装brew install libimobiledevice。对于Android除了 SDK你可能还需要安装HAXMIntel Hardware Accelerated Execution Manager如果你打算使用 x86 架构的 Android 模拟器并且你的 CPU 是 Intel 的这可以大幅提升模拟器性能。下载后直接安装即可。2.3 包管理器与镜像源配置npm 默认的源在国外下载速度慢且容易失败。在安装 Appium 之前强烈建议将 npm 的注册表镜像切换到国内源比如淘宝的 cnpm 镜像。npm config set registry https://registry.npmmirror.com设置完成后可以通过npm config get registry命令来验证是否切换成功。这个步骤能为你节省大量等待时间避免因网络问题导致的安装失败。3. Appium 1.7.2 的安装与验证环境地基打牢了现在可以开始盖房子——安装 Appium 本身了。3.1 通过 npm 安装 Appium ServerAppium 1.x 时代最主流、最推荐的方式就是通过 npm 进行全局安装。打开命令行执行以下命令npm install -g appium1.7.2这里的-g参数代表全局安装这样你才能在任意目录下直接运行appium命令。1.7.2指定了我们要安装的精确版本。安装过程会下载 Appium 及其所有依赖包根据网络情况可能需要几分钟。实操心得如果在安装过程中卡住或者报错特别是与chromedriver、appium-chromedriver相关的错误这通常是因为某些二进制文件的下载地址被墙。除了使用上述的淘宝 npm 镜像还可以针对特定包设置镜像。例如历史上一个经典的解决方案是npm install -g appium --chromedriver_cdnurlhttp://cdn.npm.taobao.org/dist/chromedriver。对于 1.7.2 版本如果遇到问题可以尝试先清理 npm 缓存npm cache clean --force再重新安装。3.2 安装 Appium Desktop可选但推荐Appium Server 是命令行工具而Appium Desktop是一个图形化客户端它内置了 Appium Server 和一个强大的元素定位器Inspector。对于初学者来说Appium Desktop 非常友好。从 Appium 官网的 Releases 页面找到 1.7.2 版本时期的 Appium Desktop 安装包通常是一个 .dmg 文件用于 Mac一个 .exe 文件用于 Windows。下载并安装。安装后你可以通过图形界面启动/停止 Appium 服务更重要的是使用 Inspector 来查看应用的元素层级结构获取元素的 resource-id、xpath 等定位信息这对编写测试脚本至关重要。即使你主要使用命令行我也建议安装 Appium Desktop只为使用它的 Inspector 工具。3.3 使用 appium-doctor 进行环境诊断安装完成后千万不要急着开始写脚本。先请出我们的“体检医生”——appium-doctor。它是一个专门用来检查 Appium 所需环境是否完备的工具。首先安装它npm install -g appium-doctor然后在命令行中运行appium-doctor或者如果你安装了 Appium Desktop它自带的命令行工具可能已经包含了appium-doctor你也可以在 Appium Desktop 的菜单中找到运行它的选项。appium-doctor会逐项检查包括 JDK、ANDROID_HOME、adb、Node.js 等。所有检查项前面出现绿色的√并最终显示All Checks were successful才表示你的基础环境完全 OK。常见的错误提示和解决方法ANDROID_HOMEis not set 回顾 2.1 节确认环境变量已正确设置并重启命令行窗口。JAVA_HOMEis not set 同上检查 JDK 环境变量。adbcould not be found 确保%ANDROID_HOME%\platform-tools已加入 Path并且该目录下确实有 adb.exe 文件。Optional dependencies...ffmpegnot found 这是一个警告而非错误。ffmpeg 用于屏幕录制等高级功能如果不需要可以忽略。如需安装可以通过系统包管理器如 Mac 的 brew Windows 的 chocolatey或下载独立二进制文件并加入 Path。只有当appium-doctor给出全绿通行证后你的 Appium 安装才算真正完成。4. 客户端库安装与第一个自动化脚本Appium Server 是服务端我们的测试脚本是客户端两者通过 WebDriver 协议通信。因此我们需要在编写脚本的语言环境中安装对应的 Appium 客户端库。4.1 安装 Python 客户端库Python 是 Appium 自动化最流行的语言之一。安装其客户端库非常简单使用 pip 即可pip install Appium-Python-Client默认会安装最新版。如果你需要与 Appium 1.7.2 保持最佳兼容可以指定一个稍旧的版本比如pip install Appium-Python-Client0.46安装时pip 会自动处理依赖主要是selenium。安装完成后你可以在 Python 交互环境中导入验证from appium import webdriver不报错即可。4.2 连接真机或模拟器对于 Android开启手机的“开发者选项”通常是在“关于手机”里连续点击“版本号”7次。在开发者选项中开启“USB调试”。用 USB 数据线连接电脑和手机。在手机上弹出的“允许USB调试吗”对话框中点击“确定”。命令行输入adb devices。如果看到设备列表中出现你的设备序列号后面跟着device字样而不是unauthorized说明连接成功。对于 iOS 真机 这个过程比 Android 复杂涉及苹果开发者账号、证书和描述文件。简单来说在 Xcode 中登录你的 Apple ID。将 iOS 设备连接到 Mac。在 Xcode 的Window - Devices and Simulators中信任该设备。你需要为你的测试应用.app 或 .ipa进行签名或者使用开发证书。对于个人学习可以先从模拟器开始。启动 iOS 模拟器在 Mac 上可以通过命令行open -a Simulator启动或者在 Xcode 的Xcode - Open Developer Tool - Simulator中启动。4.3 编写并运行第一个测试脚本让我们用一个经典的例子——操作 Android 自带计算器来跑通整个流程。假设你已经连接好一台 Android 手机。创建一个 Python 文件比如first_test.py写入以下代码# -*- coding: utf-8 -*- from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy # 注意这是较新客户端的导入方式1.7.2时期常用的是 from appium.webdriver.common.mobileby import MobileBy import time # 1. 定义设备能力和应用信息 desired_caps { platformName: Android, # 平台 platformVersion: 10, # 手机安卓版本在手机设置中查看 deviceName: Your_Device_Name, # 设备名adb devices 中显示的名字或自定义 appPackage: com.android.calculator2, # 计算器包名 appActivity: .Calculator, # 计算器启动Activity automationName: UiAutomator2, # 自动化引擎1.7.2支持UiAutomator2和Espresso noReset: True, # 不重置应用状态 unicodeKeyboard: True, # 支持Unicode输入 resetKeyboard: True # 测试后重置键盘 } # 2. 连接Appium Server # Appium 1.x 默认服务地址和端口 driver webdriver.Remote(http://localhost:4723/wd/hub, desired_caps) # 3. 执行自动化操作 try: # 等待应用启动 time.sleep(2) # 定位数字1按钮并点击旧版定位方式示例 # driver.find_element_by_id(com.android.calculator2:id/digit_1).click() # 更通用的定位方式兼容新旧客户端 one_button driver.find_element(AppiumBy.ID, com.android.calculator2:id/digit_1) one_button.click() # 定位加号按钮并点击 plus_button driver.find_element(AppiumBy.ACCESSIBILITY_ID, plus) # 计算器加号可能有 accessibility id plus_button.click() # 定位数字6按钮并点击 six_button driver.find_element(AppiumBy.ID, com.android.calculator2:id/digit_6) six_button.click() # 定位等号按钮并点击 equals_button driver.find_element(AppiumBy.ACCESSIBILITY_ID, equals) equals_button.click() # 可以尝试获取结果这里计算器结果通常在一个TextView里 result driver.find_element(AppiumBy.ID, com.android.calculator2:id/result) print(f计算结果为{result.text}) time.sleep(2) # 等待查看结果 except Exception as e: print(f执行过程中发生错误{e}) finally: # 4. 退出驱动关闭会话 driver.quit()关键点解析desired_caps 这是启动会话的核心字典它告诉 Appium Server 你要测试什么样的设备、什么应用以及用什么引擎。deviceName在 Android 上可以任意写但最好有辨识度appPackage和appActivity是应用的唯一标识可以通过adb shell dumpsys window | findstr mCurrentFocus命令Windows或adb shell dumpsys window | grep mCurrentFocus命令Mac/Linux在应用启动后查看。automationName 指定自动化引擎。UiAutomator2是 Android 官方现代框架比老的UiAutomator1更稳定强大是 Appium 1.7.2 的推荐选择。元素定位 这是自动化测试的基石。脚本中演示了通过IDfind_element(AppiumBy.ID, ...)和ACCESSIBILITY_ID对于无障碍标识定位。获取元素信息最直观的方式就是使用前面提到的Appium Desktop Inspector。运行脚本确保 Appium Server 正在运行。在命令行输入appium看到[Appium] Welcome to Appium v1.7.2和[Appium] Appium REST http interface listener started on 0.0.0.0:4723即表示启动成功。保持这个命令行窗口打开。在另一个命令行窗口切换到你的脚本目录运行python first_test.py。如果一切配置正确你将看到手机上的计算器自动启动并依次点击 1、、6、完成一次加法运算并在控制台打印结果。恭喜你你的第一个 Appium 自动化测试成功了5. 深入配置与高级话题成功运行第一个脚本只是开始。在实际项目中你会遇到更复杂的场景和配置。5.1 Desired Capabilities 详解desired_caps字典里的每一个键值对都至关重要。除了上面用到的还有一些常用配置udid: 设备的唯一标识符。当连接多台设备时必须用此参数指定目标设备。通过adb devices获取。autoGrantPermissions: 设置为True时Appium 会自动处理应用弹出的运行时权限请求如访问位置、相机等。fullReset: 设置为True会在会话开始前完全卸载应用会话结束后再卸载。noReset为True则相反保留应用数据。根据测试需求选择。newCommandTimeout: 客户端发送命令的超时时间秒默认 60。如果测试步骤间等待时间长可以适当增大。app: 直接指定待测应用的安装包路径.apk 或 .ipa。如果设备上没有安装Appium 会先安装它。browserName: 如果要测试移动端浏览器如 Chrome将此参数设置为Chrome并确保设备上安装了对应浏览器。5.2 处理常见应用类型混合应用 (Hybrid App) 如 WebView。需要额外配置chromedriverExecutable指向一个与手机 Chrome/WebView 版本匹配的 ChromeDriver并在代码中切换上下文Context。# 获取所有上下文 contexts driver.contexts # 切换到 WEBVIEW 上下文 driver.switch_to.context(contexts[1]) # 通常原生是NATIVE_APPWebView是WEBVIEW_* # 此时可以使用 Selenium 的 find_element_by_xxx 来定位网页元素 # 操作完后切回原生 driver.switch_to.context(NATIVE_APP)iOS 真机测试 需要配置xcodeOrgId团队ID、xcodeSigningIdiPhone Developer和udid。应用必须是开发证书签名的或者使用app参数指定一个使用开发描述文件重签名的 .ipa 文件。5.3 搭建可持续集成环境在 CI/CD 流水线中运行 Appium 测试环境配置需要自动化。使用 Docker 这是最干净、可复现的方式。可以寻找或自己构建包含 Android SDK、Appium、模拟器和所需依赖的 Docker 镜像。在 CI 任务中启动容器运行测试脚本。使用云测平台 如 Sauce Labs, BrowserStack, AWS Device Farm, 国内的 Testin、腾讯 WeTest 等。它们提供了海量的真机设备你只需要上传应用和测试脚本无需管理本地环境。配置上主要是在desired_caps中填入平台提供的用户名、访问密钥和设备配置。本地 CI 代理 在专用的构建服务器上固定配置好 Android/iOS 环境连接若干台测试设备。Jenkins、GitLab CI 等工具可以在构建时在这些代理上执行测试任务。6. 故障排除与性能优化即使按照步骤一步步来也难免会遇到问题。这里汇总一些典型问题的排查思路。6.1 连接与启动问题排查表问题现象可能原因排查步骤与解决方案adb devices列表为空或显示unauthorized1. USB 线或接口问题2. 手机未开启 USB 调试3. 电脑缺少手机驱动Windows常见4. 手机端未点击“允许调试”弹窗1. 换线、换接口。2. 确认开发者选项和 USB 调试已开启。3. 安装手机厂商官方 PC 套件或驱动。4. 拔插数据线查看手机屏幕是否有弹窗。Appium Server 启动失败端口被占用4723 端口已被其他进程占用1. 查找占用端口的进程lsof -i :4723(Mac/Linux) 或netstat -ano | findstr :4723(Windows)。2. 终止该进程或启动 Appium 时指定其他端口appium -p 4724。运行脚本报错Unable to create a new remote session1.desired_caps配置错误2. Appium Server 未启动3. 设备连接问题4. 应用包名/Activity名错误1. 仔细检查desired_caps每个键值对特别是平台版本、设备名、appPackage/Activity。2. 确认appium命令正在运行且无报错。3. 再次用adb devices确认设备在线。4. 使用adb shell dumpsys window命令确认当前前台应用的包名和 Activity。元素定位不到 (NoSuchElementException)1. 定位符写错2. 页面未加载完成3. 元素在 WebView 或混合应用中4. 有弹窗遮挡1. 使用 Appium Inspector 重新确认元素属性。2. 添加显式等待WebDriverWait(driver, 10).until(EC.presence_of_element_located((AppiumBy.ID, “someId”)))。3. 检查是否需要切换上下文。4. 先处理弹窗。iOS 真机测试报签名错误证书或描述文件无效、不匹配1. 确认 Xcode 中登录的 Apple ID 是否有开发者权限。2. 确认在 Xcode 的Signing Capabilities中为项目选择了正确的团队和签名证书。3. 对于.app文件可能需要用codesign命令重签名。6.2 脚本稳定性与性能优化使用显式等待避免硬性等待 (time.sleep) 硬等待效率低下且不稳定。显式等待只在条件满足时才继续否则超时后抛出异常。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait WebDriverWait(driver, 10) element wait.until(EC.element_to_be_clickable((AppiumBy.ID, “myButton”))) element.click()元素定位策略优先级 优先使用ID或ACCESSIBILITY_ID它们通常最稳定且速度快。其次是CLASS_NAME和XPATH。复杂的XPATH虽然强大但性能较差且容易因UI微调而失效。截图与日志 在关键步骤和失败时截图便于事后分析。Appium 支持保存日志到文件启动时使用--log参数如appium --log /path/to/appium.log。会话复用 对于一组相关的测试用例尽量在一个会话内完成避免反复启动和关闭应用这能节省大量时间。使用 Test Framework如 pytest, unittest的setUp和tearDown方法来管理会话生命周期。并行测试 当有多台设备时可以启动多个 Appium Server 实例在不同端口然后并行运行测试套件大幅缩短整体测试时间。需要 CI 工具和测试框架的支持如 pytest-xdist。回顾整个 Appium 1.7.2 的安装与配置之旅从环境变量的细致配置到appium-doctor的严格体检再到第一个脚本的成功运行每一步都蕴含着对移动自动化测试底层逻辑的理解。这个版本虽然古老但其核心概念——基于 WebDriver 协议、多语言客户端、通过desired capabilities配置会话——在今天的 Appium 2.x 中依然一脉相承。把 1.7.2 的环境搭稳了原理搞懂了那些看似复杂的错误信息也就有了清晰的排查路径。在实际项目中我最大的体会是文档和社区是你的最佳伙伴。遇到问题时仔细阅读错误日志去 Appium 官方文档和 GitHub Issues 里搜索十有八九能找到答案。最后自动化测试不是一蹴而就的从环境搭建到编写稳定、高效的测试脚本是一个不断踩坑、学习和优化的过程。先从模仿一个简单的用例开始逐步扩展到复杂的业务流你的移动自动化测试能力就会在这个过程中扎实地成长起来。