You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SeleniumBase测试会话中一次性添加会话ID到Cookies?

解决SeleniumBase中Session级Cookie注入的问题

问题背景

之前使用纯Selenium时,通过session作用域的fixture初始化WebDriver并注入会话Cookie:

@pytest.fixture(scope="session")
def webdriver_fixture(cookie_session_fixture):
    # driver初始化逻辑
    ...
    driver.get(os.getenv("STAND_URL"))
    driver.add_cookie({"name": "PHPSESSID", "value": cookie_session_fixture})
    yield driver
    driver.quit()

切换到SeleniumBase后,默认的sb fixture作用域为function,无法直接在session级fixture中引用,导致无法像之前一样一次性注入Cookie并在整个测试会话复用。

解决方案

方案1:利用SeleniumBase内置Cookie持久化机制

SeleniumBase提供了save_cookies()和load_cookies()方法,可在首次测试时注入并保存Cookie,后续测试直接加载复用:

import os
import pytest

@pytest.fixture(scope="function", autouse=True)
def reuse_session_cookies(sb, cookie_session_fixture):
    # 检查当前会话是否已存在目标Cookie
    target_cookie = sb.get_cookie("PHPSESSID")
    if not target_cookie:
        sb.open(os.getenv("STAND_URL"))
        sb.driver.add_cookie({"name": "PHPSESSID", "value": cookie_session_fixture})
        # 将Cookie保存到默认路径(seleniumbase/cookies/)
        sb.save_cookies("persisted_session_cookies")
    else:
        # 加载已保存的Cookie
        sb.load_cookies("persisted_session_cookies")
    # 确保页面处于目标站点,使Cookie生效
    sb.open(os.getenv("STAND_URL"))

方案2:自定义Session级SeleniumBase Driver

绕过默认的sb fixture,手动初始化session作用域的SeleniumBase Driver实例,完全控制生命周期:

import os
import pytest
from seleniumbase import Driver

@pytest.fixture(scope="session")
def sb_session(cookie_session_fixture):
    # 初始化Session级Driver
    sb = Driver()
    try:
        sb.open(os.getenv("STAND_URL"))
        sb.driver.add_cookie({"name": "PHPSESSID", "value": cookie_session_fixture})
        yield sb
    finally:
        # 测试会话结束后销毁Driver
        sb.quit()

# 测试用例中使用自定义的session级fixture
def test_dashboard_access(sb_session):
    sb_session.open(os.getenv("STAND_URL") + "/dashboard")
    # 执行测试断言

方案3:结合--keep_session命令行参数复用浏览器会话

运行测试时添加--keep_session参数,SeleniumBase会在整个测试会话中复用同一个浏览器实例,此时只需在首次测试时注入Cookie:

import os
import pytest

# 标记Cookie是否已注入
cookie_injected = False

@pytest.fixture(scope="function", autouse=True)
def inject_cookie_once(sb, cookie_session_fixture):
    global cookie_injected
    if not cookie_injected:
        sb.open(os.getenv("STAND_URL"))
        sb.driver.add_cookie({"name": "PHPSESSID", "value": cookie_session_fixture})
        cookie_injected = True
    sb.open(os.getenv("STAND_URL"))

执行测试命令:

pytest --keep_session

方案对比

  • 方案1:无需额外配置,依赖SeleniumBase内置能力,兼容性好,适合大多数场景。
  • 方案2:完全自定义Driver生命周期,控制度高,但需手动处理资源销毁。
  • 方案3:依赖命令行参数,适合快速复用会话的场景,但不支持测试中途重置会话的需求。

内容的提问来源于stack exchange,提问作者ReGuardian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 06:12:38