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,提问作者Назарій Кушнір
相关产品推荐
相关产品推荐

