Appium是目前最主流的移动端开源自动化框架,支持Android原生、混合(Hybrid)和移动Web应用。
1. 架构
Appium 采用C/S方式:
客户端(脚本):用 Python、Java、JavaScript 等编写,通过WebDriver协议发送指令。
服务端(Appium Server):接收请求并翻译成特定平台的自动化指令。
Android 驱动:底层一般使用 UiAutomator2(Android 官方测试框架)来操控设备,绕过App签名限制,无需重新打包应用。
手机端会安装两个辅助控件:Appium Settings(管理网络、解锁等)和 io.appium.uiautomator2.server(监听指令),连接时自动安装。
2. 环境搭建
基础环境:安装Java JDK,配置环境变量;安装 Android SDK 并配置 ANDROID_HOME。
Appium 服务器:
方式一:使用桌面版 Appium Desktop,提供图形界面和元素查看器。
方式二:npm install -g appium 命令行启动。
驱动安装:appium driver install uiautomator2(Android 必装)。
设备连接:
真机:开启开发者方式、USB调试、允许安装通过USB的应用。
模拟器:如Android Studio自带的AVD。
测试连接:adb devices能看到设备序列号即为成功。
3.脚本(Python 示例)
准备参数主要用desired_caps,能力:
python
from appium import webdriver
from appium.options.android import UiAutomator2Options
options = UiAutomator2Options()
options.platform_name = "Android"
options.device_name = "你的设备名" # 可任意命名
options.app_package = "com.example.app" # 包名
options.app_activity = ".MainActivity" # 入口Activity
# 或者直接用 app 参数指定 APK 途径
driver = webdriver.Remote("http://localhost:4723", options=options)
# 简单操作
driver.find_element_by_id("com.example:id/login_button").click()
driver.find_element_by_id("username").send_keys("testuser")
driver.quit()
注:现代Appium推荐使用options方式替代旧的字典形式。
4. 元素定位
Android上常用定位方法推荐度排序:
Accessibility ID(第一选择):最稳定,对应 Android 的 content-desc 属性。
// 例:driver.find_element_by_accessibility_id("搜索")
ID:通过 resource-id,一般形如 com.package:id/xxx。注意 ID 可能动态变化。
XPath:万能但性能消耗大,尽量用相对途径和属性组合。
Class Name:不常用,常需配合下标。
Android UIAutomator:当其他不行时,直接使用 UiAutomator API 的语法。
driver.find_element_by_android_uiautomator('new UiSelector().text("确定")')
Android DataMatcher:用于 Espresso 驱动,支持更复杂的一致。
使用 Appium Inspector:连接设备后,通过桌面端“Inspector”可实时查看元素树,一键生成定位器。
5. 高级操作
滚动查找元素:Android 推荐使用 UiAutomator 的 scrollable 配合 UiSelector,或直接用 mobile: scroll 手势。
滑动/缩放:通过 TouchAction 或更现代的 W3C Actions API。
上下文切换:混合应用(内含 WebView)需要从 NATIVE_APP 切换到 WEBVIEW_chrome,之后可像操作 Web 页面一样定位。
python
driver.switch_to.context("WEBVIEW_chrome") # 按实际打印的 context 名称
权限弹窗处理:常通过 ID com.android.packageinstaller:id/permission_deny_button 或文本定位处理系统弹窗。
输入中文:通过 send_keys 直接输入,或在 caps 中添加 unicodeKeyboard: True。
6. 小程序和特殊应用测试关联
你之前问到小程序测试,Appium 也可以测微信小程序,但需要特殊配置:
先打开微信,通过 adb 命令或 Appium 操作进入小程序
由于小程序实质是 WebView,可通过 WebView 上下文进行操作,但限制较多
微信官方更推荐用 minium 做小程序自动化,但对于跨 App 的复杂流程,Appium 仍然是更灵活的选择
7. 踩坑和提效
包名和 Activity 获取:用 adb shell dumpsys window windows | grep mCurrentFocus 查看当前前台界面。
WebView 调试困难:必须保证手机端 Chrome 版本和 Appium 内 chromedriver 版本一致,可从 WebView 开发者方式中查看版本号并下载对应驱动。
执行慢:多用 ID/Accessibility ID,少用 XPath;避免全局全树扫描;使用显式等待 WebDriverWait 保证稳定性。
CI 集成:推荐在无头模拟器中运行,利用 Docker Android 镜像,结合 pytest 和 allure 报告。
Appium Android 自动化的整体思路就是:搭好环境-用 Inspector 定位元素-编写可维护的定位和操作思路-加入等待和异常处理。