如何在pytest中定义Selenium Driver并实现跨类无实例访问
在Python Selenium中实现全局可访问的WebDriver
方法1:模块级全局变量
Python的模块在程序运行时是单例存在的,你可以把WebDriver定义在单独的模块中,其他模块直接导入即可使用,无需实例化类。
示例:
- 创建
driver_manager.py模块:
from selenium import webdriver # 声明全局driver变量 driver = None def init_driver(browser_type="chrome"): global driver # 避免重复初始化 if driver is None: if browser_type.lower() == "chrome": driver = webdriver.Chrome() elif browser_type.lower() == "firefox": driver = webdriver.Firefox() # 可扩展其他浏览器的初始化逻辑
- 在其他类或模块中直接导入使用:
from driver_manager import driver class TestLogin: def test_login(self): driver.get("https://example.com/login") # 后续测试操作
初始化driver的时机可以放在测试框架的前置钩子中,比如pytest的setup_module或unittest的setUpClass,确保测试开始前完成driver初始化。
方法2:类的类属性(模拟静态变量)
如果更习惯用类来管理,可以将driver定义为类的类属性,通过类名直接访问:
from selenium import webdriver class DriverHolder: # 类属性,模拟静态变量 driver = None @classmethod def init_driver(cls, browser_type="chrome"): if cls.driver is None: if browser_type.lower() == "chrome": cls.driver = webdriver.Chrome() elif browser_type.lower() == "firefox": cls.driver = webdriver.Firefox() # 初始化driver DriverHolder.init_driver("chrome") # 在其他类中访问 class TestCheckout: def test_checkout_flow(self): DriverHolder.driver.get("https://example.com/checkout") # 测试操作逻辑
注意事项
- 确保driver只初始化一次,避免重复创建浏览器实例;
- 多线程/多进程测试场景下,全局driver会导致冲突,此时需要为每个线程/进程单独创建driver实例;
- 测试结束后务必调用
driver.quit()关闭浏览器,避免资源泄漏,可放在测试框架的后置钩子中执行。
内容的提问来源于stack exchange,提问作者Arsenium
相关产品推荐
相关产品推荐

