自动化框架(Appium)
一、Appium 核心特点
1. 跨平台兼容性
- 多平台支持:同时支持 iOS 和 Android 两大移动操作系统。
- 多应用类型覆盖:
- 原生应用(如 iOS 的.ipa、Android 的.apk)
- 混合应用(WebView + 原生组件)
- 移动网页(Safari、Chrome 等移动端浏览器)
- 一次编写,多平台运行:同一套测试代码可在 iOS 和 Android 上复用(需注意平台特定差异)。
2. 编程语言无关性
- 支持主流编程语言:Java、Python、JavaScript(Node.js)、C#、Ruby 等。
- 统一 API 接口:无论使用哪种语言,Appium 提供一致的 API 设计(基于 WebDriver 协议),降低学习成本。
3. 无需修改应用代码
- 黑盒测试:测试过程中无需重新编译或修改被测应用的源代码,保证测试环境与生产环境一致性。
- 兼容性强:适用于第三方应用或无法获取源码的应用。
4. 标准协议驱动
- WebDriver 协议:基于 W3C WebDriver 标准(前身为 JSON Wire Protocol),与 Selenium WebDriver 同源,便于 Web 和移动测试技术栈整合。
- HTTP 通信:Appium 服务器与测试客户端通过 HTTP 接口通信,支持分布式测试架构。
5. 设备与环境灵活性
- 真实设备与模拟器 / 仿真器:
- 支持物理设备(如 iPhone、Android 手机)
- 支持模拟器(iOS Simulator)和仿真器(Android Emulator)
- 云测试平台集成:可对接 Sauce Labs、BrowserStack 等云测试服务,实现跨设备自动化测试。
6. 丰富的元素定位与交互方式
- 多种定位策略:ID、XPath、类名、内容描述(Accessibility ID)、UI Automator(Android)、XCUITest(iOS)等。
- 复杂操作支持:
- 触摸事件(点击、长按、滑动、捏合缩放)
- 键盘输入
- 手势操作
- 多设备协同操作
7. 与测试框架集成
- 测试框架兼容性:可与 JUnit、TestNG(Java)、pytest(Python)、Mocha(JavaScript)等主流测试框架结合。
- 断言库支持:搭配 AssertJ、Hamcrest、PyHamcrest 等断言库编写验证逻辑。
- CI/CD 集成:无缝接入 Jenkins、GitLab CI、GitHub Actions 等持续集成工具。
8. 高级功能扩展
- Appium 扩展插件:
- Appium Inspector:可视化元素定位工具
- Appium Doctor:环境配置检查工具
- Appium Pro:企业级支持版本
- 性能监控:可集成工具监控应用 CPU、内存、网络流量等性能指标。
- 并行测试:通过 Appium Grid 实现多设备同时执行测试,提升效率。
9. 社区与生态支持
- 活跃开源社区:GitHub 上超 1.5 万颗星,社区贡献持续更新。
- 文档完善:官方文档提供详细教程和 API 参考。
- 第三方工具集成:与 Allure(测试报告)、Applitools(视觉测试)等工具无缝对接。
10. 平台特定支持
- Android:支持 UiAutomator2、Espresso 等自动化引擎,可测试 Android 特有的 UI 组件。
- iOS:集成 XCUITest 框架,支持 iOS 手势、通知、权限管理等功能测试。
二、Appium 环境搭建(Python 示例)
1. 系统要求
| 环境 | 要求 |
|---|---|
| 操作系统 | Windows 10/11、macOS(推荐)或 Linux |
| Python | Python 3.7+(推荐 3.9+),需配置python或python3命令 |
| Node.js | 14.x+(推荐 LTS 版本),用于安装 Appium 服务器 |
| Android 开发 | Android SDK(API 23+)、Android Studio(可选) |
| iOS 开发 | macOS 系统、Xcode 11+、CocoaPods(iOS 自动化必需) |
2. 安装 Appium 服务器
2.1 安装 Node.js 和 npm
macOS/Linux:通过 Homebrew 安装
bashbrew install node
Windows:从Node.js 官网下载安装包,默认勾选 npm。
2.2 全局安装 Appium
bashnpm install -g appium
验证安装:
bashappium -v # 输出版本号(如2.0.0)即安装成功
2.3 安装 Appium 驱动(按需)
Appium 2.0 后需单独安装驱动:
bash\# Android驱动(UiAutomator2)appium driver install uiautomator2\# iOS驱动(XCUITest)appium driver install xcuitest
3. 安装 Appium Python 客户端
bashpip install Appium-Python-Client
验证安装:
bashpython -c "import appium; print(appium.\_\_version\_\_)"
4. Android 环境配置
4.1 安装 Android SDK
- 下载并安装Android Studio
- 启动 Android Studio,打开SDK Manager(工具 → SDK Manager)
- 安装以下组件:
- Android SDK Platform-Tools
- Android SDK Build-Tools
- 至少一个 Android API 版本(如 Android 11)
- Android Emulator(可选,用于模拟器测试)
4.2 配置环境变量
Windows:
bashANDROID\_HOME=C:\\Users\\YourName\\AppData\\Local\\Android\\SdkPATH=%PATH%;%ANDROID\_HOME%\\tools;%ANDROID\_HOME%\\platform-tools
macOS/Linux:
bashexport ANDROID\_HOME=$HOME/Library/Android/sdkexport PATH=$PATH:$ANDROID\_HOME/tools:$ANDROID\_HOME/platform-tools
4.3 验证 Android 配置
bashadb version # 输出Android Debug Bridge版本
iOS 环境配置(仅 macOS)
5.1 安装 Xcode
从 App Store 下载并安装 Xcode,安装后启动一次以完成初始化。
5.2 安装 CocoaPods
bashsudo gem install cocoapods
5.3 配置 Xcode 命令行工具
bashsudo xcode-select --switch /Applications/Xcode.app
启动 Appium 服务器
6.1 直接启动(命令行)
bashappium
- 默认监听地址:http://localhost:4723/wd/hub
6.2 使用 Appium Desktop(推荐)
- 从Appium Desktop 官网下载对应系统的安装包
- 启动 Appium Desktop,点击 “Start Server” 按钮
验证环境配置
7.1 创建测试脚本 test_calculator.py
python 运行from appium import webdriverimport time\# Android计算器测试示例desired\_caps = {"platformName": "Android","platformVersion": "11", # 替换为你的Android版本"deviceName": "emulator-5554", # 替换为你的设备名称(adb devices查看)"appPackage": "com.android.calculator2","appActivity": "com.android.calculator2.Calculator","automationName": "UiAutomator2","newCommandTimeout": 60 # 命令超时时间}driver = webdriver.Remote('http://localhost:4723/wd/hub', desired\_caps)try:\# 点击数字5driver.find\_element('id', 'com.android.calculator2:id/digit\_5').click()\# 点击加号driver.find\_element('id', 'com.android.calculator2:id/op\_add').click()\# 点击数字3driver.find\_element('id', 'com.android.calculator2:id/digit\_3').click()\# 点击等号driver.find\_element('id', 'com.android.calculator2:id/eq').click()time.sleep(1)result = driver.find\_element('id', 'com.android.calculator2:id/result').textprint(f"计算结果: {result}")except Exception as e:print(f"测试失败: {e}")finally:driver.quit()
7.2 运行测试
- 启动 Appium 服务器
- 启动 Android 模拟器或连接 Android 设备
- 执行脚本:
- bash- python test\_calculator.py
8. 常见问题解决
- Appium 服务器无法启动:
- 检查端口 4723 是否被占用(lsof -i:4723)
- 尝试以管理员 /root 权限启动
- 连接设备失败:
- Android:确保adb devices能识别到设备
- iOS:确保 Xcode 已信任开发者证书
- 元素定位失败:
- 使用 Appium Inspector 辅助定位
- 检查应用包名和 Activity 名称是否正确
9. iOS 测试额外配置
若需测试 iOS 应用,还需:
安装 WebDriverAgent
bashappium driver install xcuitest
配置 Xcode 开发者证书(需 Apple ID)
在 Appium Desired Capabilities 中添加:
python 运行"xcodeOrgId": "YOUR\_TEAM\_ID", # 开发者团队ID"xcodeSigningId": "iPhone Developer"
三、Appium 定位元素的方法
1. ID 定位(推荐)
通过元素的resource-id(Android)或name/id(iOS)定位。
python 运行\# Android示例element = driver.find\_element('id', 'com.example.app:id/button\_login')\# iOS示例element = driver.find\_element('id', 'LoginButton')
2. XPath 定位(灵活)
通过元素路径和属性定位,支持复杂查询。
python 运行\# 按文本查找element = driver.find\_element('xpath', '//android.widget.TextView\[@text="登录"\]')\# 按索引查找(不推荐,易变)element = driver.find\_element('xpath', '(//android.widget.Button)\[2\]')\# 组合条件element = driver.find\_element('xpath', '//android.widget.EditText\[@hint="请输入用户名"\]')
3. 类名定位
通过元素的类名(如android.widget.Button)定位,适用于批量操作。
python 运行\# 获取所有按钮buttons = driver.find\_elements('class name', 'android.widget.Button')
4. 内容描述(Accessibility ID)
通过元素的content-desc属性定位,推荐用于自动化测试。
python 运行element = driver.find\_element('accessibility id', 'LoginButton')
5. Android 专用:UI Automator 定位
使用 Android 的 UiAutomator 框架表达式。
python 运行\# 按文本包含关系查找element = driver.find\_element('android uiautomator', 'new UiSelector().textContains("请输入")')\# 按类名和索引查找element = driver.find\_element('android uiautomator', 'new UiSelector().className("android.widget.EditText").index(0)')
6. iOS 专用:XCUITest 定位
使用 iOS 的 XCUITest 框架表达式。
python 运行\# 按标签名和文本查找element = driver.find\_element('ios predicate string', 'type == "XCUIElementTypeButton" AND name == "登录"')\# 按父子关系查找element = driver.find\_element('ios predicate string', 'parent.type == "XCUIElementTypeTable" AND label ==
7. CSS 选择器(WebView)
在混合应用的 WebView 上下文中使用 CSS 选择器。
python运行\# 切换到WebView上下文webview\_context = \[ctx for ctx in driver.contexts if 'WEBVIEW' in ctx\]\[0\]driver.switch\_to.context(webview\_context)\# 使用CSS选择器定位element = driver.find\_element('css selector', 'button.login')
8. 链接文本(WebView)
在 WebView 中通过链接文本定位。
python 运行element = driver.find\_element('link text', '注册')element = driver.find\_element('partial link text', '忘记密码')
四、Appium 进阶功能
1. 复杂手势操作
Appium 支持模拟各种触摸手势,如滑动、长按、捏合等。
1.1 TouchAction 类(低级 API)
python 运行from appium.webdriver.common.touch\_action import TouchAction\# 长按操作action = TouchAction(driver)action.press(x=100, y=200).wait(2000).release().perform() # 长按2秒\# 滑动操作action.press(x=100, y=500).move\_to(x=100, y=100).release().perform() # 向上滑动
1.2 多点触控(MultiAction)
python 运行from appium.webdriver.common.touch\_action import TouchActionfrom appium.webdriver.common.multi\_action import MultiAction\# 捏合缩放(模拟双指操作)action1 = TouchAction(driver).press(x=100, y=200).move\_to(x=150, y=250).release()action2 = TouchAction(driver).press(x=300, y=400).move\_to(x=250, y=350).release()MultiAction(driver).add(action1, action2).perform()
1.3 iOS 特定手势
python 运行\# iOS 轻扫操作driver.execute\_script("mobile: swipe", {"direction": "left", "element": element\_id})\# iOS 双指点击driver.execute\_script("mobile: doubleTap", {"element": element\_id})
2. 上下文切换(WebView 和原生界面)
测试混合应用时,需要在原生界面和 WebView 之间切换。
python 运行\# 获取所有上下文contexts = driver.contextsprint(contexts) # 输出类似: \['NATIVE\_APP', 'WEBVIEW\_com.example.app'\]\# 切换到 WebViewdriver.switch\_to.context('WEBVIEW\_com.example.app')\# 在 WebView 中使用 Web 定位方式driver.find\_element('css selector', 'button.login').click()\# 切回原生界面driver.switch\_to.context('NATIVE\_APP')
3. Appium 与 CI/CD 集成
将 Appium 测试接入持续集成流程,实现自动化部署和测试。
3.1 Jenkins 集成示例
groovypipeline {agent anystages {stage('Install Dependencies') {steps {sh 'npm install -g appium'sh 'pip install Appium-Python-Client'}}stage('Run Tests') {steps {sh 'appium &' # 后台启动 Appium 服务器sh 'python -m pytest tests/' # 执行测试}}}}
3.2 GitHub Actions 配置
yamlname: Appium Testson: \[push\]jobs:test:runs-on: macos-latest # 或 ubuntu-lateststeps:- uses: actions/checkout@v3- name: Setup Pythonuses: actions/setup-python@v4with:python-version: 3.9- name: Install Appiumrun: |npm install -g appiumappium driver install uiautomator2- name: Install Dependenciesrun: pip install Appium-Python-Client pytest- name: Start Appium Serverrun: appium &- name: Run Testsrun: pytest tests/
4. 并行测试(多设备同时执行)
通过 Appium Grid 或自定义脚本实现多设备并行测试,提高效率。
4.1 Appium Grid 配置
bash\# 启动 Selenium Grid 服务器java -jar selenium-server-standalone-4.8.0.jar standalone\# 注册 Appium 节点到 Gridappium --nodeconfig nodeconfig.json
nodeconfig.json 示例: json { “capabilities”: [ { “browserName”: “Android”, “platform”: “ANDROID”, “deviceName”: “emulator-5554” }, { “browserName”: “iOS”, “platform”: “IOS”, “deviceName”: “iPhone SE” } ], “configuration”: { “proxy”: “org.openqa.grid.selenium.proxy.DefaultRemoteProxy”, “maxSession”: 1, “port”: 4723, “host”: “localhost”, “register”: true, “registerCycle”: 5000, “hubPort”: 4444, “hubHost”: “localhost” } }
4.2 Python 并行测试示例
python 运行import pytestfrom appium import webdriver@pytest.fixture(params=\["device1", "device2"\])def driver(request):\# 根据设备参数配置不同的 Desired Capabilitiescaps = {"device1": {"platformName": "Android","deviceName": "emulator-5554","app": "/path/to/app1.apk"},"device2": {"platformName": "Android","deviceName": "emulator-5556","app": "/path/to/app2.apk"}}driver = webdriver.Remote('http://localhost:4723/wd/hub', caps\[request.param\])yield driverdriver.quit()def test\_example(driver):\# 测试用例,会在每个设备上执行driver.find\_element('id', 'button').click()
5. 性能监控与分析
通过 Appium 监控应用的性能指标,如 CPU、内存、网络流量等。
5.1 Android 性能监控
python 运行\# 获取 CPU 使用率cpu\_usage = driver.execute\_script('mobile: getPerformanceData', {'packageName': 'com.example.app','dataType': 'cpuInfo','timePeriod': 10000})\# 获取内存使用memory\_info = driver.execute\_script('mobile: getPerformanceData', {'packageName': 'com.example.app','dataType': 'memoryInfo'})
5.2 iOS 性能监控
python 运行\# 获取 iOS 应用性能数据performance\_data = driver.execute\_script('mobile: getPerformanceData', {'processName': 'com.example.app','performanceDataType': 'cpuUsage'})
6. 自定义 Appium 命令
通过扩展 Appium 服务器插件,实现自定义功能。
6.1 创建自定义命令(Node.js 示例)
javascript// 自定义插件:添加屏幕录制功能class ScreenRecorderPlugin {static newMethodMap = {'/session/:sessionId/startRecording': {POST: {command: 'startRecordingScreen'}},'/session/:sessionId/stopRecording': {POST: {command: 'stopRecordingScreen'}}}async startRecordingScreen() {// 实现屏幕录制启动逻辑return await this.adb.startScreenRecording();}async stopRecordingScreen() {// 实现屏幕录制停止逻辑return await this.adb.stopScreenRecording();}}// 注册插件module.exports = {plugins: {screenRecorder: ScreenRecorderPlugin}};
6.2 在 Python 中使用自定义命令
python运行\# 启动录制driver.execute\_script('mobile: startRecordingScreen')\# 执行测试操作driver.find\_element('id', 'button').click()\# 停止录制并保存视频video\_data = driver.execute\_script('mobile: stopRecordingScreen')with open('recording.mp4', 'wb') as f:f.write(base64.b64decode(video\_data))
7. 处理特殊场景
7.1 权限弹窗处理
python 运行\# Android 权限弹窗处理try:allow\_button = WebDriverWait(driver, 5).until(EC.element\_to\_be\_clickable(('id','com.android.packageinstaller:id/permission\_allow\_button')))allow\_button.click()except:pass # 无权限弹窗则忽略
7.2 推送通知处理
python 运行\# iOS 推送通知允许按钮try:alert = WebDriverWait(driver, 5).until(EC.alert\_is\_present())driver.switch\_to.alert.accept() # 接受通知except:pass
7.3 键盘操作
pytho 运行\# 隐藏键盘driver.hide\_keyboard()\# 直接输入文本(不使用键盘)driver.set\_value(element, "直接输入文本")
8. Appium 与其他工具集成
8.1与 Allure 集成生成美观测试报告
bashpip install allure-pytestpytest --alluredir=./resultsallure serve ./results
8.2与 Applitools 集成实现视觉测试
python 运行from applitools.selenium import Eyeseyes = Eyes()eyes.api\_key = 'YOUR\_API\_KEY'try:eyes.open(driver, "App Name", "Test Name")eyes.check\_window("Main Screen")finally:eyes.close()