Appium自动化测试中如何保持登录状态

在 Appium 自动化测试中保持登录状态,可以通过以下方法实现,避免每次测试重复登录,提升测试效率:

1. 复用 Session(不重启应用)

原理:Appium 默认每次启动会创建新会话(Session),关闭会话会导致应用重启。通过 复用已有 Session,保持应用持续运行。

步骤

  1. 首次启动时,保存 Session ID 和登录状态。
  2. 后续测试,直接附加到已有 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 时(如跨设备测试)。

步骤

  1. 首次登录,获取 Token/Cookie。
  2. 存储凭证(文件、数据库、内存)。
  3. 后续测试,直接注入凭证到请求或本地存储。

示例代码(保存 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 为例):

  1. 登录后备份应用数据
  2. 测试前恢复数据
  3. 启动应用,自动进入已登录状态。

自动化实现

import subprocess

# 测试前恢复缓存
subprocess.run('adb restore backup.ab', shell=True)

# 启动应用
driver = webdriver.Remote(...)

4. 使用 Mock 或后门接口(需开发配合)

原理:与开发协作,为测试环境提供 免登录接口测试账号自动登录

实现方式

  1. 调用后门接口
  2. 自动登录测试账号

5. 处理应用后台重启

场景:应用在后台被系统回收后,再次打开需恢复登录态。

解决方案

  • 重新注入 Token/Cookie(参考方法2)。
  • 使用 driver.launch_app() 而非 driver.start_activity(),保留应用上下文。

注意事项

  1. 测试隔离性:确保登录态不会影响其他测试用例(如并行测试时需隔离数据)。
  2. 安全性:避免将真实账号密码硬编码在脚本中,使用环境变量或加密存储。
  3. 清理数据:测试结束后按需清理残留数据,避免影响下一次测试。

总结

复用 Session

简单高效,无需额外存储

依赖 Appium 会话保持,不适合分布式测试

保存凭证

灵活,适合复杂场景

需处理凭证注入逻辑

利用应用缓存

原生支持,速度快

需要设备文件操作权限

Mock/后门接口

彻底跳过登录流程

依赖开发配合,仅限测试环境

根据项目需求选择合适方案,通常 复用 Session + 保存凭证 是最常用组合。

进阶高级测试工程师 文章被收录于专栏

《高级软件测试工程师》专栏旨在为测试领域的从业者提供深入的知识和实践指导,帮助大家从基础的测试技能迈向高级测试专家的行列。 在本专栏中,主要涵盖的内容: 1. 如何设计和实施高效的测试策略; 2. 掌握自动化测试、性能测试和安全测试的核心技术; 3. 深入理解测试驱动开发(TDD)和行为驱动开发(BDD)的实践方法; 4. 测试团队的管理和协作能力。 ——For.Heart

全部评论

相关推荐

评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务