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

Pytest Playwright:如何在测试类的所有测试方法中复用同一页面实例

问题根源分析
  • 你的问题核心是fixture作用域设置错误:如果用的是pytest,默认fixture是function级(每个测试方法执行一次),所以test_login执行完后,浏览器/页面实例会被销毁,test_add_product又会重新创建新实例,导致新页面打开。
  • 你当前的测试类架构没问题,把完整E2E场景拆成类内的步骤方法是合理的,不需要调整架构,只需要修正fixture的作用域和注入方式。
最佳解决方案(以pytest+Selenium为例)

1. 把Fixture作用域改成class级

创建一个作用域为class的fixture,确保整个测试类共享同一个浏览器和页面实例:

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture(scope="class")
def shared_browser():
    # 初始化浏览器实例
    driver = webdriver.Chrome()
    driver.maximize_window()
    # 提前打开登录页,作为测试的起始页面
    driver.get("https://你的测试站点域名/login")
    # 将driver传递给测试类的所有方法
    yield driver
    # 测试类所有方法执行完毕后,统一关闭浏览器
    driver.quit()

2. 在测试类中注入共享Fixture

通过@pytest.mark.usefixtures或者直接在方法参数中注入,让所有测试方法复用同一个实例:

@pytest.mark.usefixtures("shared_browser")
class TestProductPurchase:
    def test_login(self, shared_browser):
        # 使用共享的浏览器实例执行登录
        shared_browser.find_element(By.ID, "username").send_keys("test_user")
        shared_browser.find_element(By.ID, "password").send_keys("test_pass")
        shared_browser.find_element(By.ID, "login-btn").click()
        # 断言登录成功,比如检查页面标题
        assert "首页" in shared_browser.title

    def test_add_product(self, shared_browser):
        # 直接复用之前的浏览器页面,不需要重新初始化
        shared_browser.find_element(By.CLASS_NAME, "add-to-cart").click()
        # 断言商品添加成功,比如检查购物车数量
        assert shared_browser.find_element(By.ID, "cart-count").text == "1"

    def test_checkout(self, shared_browser):
        # 继续用同一个实例完成结账流程
        shared_browser.find_element(By.ID, "checkout-btn").click()
        shared_browser.find_element(By.ID, "address").send_keys("测试地址")
        # 断言地址填写正确
        assert shared_browser.find_element(By.ID, "address").get_attribute("value") == "测试地址"

3. 其他测试框架的适配(以unittest为例)

如果用的是unittest,可以用类级别的setUpClass和tearDownClass实现实例共享:

import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By

class TestProductPurchase(unittest.TestCase):
    @classmethod
    def setUpClass(cls):
        # 类初始化时创建一次浏览器实例
        cls.driver = webdriver.Chrome()
        cls.driver.get("https://你的测试站点域名/login")

    @classmethod
    def tearDownClass(cls):
        # 类所有测试方法执行完后关闭浏览器
        cls.driver.quit()

    def test_login(self):
        self.driver.find_element(By.ID, "username").send_keys("test_user")
        # 登录操作及断言...

    def test_add_product(self):
        self.driver.find_element(By.CLASS_NAME, "add-to-cart").click()
        # 添加商品操作及断言...

内容的提问来源于stack exchange,提问作者Назарій Кушнір

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 17:50:17