
1. 项目概述为什么选择Appium如果你正在做移动端测试尤其是需要覆盖iOS和Android两大平台那么Appium这个名字你肯定不陌生。它几乎是目前市面上最主流的开源移动端自动化测试框架没有之一。我最早接触Appium还是在好几年前那时候团队面临一个非常现实的问题产品要同时上线iOS和Android版本测试人力根本不够手动回归一遍核心功能就得花上一整天还容易漏测。当时调研了市面上好几个方案最终选择Appium核心原因就一个它用一套API就能写iOS和Android的测试脚本。听起来很美好对吧但真正上手过的人都知道Appium的安装和环境配置堪称“新手劝退器”。网上教程五花八门版本不匹配、依赖缺失、环境变量配置错误随便一个坑都能让你折腾半天。所以这篇内容不是一份冷冰冰的官方文档翻译而是我结合自己踩过的无数坑整理出来的一份从零开始、手把手、可复现的Appium实战指南。我会把安装过程中的每一个细节、每一个可能出错的地方都掰开揉碎了讲清楚并带你写一个完整的实战脚本。无论你是刚入行的测试新人还是想从Web自动化转向移动端的老手这篇内容都能帮你绕过那些不必要的弯路快速把Appium用起来。2. 环境准备与核心依赖解析在开始敲任何安装命令之前我们必须先理清Appium的“全家福”。很多人一上来就npm install -g appium结果后面各种报错根本原因就是没搞清楚它依赖什么。Appium本质上是一个Node.js服务它像一个“翻译官”接收我们通过客户端库如Python的Appium-Python-Client发送过来的WebDriver协议命令然后将其转换成iOS通过XCUITest或Android通过UiAutomator2/Espresso原生测试框架能理解的指令。因此它的环境依赖是分层的。2.1 基础层Node.js与NPM这是Appium服务的运行基石。我的建议是永远不要使用操作系统自带的Node.js版本可能太旧且权限管理混乱。直接去Node.js官网下载最新的LTS长期支持版本安装包进行安装。安装完成后在终端或CMD/PowerShell里验证一下node -v npm -v确保能正确输出版本号。这里有个小技巧在Windows上安装Node.js时通常会询问是否要自动安装必要的工具像Python、Visual Studio Build Tools务必勾选这能省去后面很多编译原生模块的麻烦。2.2 平台层Java与Android SDK这是为Android自动化准备的。Appium通过UiAutomator2驱动来操作Android应用而这个驱动需要Java环境和Android SDK。Java推荐安装JDK 8或JDK 11LTS版本。Oracle JDK或OpenJDK都可以。安装后需要配置著名的JAVA_HOME环境变量指向你的JDK安装目录例如C:\Program Files\Java\jdk-11.0.xx并把%JAVA_HOME%\bin添加到系统的PATH变量中。验证命令是java -version。Android SDK现在谷歌推荐使用Android Studio来管理SDK但对于我们测试人员不一定需要安装完整的IDE。你可以只安装命令行工具。不过为了省事我通常建议直接安装Android Studio然后在安装向导里把Android SDK、Android SDK Command-line Tools、Android SDK Platform-Tools都勾选上。安装完成后同样需要配置两个关键环境变量ANDROID_HOME指向Android SDK的根目录例如C:\Users\你的用户名\AppData\Local\Android\Sdk。将%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\tools或%ANDROID_HOME%\cmdline-tools\latest\bin取决于版本添加到PATH。 验证是否成功打开新终端输入adb devices如果不报“不是内部命令”的错误就说明SDK路径配置对了。注意Android SDK的路径因操作系统和安装方式差异很大尤其是在Windows上AppData是隐藏文件夹需要先在文件管理器设置中显示隐藏项目才能找到。在Mac上通常路径是~/Library/Android/sdk。2.3 平台层Xcode与开发者工具仅macOS如果你需要测试iOS应用那么一台macOS电脑是硬性要求因为编译和运行iOS应用所需的工具链Xcode只存在于苹果系统。你需要从Mac App Store安装Xcode。安装完成后必须打开Xcode一次完成初始化和同意用户协议。此外还需要安装Xcode的命令行工具xcode-select --install这些工具提供了编译和部署iOS应用到模拟器或真机所必需的库和命令。2.4 工具层Appium Server与Appium Inspector这是我们的主角和得力助手。Appium Server有两种安装方式。对于新手我强烈推荐使用Appium Desktop。它是一个图形化应用程序内置了Appium Server和一个简易的Inspector。从官网下载安装一键启动能避免大量命令行配置问题。当你越来越熟悉后可以转向命令行安装npm install -g appium。安装后通过appium -v验证。Appium Inspector这是一个独立的应用用于定位移动应用上的元素类似于Web自动化中的浏览器开发者工具。新版本的Appium已经将Inspector从Desktop中独立出来需要单独下载。它是写脚本时不可或缺的工具用来查看元素属性如resource-id,xpath,accessibility id。3. 手把手安装与配置全流程理论讲完了我们进入实战环节。我会以Windows/macOS双平台测试Android应用为例给出最详细的步骤。iOS部分会在关键点提示差异。3.1 第一步安装Node.js与NPM访问 Node.js 官网下载 LTS 版本的安装程序。运行安装程序所有选项保持默认即可Windows上记得勾选安装必要工具。安装完成后打开一个新的终端一定要新开让环境变量生效输入node -v和npm -v确认版本号。3.2 第二步安装Java JDK访问Oracle官网或Adoptium等OpenJDK发行版网站下载JDK 8或11的安装包。运行安装记住安装路径例如C:\Program Files\Eclipse Adoptium\jdk-11.0.xx-hotspot。配置环境变量Windows系统属性 - 高级 - 环境变量。新建系统变量JAVA_HOME值为你的JDK安装路径。然后在Path变量中新增一项%JAVA_HOME%\bin。macOS/Linux编辑~/.bash_profile或~/.zshrc文件添加export JAVA_HOME/Library/Java/JavaVirtualMachines/jdk-11.0.xx.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH然后执行source ~/.zshrc。新开终端输入java -version看到版本信息即成功。3.3 第三步安装与配置Android环境这是最复杂的一步。安装Android Studio去官网下载安装。在安装向导的“选择组件”页面确保勾选Android SDKAndroid SDK PlatformAndroid Virtual Device (这个用于创建模拟器)Performance (Intel® HAXM) 或 Hypervisor用于加速模拟器根据电脑CPU选择配置SDK路径与环境变量打开Android Studio在欢迎界面点击“More Actions” - “SDK Manager”或者进入项目后点击“File” - “Settings” - “Appearance Behavior” - “System Settings” - “Android SDK”。这里可以看到你的Android SDK Location复制这个路径。Windows新建系统变量ANDROID_HOME值为刚才复制的路径如C:\Users\YourName\AppData\Local\Android\Sdk。在Path中新增两项%ANDROID_HOME%\platform-tools和%ANDROID_HOME%\tools或%ANDROID_HOME%\cmdline-tools\latest\bin。macOS/Linux编辑配置文件添加export ANDROID_HOME/Users/YourName/Library/Android/sdk export PATH$ANDROID_HOME/platform-tools:$ANDROID_HOME/tools:$PATH同样记得source一下。安装必要的SDK平台和工具在Android Studio的SDK Manager中切换到“SDK Platforms”标签页至少勾选一个你打算测试的Android版本例如“Android 13.0 (Tiramisu)”点击“Apply”安装。然后切换到“SDK Tools”标签页确保以下项目已安装如果没安装勾选并应用Android SDK Build-Tools (最新版或指定版本)Android EmulatorAndroid SDK Platform-Tools (包含adb)验证新开终端输入adb version。如果显示版本号恭喜你最难关卡已过。3.4 第四步安装Appium Server与Inspector安装Appium Server (推荐Desktop版)前往Appium官网下载对应操作系统的Appium Desktop安装包。安装并运行。你会看到一个简单的界面通常只需要点击“Start Server”按钮默认主机127.0.0.1端口4723。看到日志输出[Appium] Welcome to Appium...和[Appium] Appium REST http interface listener started on 0.0.0.0:4723说明服务启动成功。安装Appium Inspector同样从Appium官网下载独立的Inspector安装包。安装后打开备用。我们会在写脚本时用到它。3.5 第五步创建Android虚拟设备(AVD)我们总不能一直用真机调试一个模拟器是必须的。打开Android Studio欢迎界面点击“More Actions” - “AVD Manager”或者工具栏上的手机图标。点击“Create Virtual Device”。选择一个设备定义如Pixel 5点击“Next”。选择一个系统镜像建议选Download下载一个比如Tiramisu API 33点击“Next”。给AVD起个名字其他设置可以默认点击“Finish”。在AVD Manager列表中点击你刚创建设备的“启动”按钮三角图标。等待模拟器启动完成。4. 第一个Appium自动化脚本实战环境全部就绪是时候让代码跑起来了。我们将使用Python语言和Appium-Python-Client库来编写脚本。目标是在Android模拟器上打开系统自带的“计算器”应用完成一个简单的加法运算。4.1 安装Python客户端库确保你已安装Python3.7。在终端中执行pip install Appium-Python-Client这个库封装了与Appium Server通信的WebDriver协议。4.2 使用Appium Inspector定位元素在写代码之前我们需要知道计算器上各个按钮的元素属性。这是自动化脚本的“眼睛”。确保Appium Server正在运行Desktop那个窗口。打开Appium Inspector。在Inspector中我们需要配置“Desired Capabilities”来连接我们的模拟器。这是一个JSON对象告诉Appium我们要测试什么设备、什么应用。点击“Start Session”旁边的箭头选择“Custom Server”确保Host和Port是127.0.0.1和4723。在Capabilities配置区域添加以下键值对这是连接一个Android模拟器并启动系统计算器App的典型配置{ platformName: Android, appium:platformVersion: 13.0, // 你的模拟器系统版本 appium:deviceName: Pixel_5_API_33, // 你的AVD名称 appium:automationName: UiAutomator2, appium:appPackage: com.google.android.calculator, appium:appActivity: com.android.calculator2.Calculator }appPackage和appActivity是Android应用的唯一标识。对于系统计算器这是已知的。如果是你自己的应用可以通过adb shell dumpsys window | findstr mCurrentFocusWindows或adb shell dumpsys window | grep mCurrentFocusmacOS/Linux命令在应用启动后获取。点击“Start Session”。Appium会自动在模拟器上启动计算器应用同时Inspector界面会加载出应用的UI层级结构。你可以点击屏幕上的元素右侧会显示其属性如resource-id,text,content-desc,class等。记下数字按钮5、加号、等号的resource-id例如com.google.android.calculator:id/digit_5,op_add,eq。4.3 编写并运行Python测试脚本创建一个名为test_calculator.py的文件写入以下代码from appium import webdriver from appium.webdriver.common.appiumby import AppiumBy import time # 1. 定义Desired Capabilities与Inspector中配置一致 desired_caps { platformName: Android, appium:platformVersion: 13.0, appium:deviceName: Pixel_5_API_33, appium:automationName: UiAutomator2, appium:appPackage: com.google.android.calculator, appium:appActivity: com.android.calculator2.Calculator, appium:noReset: True # 可选防止每次会话重置应用 } # 2. 连接Appium Server driver webdriver.Remote(http://127.0.0.1:4723, desired_caps) try: # 等待应用完全启动 time.sleep(2) # 3. 定位元素并操作计算 5 5 # 点击数字 5 digit_5 driver.find_element(AppiumBy.ID, com.google.android.calculator:id/digit_5) digit_5.click() # 点击加号 plus_btn driver.find_element(AppiumBy.ID, com.google.android.calculator:id/op_add) plus_btn.click() # 再次点击数字 5 digit_5.click() # 点击等号 equal_btn driver.find_element(AppiumBy.ID, com.google.android.calculator:id/eq) equal_btn.click() # 4. 获取结果并断言 result driver.find_element(AppiumBy.ID, com.google.android.calculator:id/result_final) actual_result result.text expected_result 10 print(f计算结果{actual_result}) assert actual_result expected_result, f断言失败期望 {expected_result}, 实际 {actual_result} print(测试通过) # 为了演示等待几秒查看结果 time.sleep(3) finally: # 5. 无论成功与否最后退出会话 driver.quit()脚本逻辑拆解desired_caps定义了测试会话的所有必要条件相当于给Appium Server下了一份“任务说明书”。webdriver.Remote建立与Appium Server的连接Server会根据Capabilities启动对应的设备和应用。使用find_element方法并通过AppiumBy.ID定位策略使用我们在Inspector中找到的resource-id来定位元素。这是最稳定、最推荐的定位方式。对元素执行.click()操作。最后获取结果框的文本进行断言验证。driver.quit()至关重要用于结束会话释放模拟器/真机资源。运行脚本确保Appium Server在运行。确保Android模拟器已启动并处于解锁状态。在终端中切换到脚本所在目录执行python test_calculator.py。如果一切配置正确你将看到模拟器中的计算器被自动操作并输出“测试通过”。5. 核心能力进阶与最佳实践一个简单的点击脚本只是开始。要让Appium在真实项目中发挥作用还需要掌握更多核心能力和工程化实践。5.1 等待策略告别time.sleep在上面的脚本中我用了time.sleep(2)这是一种隐式等待但它是固定、死板的不是最佳实践。Appium提供了更智能的等待方式隐式等待 (Implicit Wait)在创建driver后设置一次对整个driver生命周期有效。它会在查找元素时如果没立即找到会轮询等待一段时间。driver.implicitly_wait(10) # 单位秒显式等待 (Explicit Wait)针对某个特定条件进行等待更加灵活精准。这是推荐的主要等待策略。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待“结果”元素出现并且其文本不为空 wait WebDriverWait(driver, 10) result_element wait.until( EC.text_to_be_present_in_element( (AppiumBy.ID, com.google.android.calculator:id/result_final), ) ) # 或者等待元素可点击 button wait.until(EC.element_to_be_clickable((AppiumBy.ID, some_button_id))) button.click()最佳实践结合使用。设置一个较短的全局隐式等待如5秒用于处理大多数稳定元素。对于关键操作、网络加载后的元素使用显式等待并配合合理的超时时间和预期的条件如元素可见、可点击、包含特定文本。5.2 复杂的定位器策略除了IDAppium支持多种定位策略应对不同场景Accessibility ID (appium:accessibilityId)在移动端这通常对应元素的content-descAndroid或accessibilityIdentifieriOS。这是跨平台定位的首选因为开发为无障碍功能设置的ID通常是唯一且稳定的。element driver.find_element(AppiumBy.ACCESSIBILITY_ID, 我的按钮)XPath功能强大但可能性能稍慢且易受UI改动影响。谨慎使用尽量用相对路径和属性组合。# 不推荐绝对路径脆弱 # 推荐结合属性 element driver.find_element(AppiumBy.XPATH, //android.widget.Button[text确定])Class Name通过控件类型定位通常返回多个元素需要结合其他方法过滤。buttons driver.find_elements(AppiumBy.CLASS_NAME, android.widget.Button)Android UiAutomator (仅Android)使用Android原生的UiAutomator API语法非常强大灵活。element driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, new UiSelector().text(OK))定位器优先级建议IDAccessibility IDXPath(尽量用简洁的相对路径) 其他。5.3 常用操作API除了click()你还需要掌握这些核心操作输入文本element.send_keys(“Hello Appium”)清空文本element.clear()获取元素属性element.text,element.get_attribute(‘checked’),element.get_attribute(‘resource-id’)滑动/滚动# 使用W3C Actions API (推荐) from appium.webdriver.common.touch_action import TouchAction actions TouchAction(driver) actions.press(x500, y1500).wait(200).move_to(x500, y500).release().perform() # 或者使用driver自带的滚动方法针对某些列表 driver.find_element(AppiumBy.ANDROID_UIAUTOMATOR, new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(text(目标文本)))返回、Home、最近任务键driver.press_keycode(4) # 返回键 driver.press_keycode(3) # Home键启动其他应用/Activitydriver.start_activity(‘com.example.package’, ‘.MainActivity’)5.4 Capabilities配置详解Desired Capabilities是Appium会话的“灵魂”理解关键配置项至关重要能力键说明示例值/备注platformName必填。平台名称。“Android”,“iOS”appium:platformVersion必填。移动操作系统版本。“13.0”,“16.4”appium:deviceName必填。设备名称可以是任意字符串但用于日志识别。“Pixel_5”,“iPhone 14 Pro”appium:automationName必填。使用的自动化引擎。Android:“UiAutomator2”(推荐),“Espresso”; iOS:“XCUITest”appium:app被测试App的路径。如果设备上已安装可与appPackage/Activity二选一。“/path/to/app.apk”appium:appPackageAndroid应用包名。“com.example.myapp”appium:appActivityAndroid应用的主Activity。“.MainActivity”appium:bundleIdiOS应用的Bundle Identifier。“com.example.MyApp”appium:noReset是否在会话开始前重置应用状态如清除数据。true(不重置),false(默认重置)appium:fullReset是否在会话结束后卸载应用。false(默认),true(彻底清理)appium:udid物理设备的唯一标识符。连接真机时必填。通过adb devices或xcrun simctl list获取appium:autoGrantPermissions是否自动授予应用所需的所有权限。true(非常方便)6. 常见问题排查与实战技巧即使按照指南操作也难免会遇到问题。这里记录了我遇到的一些典型“坑”及其解决方案。6.1 环境与连接问题问题1adb devices找不到设备/模拟器现象执行adb devices后列表为空。排查确保模拟器已完全启动并进入主屏幕。重启adb服务adb kill-server然后adb start-server。检查是否有多个adb版本冲突。确保PATH中配置的是Android SDK下的adb。问题2Appium Server启动失败端口被占用现象启动Appium时提示Could not start REST http interface listener。解决默认端口是4723可以换一个端口启动appium -p 4724。或者找出占用端口的进程并关闭Windows:netstat -ano | findstr :4723, Mac/Linux:lsof -i :4723。问题3Session not created error现象脚本报错提示无法创建会话通常伴随一串详细的错误信息。排查这是最重要的错误信息来源仔细阅读Appium Server日志Desktop版有日志窗口。错误信息通常会明确指出问题例如An unknown server-side error occurred...: 可能是Capabilities配置错误。Cannot find...: 可能app路径不对或appPackage/Activity名称错误。No Android devices connected:udid不对或设备未连接。核对platformVersion是否与设备系统版本一致。核对deviceName是否与AVD名称或真机设备名一致。对于真机确保已开启“开发者选项”和“USB调试”。6.2 脚本执行问题问题4元素找不到 (NoSuchElementException)现象脚本运行时报错找不到元素。排查与解决等待问题元素还没加载出来。使用显式等待替代硬性sleep。定位器问题UI可能动态变化。用Appium Inspector重新捕获元素确认定位器是否依然有效。优先使用稳定的ID或Accessibility ID。上下文问题混合应用或WebView中需要切换上下文(driver.switch_to.context(‘WEBVIEW_xxx’))。屏幕不在当前视图需要滑动查找。使用滚动查找API如UiAutomator的UiScrollable。问题5操作失败 (ElementNotInteractableException)现象找到了元素但点击或输入失败。排查元素可能被遮挡如弹窗。先处理掉遮挡物。元素可能处于不可交互状态如enabled“false”。检查元素属性。尝试使用TouchAction进行更精确的坐标点击作为最后手段。6.3 实战技巧与心得Capabilities管理不要将Capabilities硬编码在脚本里。使用配置文件如config.yaml或config.json或环境变量来管理不同环境开发、测试、生产和设备不同型号、版本的配置。Page Object模式这是UI自动化测试的黄金标准。将每个页面或重要组件封装成一个类页面的元素定位器和基本操作作为类的方法。这样能使测试脚本更清晰、更易维护元素定位逻辑改变时只需修改一个地方。日志与截图在关键步骤如操作前、断言点、失败时添加日志输出和截图功能。driver.save_screenshot(‘error.png’)能在测试失败时帮你快速定位问题现场。真机测试连接真机时除了开启USB调试有时还需要在开发者选项里开启“禁止权限监控”或“USB调试安全设置”。使用adb devices获取udid并填入Capabilities。并行测试对于大型测试套件可以考虑使用Appium Grid。它允许你将测试分发到多个Appium Server连接不同设备上并行执行大幅缩短测试时间。与测试框架集成将Appium脚本集成到pytest或unittest等测试框架中可以利用其丰富的夹具fixture、参数化、测试报告等功能让测试更工程化。从环境搭建的磕磕绊绊到第一个脚本成功运行再到能够设计稳定的测试用例和处理各种异常掌握Appium确实需要一个过程。但一旦这套流程跑通你会发现它为移动端测试带来的效率提升是巨大的。最关键的是保持耐心遇到错误时学会阅读和分析日志那里面藏着绝大部分问题的答案。