Python新手求助:如何用Pytest在单例Selenium WebDriver中运行多测试类?
用Pytest结合单例WebDriver实现多测试类共用实例
首先得把你的单例WebDriver类补全——你原来的__new__方法没写完,得确保它能正确创建并返回唯一的driver实例:
from selenium import webdriver from selenium.webdriver.chrome.options import Options class WebDriverSingleton(object): """基于__new__实现的单例WebDriver类""" _instance = None def __new__(cls): if cls._instance is None: # 这里可以按需配置浏览器选项,比如最大化窗口、无头模式等 chrome_options = Options() chrome_options.add_argument("--start-maximized") # 创建driver实例 cls._instance = webdriver.Chrome(options=chrome_options) return cls._instance # 封装退出方法,记得重置单例实例 def quit(self): if self._instance: self._instance.quit() self._instance = None
接下来用Pytest的session级fixture来绑定这个单例——session级别意味着整个测试会话只会初始化一次,完美匹配你共用实例的需求:
# 把这个fixture放在项目根目录的conftest.py里,所有测试文件都能自动识别 import pytest from your_module import WebDriverSingleton # 替换成你实际的模块名 @pytest.fixture(scope="session") def driver(): # 获取单例driver实例 driver_instance = WebDriverSingleton() yield driver_instance # 测试会话结束后统一关闭driver driver_instance.quit()
然后在你的测试类里,直接把driver fixture作为参数传入测试方法,或者用装饰器标记测试类,就能复用同一个浏览器实例了:
示例测试类1(test_login.py)
class TestLogin: def test_valid_login(self, driver): driver.get("https://your-test-site.com/login") # 执行登录操作... assert driver.title == "Home Page" def test_invalid_login(self, driver): driver.get("https://your-test-site.com/login") # 执行无效登录操作... assert "Invalid credentials" in driver.page_source
示例测试类2(test_checkout.py)
class TestCheckout: def test_add_to_cart(self, driver): driver.get("https://your-test-site.com/products") # 执行加购操作... assert "1 item in cart" in driver.page_source def test_checkout_flow(self, driver): # 直接复用之前的浏览器会话,无需重新启动 driver.get("https://your-test-site.com/cart") # 执行结账流程... assert "Order confirmed" in driver.page_source
几个关键注意点:
- 把fixture放在
conftest.py是Pytest的最佳实践,不需要在每个测试文件里重复导入。 - 单例类的
quit方法一定要重置_instance,否则下次运行测试会拿到已关闭的无效driver。 - 如果后续需要并行测试,单例会有线程安全问题,但新手阶段先聚焦单线程测试场景即可。
- 可以在单例类里封装更多常用操作(比如显式等待、元素定位),让测试代码更简洁。
内容的提问来源于stack exchange,提问作者Kaan Tamersoy
相关产品推荐
相关产品推荐

