| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- 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 = {}
|