如何在SeleniumBase测试会话中一次性添加会话ID到Cookies?
问题背景
之前使用纯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
相关产品推荐
相关产品推荐

