
1. 项目概述为什么需要Appium2如果你正在看这篇文章大概率是遇到了Appium1.x版本的各种“坑”比如环境配置复杂、依赖冲突、或者想体验更现代的架构。没错Appium2的发布就是为了解决这些问题。它不再是一个庞大的单体应用而是采用了插件化架构把驱动如XCUITest、UiAutomator2和插件如图像识别、OCR都变成了可独立安装的模块。这意味着你的环境可以更干净升级更灵活出了问题也更容易定位。对于使用Python进行移动端自动化测试的工程师来说从Appium1.x迁移到2.x不仅仅是换一个版本号更是一次工作流的优化。本文将带你从零开始完成Appium2服务端、客户端Python的安装、配置并解决你在这个过程中必然会遇到的几个典型问题比如那个令人头疼的[appium] no plugins have been installed提示。我会假设你有一些Python基础但即使你是刚接触自动化测试跟着步骤走也能搞定。2. 环境准备与核心工具选型在开始安装之前我们需要理清整个技术栈。Appium自动化测试主要涉及两部分Appium Server服务端负责与手机设备通信和Appium Client客户端即你的Python测试脚本。此外还需要对应的移动端驱动和必要的系统依赖。2.1 系统与运行时环境检查首先确保你的电脑已经准备好了基础环境。Node.js与npmAppium Server是基于Node.js的所以这是必须的。前往Node.js官网下载LTS长期支持版本安装。安装完成后打开终端Windows用CMD或PowerShellMac/Linux用Terminal输入node -v和npm -v检查版本。我推荐使用Node.js 18或20 LTS版本兼容性最好。Python环境这是我们的脚本语言环境。同样建议使用Python 3.8至3.11之间的版本避免使用太新或太旧的版本可能带来的兼容性问题。你可以从Python官网下载安装或者在Mac/Linux上使用pyenv在Windows上使用官方安装包。安装时务必勾选“Add Python to PATH”这样才能在任意终端调用python命令。Java Development Kit (JDK)如果你要测试Android应用ADBAndroid调试桥和Appium的UiAutomator2驱动需要Java环境。安装JDK 8或JDK 11LTS版本并配置好JAVA_HOME环境变量。在终端输入java -version验证。注意环境变量是新手最容易出错的地方。安装完JDK后需要手动添加系统环境变量JAVA_HOME其值为你的JDK安装路径例如C:\Program Files\Java\jdk-11然后在Path变量中添加%JAVA_HOME%\bin。2.2 包管理工具的选择pip, uv, 与项目依赖管理Python的包管理工具首选的当然是pip。它是Python的官方包管理器绝大多数教程和库都围绕它展开。对于Appium的Python客户端我们使用pip install Appium-Python-Client即可。但这里我想提一下网络热词里出现的uv。这是Rust编写的一个极速Python包管理器和解析器由AstralRuff的团队开发。它的安装速度和依赖解析速度远超传统的pip特别是在创建虚拟环境和处理pyproject.toml时。如果你经常需要初始化新项目或者受困于pip缓慢的依赖解析uv是一个值得尝试的现代化替代品。你可以通过pip install uv来安装它之后用uv pip install Appium-Python-Client来安装包速度会有明显提升。不过对于本教程为了普适性我们仍然使用pip进行演示。但请记住在一个正式的测试项目中强烈建议使用虚拟环境venv来隔离依赖。你可以通过python -m venv venv创建然后用source venv/bin/activateMac/Linux或venv\Scripts\activateWindows激活它再在里面安装Appium客户端这样能保证项目间的环境纯净。3. Appium2服务端的安装与插件化配置这是Appium2与1.x最大的不同之处也是很多同学卡住的地方。在Appium2中核心服务器和驱动是分开的。3.1 安装Appium2核心服务器打开你的终端全局安装Appium2npm install -g appiumnext这里的next标签确保我们安装的是最新的2.x版本。安装完成后输入appium -v来验证安装。如果看到类似2.x.x的版本号说明安装成功。此时如果你直接运行appium命令启动服务器很可能会看到那个经典的警告[Appium] No plugins have been installed. Use the appium plugin command to install the ones you want to use.别担心这不是错误只是一个提示告诉你还没有安装任何执行自动化所必需的“驱动”插件。在Appium2看来连最基本的Android和iOS驱动也都是插件。3.2 安装必备的驱动程序Drivers你需要根据你要测试的平台安装对应的驱动。通常我们需要这两个UiAutomator2驱动用于Android这是目前Android自动化最稳定、功能最全的驱动。XCUITest驱动用于iOS这是苹果官方提供的iOS UI测试框架是测试iOS应用的标准。在终端中分别执行以下命令进行安装# 安装Android的UiAutomator2驱动 appium driver install uiautomator2 # 安装iOS的XCUITest驱动仅在macOS系统上需要 appium driver install xcuitest安装完成后可以使用appium driver list命令来查看已安装的驱动。你会看到uiautomator2和xcuitest如果安装了的状态是installed。3.3 安装可选插件Plugins插件用于扩展Appium的功能。一个非常实用的插件是images插件它提供了基于图像识别的定位能力可以作为辅助定位手段。appium plugin install images同样使用appium plugin list可以查看已安装的插件。现在再次运行appium命令那个“No plugins”的警告就应该消失了。服务会正常启动并显示已安装的驱动和插件信息。你可以通过访问http://localhost:4723来查看Appium服务器的基本状态页面。3.4 驱动与插件的管理技巧更新使用appium driver update [driver-name]或appium plugin update [plugin-name]。卸载使用appium driver uninstall [driver-name]或appium plugin uninstall [plugin-name]。查看详情使用appium driver info uiautomator2可以查看某个驱动的详细信息包括版本和配置项。解决安装慢或失败由于网络原因安装驱动或插件时可能会超时。可以尝试设置npm的镜像源或者使用科学的上网方式。但更直接的方法是检查Appium的日志它通常会给出下载链接你可以手动下载对应的npm包.tgz文件然后使用appium driver install --source local /path/to/package.tgz进行本地安装。4. Python客户端配置与基础脚本编写服务端准备好了现在来配置我们的“遥控器”——Python测试脚本。4.1 安装Appium Python客户端库在你的Python项目虚拟环境中执行pip install Appium-Python-Client这个库提供了Selenium WebDriver的扩展专门用于和Appium Server通信。它会自动安装依赖的selenium包。4.2 编写你的第一个Appium脚本我们来创建一个最简单的脚本用于打开Android手机上的计算器应用以Android为例确保手机已通过USB连接并开启了USB调试模式。创建一个名为first_appium_test.py的文件。from appium import webdriver from appium.options.android import UiAutomator2Options import time # 1. 定义设备能力和App信息 capabilities { “platformName”: “Android” # 平台 “appium:automationName”: “UiAutomator2” # 自动化驱动引擎必须和安装的驱动名一致 “appium:deviceName”: “你的设备名称” # 通过 adb devices 获取或使用通用名称如 Android Emulator “appium:platformVersion”: “13” # 手机系统版本 “appium:appPackage”: “com.android.calculator2” # 计算器App的包名 “appium:appActivity”: “com.android.calculator2.Calculator” # 计算器App的启动Activity “appium:noReset”: True # 不清空App数据便于重复测试 } # 2. 将Capabilities字典转换为Appium2推荐使用的Options对象 appium_options UiAutomator2Options().load_capabilities(capabilities) # 3. 连接Appium服务器并初始化驱动 # 这里的 http://localhost:4723 是Appium Server默认的监听地址 driver webdriver.Remote(“http://localhost:4723” optionsappium_options) # 4. 简单的自动化操作等待2秒然后退出 time.sleep(2) print(“测试完成准备退出。”) # 5. 关闭会话 driver.quit()关键点解析Capabilities这是连接手机和指定待测App的“合同”。每个键值对都有特定含义。automationName必须与你安装的驱动名UiAutomator2严格一致这是Appium2的关键。Options对象在Appium1.x时代我们通常直接传递字典。在Appium2的Python客户端中更推荐使用各平台对应的Options类如UiAutomator2Options,XCUITestOptions。它提供了更好的类型提示和参数校验。设备信息获取deviceName运行adb devices命令列表中显示的名称就是。对于模拟器可以是emulator-5554这类。appPackage和appActivity对于系统应用可以网上搜索。对于自己开发或已安装的应用可以通过adb shell dumpsys window | findstr mCurrentFocusWindows或adb shell dumpsys window | grep mCurrentFocusMac/Linux来查看当前前台应用的包名和Activity。4.3 脚本执行与调试确保Appium服务器正在运行终端里appium命令在运行。确保手机已连接adb devices能看到你的设备。在另一个终端激活你的Python虚拟环境运行python first_appium_test.py。如果一切顺利你会看到手机上的计算器应用被自动打开等待2秒后关闭。控制台会打印“测试完成准备退出。”。5. 核心问题排查与实战技巧在实际操作中你几乎一定会遇到下面这些问题。我把它们和解决方案整理成了表格方便你快速查阅。5.1 安装与启动常见问题问题现象可能原因解决方案运行appium提示command not foundNode.js或npm未正确安装或全局路径未配置。1. 检查node -v和npm -v。2. 重新安装Node.js并确保安装时勾选了“添加到PATH”。3. 有时需要重启终端或电脑。安装驱动/插件极慢或失败网络连接问题。1. 检查网络。2. 可尝试更换npm镜像源npm config set registry https://registry.npmmirror.com。3. 如前述尝试手动下载安装包进行本地安装。[Appium] No plugins have been installed这是正常提示说明未安装任何驱动。使用appium driver install uiautomator2等命令安装所需驱动。安装后警告即消失。启动Appium后无法访问http://localhost:4723端口被占用或服务器未成功监听。1. 检查是否有其他Appium或服务占用了4723端口。2. 尝试指定其他端口启动appium -p 4724。3. 查看Appium启动日志是否有错误。5.2 脚本运行常见问题问题现象可能原因解决方案WebDriverException: Unable to create new service: XCUITestService在非macOS系统上尝试测试iOS应用或未安装XCUITest驱动。1. XCUITest驱动仅支持macOS。2. 在macOS上确保已执行appium driver install xcuitest。WebDriverException: An unknown server-side error occurred while processing the commandCapabilities配置错误或Appium驱动内部问题。1.首先检查CapabilitiesautomationName是否拼写正确大小写敏感。appium:前缀在纯字典格式中是否需要新版Client可能自动处理。2. 查看Appium服务端日志错误详情通常在日志末尾。这是最重要的调试依据。脚本找不到元素NoSuchElementException元素定位符如id, xpath写错或页面尚未加载完成。1. 使用Appium Desktop或浏览器开发者工具对于WebView复核元素属性。2. 添加显式等待WebDriverWait确保元素出现后再操作。3. 尝试其他定位策略如 accessibility id。连接被拒绝 (ConnectionRefusedError)Appium服务器未启动或脚本中连接的地址/端口错误。1. 确保在运行脚本前已经在一个终端窗口启动了appium。2. 检查脚本中webdriver.Remote的URL是否与服务器启动的地址端口一致。5.3 独家实操心得让脚本更健壮一定要看服务端日志90%的问题都能在Appium Server的运行终端里找到答案。错误信息、堆栈跟踪非常详细。养成脚本报错时第一时间查看服务端日志的习惯。使用显式等待告别sleeptime.sleep(2)是固定等待效率低下且不可靠。使用WebDriverWait配合expected_conditions是行业最佳实践。from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from appium.webdriver.common.appiumby import AppiumBy # 等待最多10秒直到ID为‘com.example:id/button’的元素可点击 element WebDriverWait(driver, 10).until( EC.element_to_be_clickable((AppiumBy.ID, “com.example:id/button”)) ) element.click()Capabilities管理将Capabilities写在单独的配置文件如config.yaml或config.json中或者使用Python的字典在不同测试间复用和切换如区分Android和iOS的配置会让你的代码更清晰。设备连接稳定性USB连接有时会不稳定导致adb设备列表变化。可以尝试使用无线ADB连接adb tcpip 5555adb connect 设备IP或者使用STFSmartphone Test Farm等设备管理平台进行远程真机测试。6. 进阶与AirtestPoco框架的浅析与选择网络热词中提到了“appium和airtestpoco框架哪个做这种自动遍历app梳理业务功能”。这是一个很好的问题涉及到框架选型。Appium基于WebDriver协议标准是它的核心优势。它使用原生控件的定位方式如ID、XPath脚本可读性和可维护性高与Selenium生态无缝集成适合需要精确控件操作、断言逻辑复杂、与Web测试共用技术栈的功能自动化测试和回归测试。它的遍历需要你编写明确的查找和点击逻辑。AirtestPoco这是一个更偏向于图像识别和游戏测试的解决方案。Airtest基于图像识别进行“点击”不关心控件结构Poco则提供了类似Appium的控件定位能力但专为游戏引擎Unity3D, Cocos2dx和部分原生App优化。对于“自动遍历”Airtest的图像识别可以更容易地实现“看到什么点什么的”的盲遍历而Poco则需要像Appium一样理解UI树。如何选择如果你的App是标准的原生或混合应用测试逻辑需要精细的控件定位和验证团队熟悉Selenium选择Appium。如果你的测试对象包含大量游戏、或UI控件树难以获取如一些Flutter应用、或者核心需求是快速实现“瞎点”式的遍历探索可以优先评估AirtestPoco。实际上两者并非完全互斥。在一些复杂场景中也有团队混合使用例如用Appium处理主要业务流程用Airtest处理其中的图像验证码。7. 集成开发环境IDE配置与效率提升工欲善其事必先利其器。一个好的IDE能极大提升编写和调试Appium脚本的效率。7.1 VS Code配置Python与Appium环境安装Python扩展在VS Code扩展商店搜索并安装官方“Python”扩展它提供了智能提示、调试、格式化等全套功能。选择解释器按CtrlShiftP输入 “Python: Select Interpreter”选择你创建了虚拟环境的Python解释器路径通常包含venv字样。安装Pylance推荐作为Python的语言服务器它能提供更强大的代码补全和类型检查。在虚拟环境中你的Appium-Python-Client库的代码提示就会生效。查看函数参数将光标放在函数如webdriver.Remote上VS Code会自动显示其参数签名。这也是热词中“vscode查看函数参数python”的答案。7.2 使用PyCharm的专业功能PyCharm是专为Python设计的IDE开箱即用体验更好。创建项目时直接创建虚拟环境在新建项目对话框中可以直接选择“New environment using Virtualenv”。强大的运行/调试配置你可以创建一个运行配置固定你的测试脚本路径、参数和环境变量一键运行或调试。图形化的调试工具设置断点、查看变量、单步执行对于分析复杂的自动化脚本流程非常有用。我个人习惯是快速原型和小项目用VS Code因为它轻量、启动快大型的、复杂的自动化测试项目用PyCharm因为它对项目结构、重构和调试的支持更深入。7.3 编写可维护的测试脚本不要把所有代码都写在一个文件里。随着测试用例增多你需要考虑架构。Page Object Model (POM)这是UI自动化的经典设计模式。将每个App页面封装成一个类页面上的元素和操作作为这个类的方法。测试脚本只调用这些方法不直接包含定位符。这样当UI变化时你只需要修改对应的Page类测试脚本几乎不用动。使用pytest框架pytest比Python自带的unittest更简洁、功能更强大。它支持丰富的夹具fixture你可以用夹具来管理driver的生命周期启动、退出。# conftest.py import pytest from appium import webdriver from appium.options.android import UiAutomator2Options pytest.fixture def driver(): options UiAutomator2Options().load_capabilities({...}) _driver webdriver.Remote(“http://localhost:4723” optionsoptions) yield _driver # 测试函数执行时使用这个driver _driver.quit() # 测试函数执行完后退出 # test_calculator.py def test_add_function(driver): # 将fixture作为参数传入 # 直接使用driver进行测试 el driver.find_element(...) el.click() assert ...配置文件与常量分离将设备Capabilities、App信息、服务器地址、等待超时时间等放入配置文件如config.yaml或常量文件中。从在终端里敲下npm install -g appiumnext开始到写出一个稳定运行的POM模式测试用例这个过程你会遇到很多细节问题。但只要你理解了Appium2的插件化架构核心掌握了Capabilities的正确配置方法并学会了从服务端日志中寻找答案这些问题都会迎刃而解。移动端自动化测试是一个需要耐心和细致的工作每一个稳定的测试脚本背后都是对无数个异常情况的处理和优化。开始动手吧从让你的手机自动打开第一个App开始。