如何在不同文件/类中复用同一Selenium驱动避免新开窗口
Selenium跨类跨文件复用Chrome Driver实现方法
问题根源
你当前的代码每次执行WebPage()实例化操作时,都会触发类的__init__方法,重复执行webdriver.Chrome()初始化逻辑,每次都会启动新的Chrome进程,因此会不断打开新的浏览器窗口。要实现同一窗口复用,核心是保证driver对象全局仅初始化一次。
方案1:单例模式改造WebPage类(推荐)
通过单例模式控制WebPage类全局仅生成一个实例,driver初始化逻辑仅执行一次,不管在多少个文件、多少个类中调用WebPage().get_driver(),拿到的都是同一个driver对象,原有业务代码改动量极小。
改造后的web_driver.py代码如下:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager class WebPage: _instance = None _driver = None def __new__(cls, *args, **kwargs): # 仅第一次实例化时执行初始化逻辑 if not cls._instance: cls._instance = super().__new__(cls) options = Options() options.add_argument("--window-size=1280,720") options.add_argument('--disable-gpu') options.add_argument('log-level=3') cls._driver = webdriver.Chrome( service=Service(ChromeDriverManager().install()), options=options ) cls._driver.get('https://website.net/') return cls._instance def get_driver(self): return self._driver
原有action.py代码无需任何修改,即可直接复用同一个driver实例。
方案2:依赖注入传参
如果不想修改原有WebPage类的逻辑,可以在程序入口统一完成一次driver初始化,之后所有需要使用driver的类,在实例化时将已创建好的driver对象作为参数传入,避免类内部重复实例化WebPage。
- 首先在程序入口(如
main.py)统一初始化:
from web_driver import WebPage from action import Action if __name__ == "__main__": # 全局仅初始化一次driver global_page = WebPage() shared_driver = global_page.get_driver() # 初始化业务类时传入共享driver action_instance = Action(shared_driver) # 其他需要用driver的类都传入同一个shared_driver即可
- 修改
action.py的构造方法,接收外部传入的driver:
class Action: def __init__(self, driver): self.wincap = driver
注意事项
- 所有driver初始化逻辑仅保留一处,不要在任何业务类的构造方法中直接调用
WebPage()或者webdriver.Chrome() - 程序运行结束后记得调用
driver.quit()关闭浏览器,避免后台残留无用Chrome进程
内容的提问来源于stack exchange,提问作者Norad
相关产品推荐
相关产品推荐

