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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:00:47