Appium 3.x 企业级安卓APP安装规范写法:商城实战示例
前言
本文整理Appium移动端自动化测试中,APP安装操作的企业级标准实现方式。对比课堂教学中为串讲知识点而设计的零散流程,梳理符合项目实战的代码结构与设计逻辑,所有代码均基于 Appium 3.5.2 + Python Client 5.x 环境实操验证,适合入门后向项目写法过渡,用于复习与面试参考。
本文为个人原创学习笔记,代码与内容均为实操整理,发布于CSDN仅作技术交流;Appium遵循Apache 2.0开源协议。
一、企业级写法 vs 课堂演示写法
课堂上"先打开设置→跳转APP→再安装商城"的流程,是为了在一段脚本里串联多个API知识点,属于教学专用演示。真实企业项目中,代码以「稳定、可维护、易排查」为核心,不会有冗余的跨应用跳转,目标明确、逻辑闭环。
两者核心区别:
| 维度 | 课堂演示写法 | 企业级规范写法 |
|---|---|---|
| 流程设计 | 为串联API强行拼接多步操作,流程冗余 | 目标单一,只做安装/启动相关操作,无多余步骤 |
| 结果校验 | 执行完无验证,静默失败也无法感知 | 每一步操作后校验状态,确保执行成功 |
| 代码维护 | 包名、路径硬编码在命令里,修改麻烦 | 配置抽离为变量,改参数不用动业务逻辑 |
| 排查成本 | 无日志输出,报错不知道哪一步出问题 | 每步加打印日志,快速定位故障点 |
二、方案一:自动安装(企业90%场景首选)
适用场景
常规自动化测试项目,只需要启动目标APP,不需要频繁卸载重装。这是Appium官方推荐的最简标准写法,全程不用自己写安装判断逻辑。
实现逻辑
直接在能力集caps中配置本地APK文件路径,Appium会自动处理:
- 设备未安装该APP → 自动安装后启动
- 设备已安装该APP → 直接启动(配合
noReset保留数据)
完整可运行代码
python
import time
from appium import webdriver
from appium.options.common import AppiumOptions
# ========== 可配置项:修改这里即可切换不同APP ==========
# 目标APP包名
TARGET_APP_PACKAGE = "com.tpshop.malls"
# 本地APK文件绝对路径
APK_FILE_PATH = r"D:\BaiduNetdiskDownload\配套课件\9-阶段九UI自动化测试\移动端环境\apk\TPshop.apk"
# Appium服务地址
APPIUM_SERVER = "http://127.0.0.1:4723"
# 设备基础配置
caps = {
"platformName": "Android",
"appium:platformVersion": "9",
"appium:deviceName": "127.0.0.1:5555",
"appium:automationName": "UiAutomator2",
# 配置APK路径,Appium自动处理安装与启动
"appium:app": APK_FILE_PATH,
"appium:noReset": True,
}
# 加载配置,连接Appium服务
options = AppiumOptions()
options.load_capabilities(caps)
driver = webdriver.Remote(command_executor=APPIUM_SERVER, options=options)
# 等待APP加载完成
time.sleep(3)
# 验证启动结果
print(f"启动成功,当前包名:{driver.current_package}")
print(f"当前页面:{driver.current_activity}")
# 结束会话
driver.quit()
三、方案二:可控式安装卸载(环境清理/多版本测试)
适用场景
需要强制清理环境、每次执行前重装APP,或者需要切换多个APP版本的测试场景。
对安装、卸载过程有完全控制权,每一步都有状态校验,确保环境干净一致。
完整规范代码
python
import time
from appium import webdriver
from appium.options.common import AppiumOptions
# ========== 可配置项 ==========
TARGET_APP_PACKAGE = "com.tpshop.malls"
APK_FILE_PATH = r"D:\BaiduNetdiskDownload\配套课件\9-阶段九UI自动化测试\移动端环境\apk\TPshop.apk"
APPIUM_SERVER = "http://127.0.0.1:4723"
# 设备基础配置
caps = {
"platformName": "Android",
"appium:platformVersion": "9",
"appium:deviceName": "127.0.0.1:5555",
"appium:automationName": "UiAutomator2",
# 初始化先停在系统桌面,不启动业务APP
"appium:appPackage": "com.android.launcher3",
"appium:noReset": True,
}
# 连接Appium服务
options = AppiumOptions()
options.load_capabilities(caps)
driver = webdriver.Remote(command_executor=APPIUM_SERVER, options=options)
# ========== 核心安装流程 ==========
# 1. 检查APP是否已安装
is_installed = driver.execute_script("mobile: isAppInstalled", {"appId": TARGET_APP_PACKAGE})
if is_installed:
print(f"检测到 {TARGET_APP_PACKAGE} 已安装,执行卸载清理...")
driver.execute_script("mobile: removeApp", {"appId": TARGET_APP_PACKAGE})
time.sleep(3) # 等待卸载完成
# 卸载后二次校验
if not driver.execute_script("mobile: isAppInstalled", {"appId": TARGET_APP_PACKAGE}):
print("卸载成功")
else:
print("警告:卸载失败,请检查权限")
# 2. 执行安装
print("开始安装TPshop商城...")
driver.execute_script("mobile: installApp", {"appPath": APK_FILE_PATH})
time.sleep(5) # 安装耗时较长,根据APK大小调整等待时间
# 3. 安装结果校验
if driver.execute_script("mobile: isAppInstalled", {"appId": TARGET_APP_PACKAGE}):
print("✅ TPshop商城安装成功")
else:
print("❌ 安装失败,请检查APK文件路径与系统权限")
# 4. 启动APP验证
print("正在启动APP...")
driver.execute_script("mobile: shell", {
"command": f"monkey -p {TARGET_APP_PACKAGE} -c android.intent.category.LAUNCHER 1"
})
time.sleep(3)
print(f"当前前台包名:{driver.current_package}")
# 结束会话
driver.quit()
print("安装测试流程结束")
四、API版本适配对照表(复习必看)
Appium-Python-Client 5.x 已移除大量直接调用方法,所有操作统一通过 mobile: 协议执行,对应关系如下:
| 老版本直接方法(已失效) | 新版标准写法 | 功能说明 |
|---|---|---|
driver.is_app_installed() |
driver.execute_script("mobile: isAppInstalled", {"appId": "包名"}) |
判断APP是否已安装 |
driver.install_app() |
driver.execute_script("mobile: installApp", {"appPath": "APK路径"}) |
安装本地APK |
driver.remove_app() |
driver.execute_script("mobile: removeApp", {"appId": "包名"}) |
卸载指定APP |
driver.terminate_app() |
driver.execute_script("mobile: terminateApp", {"appId": "包名"}) |
强制关闭APP |
前置条件:启动Appium服务时需添加
--relaxed-security参数,放开shell与安装相关权限,本地学习测试使用无安全风险。
五、企业级写法核心设计总结
- 配置抽离:把包名、路径、地址等易变参数抽成顶部变量,后续维护只改配置,不用动业务逻辑
- 结果校验:关键操作后必须校验执行结果,避免静默失败导致后续步骤全错
- 日志清晰:每一步加打印输出,排查问题时能一眼定位到失败节点
- 最小冗余:不做无意义的跨应用跳转,初始化要么直接打开目标APP,要么停在桌面,流程最短最稳定
版权与参考说明
- 本文为个人原创学习笔记,所有代码与案例均为实操整理,发布于CSDN仅作技术交流;
- Appium 为开源自动化测试框架,遵循 Apache 2.0 开源协议,引用其官方规范仅作学习说明;
- 转载请注明原文出处,禁止商用;
- 参考资料:Appium 官方文档