from selenium import webdriver from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.firefox.options import Options as FirefoxOptions from selenium.webdriver.edge.options import Options as EdgeOptions from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.firefox import GeckoDriverManager from webdriver_manager.microsoft import EdgeChromiumDriverManager from core.config.config_manager import ConfigManager from core.utils.logger import Logger from core.singleton import Singleton class DriverFactory(metaclass=Singleton): def __init__(self): self.config = ConfigManager() self.logger = Logger.get_logger() self._drivers = {} def create_driver(self, browser_type=None, options=None): """创建Web驱动""" browser_config = self.config.get_browser_config() browser = browser_type or browser_config['browser'] if browser in self._drivers: return self._drivers[browser] self.logger.info(f"创建 {browser} 浏览器驱动") if browser.lower() == 'chrome': driver = self._create_chrome_driver(options) elif browser.lower() == 'firefox': driver = self._create_firefox_driver(options) elif browser.lower() == 'edge': driver = self._create_edge_driver(options) else: raise ValueError(f"不支持的浏览器类型: {browser}") # 设置窗口大小 window_size = browser_config['window_size'] driver.set_window_size(*window_size) # 设置隐式等待 implicit_wait = browser_config['implicit_wait'] driver.implicitly_wait(implicit_wait) self._drivers[browser] = driver return driver def _create_chrome_driver(self, options=None): """创建Chrome驱动""" chrome_options = options or ChromeOptions() browser_config = self.config.get_browser_config() if browser_config['headless']: chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') chrome_options.add_argument('--disable-gpu') chrome_options.add_argument('--window-size=1920,1080') # 自动下载并配置ChromeDriver driver_path = ChromeDriverManager().install() driver = webdriver.Chrome(executable_path=driver_path, options=chrome_options) return driver def _create_firefox_driver(self, options=None): """创建Firefox驱动""" firefox_options = options or FirefoxOptions() browser_config = self.config.get_browser_config() if browser_config['headless']: firefox_options.add_argument('--headless') # 自动下载并配置GeckoDriver driver_path = GeckoDriverManager().install() driver = webdriver.Firefox(executable_path=driver_path, options=firefox_options) return driver def _create_edge_driver(self, options=None): """创建Edge驱动""" edge_options = options or EdgeOptions() browser_config = self.config.get_browser_config() if browser_config['headless']: edge_options.add_argument('--headless') # 自动下载并配置EdgeDriver driver_path = EdgeChromiumDriverManager().install() driver = webdriver.Edge(executable_path=driver_path, options=edge_options) return driver def quit_all_drivers(self): """退出所有驱动""" for browser, driver in self._drivers.items(): self.logger.info(f"退出 {browser} 浏览器驱动") try: driver.quit() except Exception as e: self.logger.error(f"退出 {browser} 驱动时出错: {str(e)}") self._drivers = {}