Appium自动化测试中如何保持登录状态
在 Appium 自动化测试中保持登录状态,可以通过以下方法实现,避免每次测试重复登录,提升测试效率:
1. 复用 Session(不重启应用)
原理:Appium 默认每次启动会创建新会话(Session),关闭会话会导致应用重启。通过 复用已有 Session,保持应用持续运行。
步骤:
- 首次启动时,保存 Session ID 和登录状态。
- 后续测试,直接附加到已有 Session,避免重启。
示例代码:
from appium import webdriver
# 首次启动并登录
def setup_class():
desired_caps = {
'platformName': 'Android',
'deviceName': 'emulator-5554',
'appPackage': 'com.example.app',
'appActivity': '.MainActivity',
'noReset': True # 关键:禁止重置应用状态
}
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
login(driver) # 执行登录操作
return driver
# 后续测试直接复用 driver
def test_case1():
driver = setup_class()
driver.find_element(By.ID, 'button1').click()
# 应用保持登录状态,无需重新登录
# 注意:测试结束后需手动关闭 Session
关键配置:
'noReset': True:防止 Appium 自动清除应用数据。'fullReset': False:避免卸载重装应用。
2. 保存并复用登录凭证
原理:首次登录后,将 Token、Cookie 或账号信息持久化存储,后续测试直接使用凭证绕过登录。
适用场景:无法复用 Session 时(如跨设备测试)。
步骤:
- 首次登录,获取 Token/Cookie。
- 存储凭证(文件、数据库、内存)。
- 后续测试,直接注入凭证到请求或本地存储。
示例代码(保存 Token):
import json
# 首次登录获取 Token
def login_and_save_token():
driver = webdriver.Remote(...)
driver.find_element(By.ID, 'username').send_keys('user')
driver.find_element(By.ID, 'password').send_keys('pass')
driver.find_element(By.ID, 'login_btn').click()
token = driver.get_cookie('session_token')['value']
with open('token.json', 'w') as f:
json.dump({'token': token}, f)
driver.quit()
# 后续测试使用 Token 跳过登录
def test_with_token():
with open('token.json', 'r') as f:
token = json.load(f)['token']
# 注入 Token 到请求头或本地存储(需具体实现)
driver = webdriver.Remote(...)
driver.execute_script('localStorage.setItem("token", arguments[0]);', token)
driver.launch_app() # 重启应用但保留数据
3. 利用应用缓存(Android/iOS)
原理:登录后,应用本地会缓存用户数据(如 SQLite、SharedPreferences)。直接操作缓存文件,快速恢复登录状态。
步骤(以 Android 为例):
- 登录后备份应用数据:
- 测试前恢复数据:
- 启动应用,自动进入已登录状态。
自动化实现:
import subprocess
# 测试前恢复缓存
subprocess.run('adb restore backup.ab', shell=True)
# 启动应用
driver = webdriver.Remote(...)
4. 使用 Mock 或后门接口(需开发配合)
原理:与开发协作,为测试环境提供 免登录接口 或 测试账号自动登录。
实现方式:
- 调用后门接口:
- 自动登录测试账号:
5. 处理应用后台重启
场景:应用在后台被系统回收后,再次打开需恢复登录态。
解决方案:
- 重新注入 Token/Cookie(参考方法2)。
- 使用
driver.launch_app()而非driver.start_activity(),保留应用上下文。
注意事项
- 测试隔离性:确保登录态不会影响其他测试用例(如并行测试时需隔离数据)。
- 安全性:避免将真实账号密码硬编码在脚本中,使用环境变量或加密存储。
- 清理数据:测试结束后按需清理残留数据,避免影响下一次测试。
总结
复用 Session | 简单高效,无需额外存储 | 依赖 Appium 会话保持,不适合分布式测试 |
保存凭证 | 灵活,适合复杂场景 | 需处理凭证注入逻辑 |
利用应用缓存 | 原生支持,速度快 | 需要设备文件操作权限 |
Mock/后门接口 | 彻底跳过登录流程 | 依赖开发配合,仅限测试环境 |
根据项目需求选择合适方案,通常 复用 Session + 保存凭证 是最常用组合。
《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart

查看23道真题和解析