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

Selenium/Behave中Context对象丢失问题及浏览器会话复用咨询

Behave中多Scenario复用浏览器会话的问题解答

这是预期行为吗?

是的,这是Behave的预期设计。Behave的核心原则是保证每个Scenario独立可执行,因此会在每个Scenario启动前重新初始化Context对象——上一个Scenario中添加的所有属性(比如login_page)都会被清空,这就是你遇到AttributeError的直接原因。

通用做法分三种场景:

1. 全局复用浏览器会话(适合无状态依赖的测试)

如果你的测试套件中所有Scenario之间没有状态耦合(比如一个Scenario的操作不会影响另一个Scenario的初始环境),可以通过environment.py中的before_all和after_all钩子实现全局会话复用:

# environment.py
from selenium import webdriver
from pages.login_page import LoginPage

def before_all(context):
    # 整个测试套件启动时初始化一次浏览器和页面对象
    context.driver = webdriver.Chrome()
    context.login_page = LoginPage(context.driver)

def after_all(context):
    # 所有Scenario执行完成后关闭浏览器
    context.driver.quit()

注意:如果Scenario之间存在状态依赖(比如一个Scenario修改了用户信息,下一个Scenario需要干净的用户数据),需要在before_scenario中添加状态重置逻辑,比如:

def before_scenario(context, scenario):
    # 清空cookie、重置页面状态
    context.driver.delete_all_cookies()
    context.driver.get("https://your-test-domain.com/login")

2. 每个Scenario独立会话(推荐的标准BDD实践)

遵循BDD独立测试的原则,为每个Scenario单独启动/关闭浏览器,确保测试不互相干扰。通过before_scenario和after_scenario实现:

# environment.py
from selenium import webdriver
from pages.login_page import LoginPage

def before_scenario(context, scenario):
    context.driver = webdriver.Chrome()
    context.login_page = LoginPage(context.driver)

def after_scenario(context, scenario):
    context.driver.quit()

你之前用Background的方式本质上是这种思路——Background中的步骤会在每个Scenario前执行,相当于为每个Scenario重新初始化测试环境,只是如果你的Background步骤里包含了浏览器启动逻辑,就会导致每个Scenario都开启新会话。

3. 折中方案:复用会话+隔离场景状态

如果想兼顾测试速度和Scenario独立性,可以复用浏览器会话,但在每个Scenario前重置页面状态:

# environment.py
from selenium import webdriver
from pages.login_page import LoginPage

def before_all(context):
    context.driver = webdriver.Chrome()
    context.login_page = LoginPage(context.driver)

def before_scenario(context, scenario):
    # 重置会话状态,比如清空缓存、回到初始页面
    context.driver.execute_script("window.localStorage.clear();")
    context.driver.delete_all_cookies()
    context.login_page.load()

def after_all(context):
    context.driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 23:26:09