driver_factory.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options as ChromeOptions
  3. from selenium.webdriver.firefox.options import Options as FirefoxOptions
  4. from selenium.webdriver.edge.options import Options as EdgeOptions
  5. from webdriver_manager.chrome import ChromeDriverManager
  6. from webdriver_manager.firefox import GeckoDriverManager
  7. from webdriver_manager.microsoft import EdgeChromiumDriverManager
  8. from core.config.config_manager import ConfigManager
  9. from core.utils.logger import Logger
  10. from core.singleton import Singleton
  11. class DriverFactory(metaclass=Singleton):
  12. def __init__(self):
  13. self.config = ConfigManager()
  14. self.logger = Logger.get_logger()
  15. self._drivers = {}
  16. def create_driver(self, browser_type=None, options=None):
  17. """创建Web驱动"""
  18. browser_config = self.config.get_browser_config()
  19. browser = browser_type or browser_config['browser']
  20. if browser in self._drivers:
  21. return self._drivers[browser]
  22. self.logger.info(f"创建 {browser} 浏览器驱动")
  23. if browser.lower() == 'chrome':
  24. driver = self._create_chrome_driver(options)
  25. elif browser.lower() == 'firefox':
  26. driver = self._create_firefox_driver(options)
  27. elif browser.lower() == 'edge':
  28. driver = self._create_edge_driver(options)
  29. else:
  30. raise ValueError(f"不支持的浏览器类型: {browser}")
  31. # 设置窗口大小
  32. window_size = browser_config['window_size']
  33. driver.set_window_size(*window_size)
  34. # 设置隐式等待
  35. implicit_wait = browser_config['implicit_wait']
  36. driver.implicitly_wait(implicit_wait)
  37. self._drivers[browser] = driver
  38. return driver
  39. def _create_chrome_driver(self, options=None):
  40. """创建Chrome驱动"""
  41. chrome_options = options or ChromeOptions()
  42. browser_config = self.config.get_browser_config()
  43. if browser_config['headless']:
  44. chrome_options.add_argument('--headless')
  45. chrome_options.add_argument('--no-sandbox')
  46. chrome_options.add_argument('--disable-dev-shm-usage')
  47. chrome_options.add_argument('--disable-gpu')
  48. chrome_options.add_argument('--window-size=1920,1080')
  49. # 自动下载并配置ChromeDriver
  50. driver_path = ChromeDriverManager().install()
  51. driver = webdriver.Chrome(executable_path=driver_path, options=chrome_options)
  52. return driver
  53. def _create_firefox_driver(self, options=None):
  54. """创建Firefox驱动"""
  55. firefox_options = options or FirefoxOptions()
  56. browser_config = self.config.get_browser_config()
  57. if browser_config['headless']:
  58. firefox_options.add_argument('--headless')
  59. # 自动下载并配置GeckoDriver
  60. driver_path = GeckoDriverManager().install()
  61. driver = webdriver.Firefox(executable_path=driver_path, options=firefox_options)
  62. return driver
  63. def _create_edge_driver(self, options=None):
  64. """创建Edge驱动"""
  65. edge_options = options or EdgeOptions()
  66. browser_config = self.config.get_browser_config()
  67. if browser_config['headless']:
  68. edge_options.add_argument('--headless')
  69. # 自动下载并配置EdgeDriver
  70. driver_path = EdgeChromiumDriverManager().install()
  71. driver = webdriver.Edge(executable_path=driver_path, options=edge_options)
  72. return driver
  73. def quit_all_drivers(self):
  74. """退出所有驱动"""
  75. for browser, driver in self._drivers.items():
  76. self.logger.info(f"退出 {browser} 浏览器驱动")
  77. try:
  78. driver.quit()
  79. except Exception as e:
  80. self.logger.error(f"退出 {browser} 驱动时出错: {str(e)}")
  81. self._drivers = {}