当前位置: 首页 > news >正文

selenium自动下载更新浏览器对应的webdriver

        相信做过UI自动化的朋友们,都会碰到一个问题,那就是经常莫名其妙的自动化框架跑不起来了,然后一查发现是浏览器更新了,对应的webdriver驱动不匹配了,然后就得自己去看浏览器版本,然后去对应浏览器的webdriver网站下载匹配版本,然后再放到环境变量里,很麻烦。

        那有没有什么方法让框架自己每次去检查浏览器版本,然后发现版本不匹配时,自己去下载对应驱动,然后安装呢,还真有,废话少说,直接上干货。

1.下载依赖包

pip install webdriver-manager

2.封装获取webdriver的方法

        笔者这里封装的方法适合UI自动化框架使用,如果只是单纯写脚本不用这么复杂,封装的方法支持自动下载更新任意浏览器(比如谷歌、eage等)的webdriver,并且支持启动webdriver失败时,自动重试机制(因为经测试发现这个依赖包经常容易第一次启动失败)。

import os
import shutilfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.edge.service import Service as EdgeService
from selenium.webdriver.firefox.service import Service as FirefoxService
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManagerfrom common.base_log import loggerclass GetDriver:"""根据driver_type,自动安装下载浏览器驱动,并返回driver:return:driver"""def __init__(self, driver_type: str):# 判断drivers_type是不是字符串,再判断driver_type的浏览器类型是否符合指定类型if isinstance(driver_type, str) and (driver_type.lower() in ["chrome", "chrome-headless", "firefox", "firefox-headless", "edge"]):self.driver_type = driver_type.lower()else:logger.error(f"不支持该浏览器类型:{driver_type}")raise TypeError(f"不支持该浏览器类型:{driver_type}")def get_driver(self):"""启动 driver,失败时清理缓存后重试一次"""try:return self._start_driver()except Exception as first_exc:logger.warning(f" 启动[{self.driver_type}]浏览器失败:{first_exc}")logger.info("准备清理驱动缓存后重试启动...")self._clear_webdriver_cache()try:logger.info(f"开始尝试重新启动[{self.driver_type}]...")return self._start_driver()except Exception as final_exc:logger.error(f"[{self.driver_type}] 浏览器清理缓存后仍然启动失败:{final_exc}")raisedef _start_driver(self):"""根据driver_type初始化不同的浏览器驱动"""match self.driver_type:case "chrome":return self._chrome_driver()case "chrome-headless":return self._chrome_headless_driver()case "firefox":return self._firefox_driver()case "firefox-headless":return self._firefox_headless_driver()case "edge":return self._edge_driver()case _:raise ValueError(f"不支持的浏览器类型:{self.driver_type}")def _clear_webdriver_cache(self):"""清理webdriver-manager下载的驱动缓存"""cache_dir = os.path.expanduser("~/.wdm")if os.path.exists(cache_dir):logger.info(f"开始清理缓存目录:{cache_dir}")try:shutil.rmtree(os.path.expanduser("~/.wdm"), ignore_errors=True)logger.info("清理 webdriver 缓存成功")except Exception as e:logger.warning(f"清理缓存失败:{e}")else:logger.info("缓存目录不存在,无需清理")def _setup_driver(self, driver):"""通用 driver 设置:最大化窗口 + 隐式等待 + 清理 cookies"""driver.maximize_window()driver.implicitly_wait(10)driver.delete_all_cookies()  # 清除浏览器所有缓存def _chrome_driver(self):# chrome浏览器# selenium 3的写法# driver = webdriver.Chrome(ChromeDriverManager().install())# selenium 4的写法options = webdriver.ChromeOptions()# 去掉"chrome正受到自动化测试软件的控制"的提示条options.add_experimental_option("excludeSwitches", ["enable-automation"])options.add_experimental_option('useAutomationExtension', False)driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=options)self._setup_driver(driver)return driverdef _chrome_headless_driver(self):# chrome headless模式# 参数说明,参考地址:https://github.com/GoogleChrome/chrome-launcher/blob/master/docs/chrome-flags-for-tools.md#--enable-automationchrome_option = webdriver.ChromeOptions()chrome_option.add_argument("--headless")chrome_option.add_argument("--no-sandbox")  # 注意:linux运行必须要有这个chrome_option.add_argument("--window-size=1920x1080")# 本地chrome浏览器# selenium 3的写法# driver = webdriver.Chrome(ChromeDriverManager().install())# selenium 4的写法driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()), options=chrome_option)self._setup_driver(driver)return driverdef _firefox_driver(self):# firefox浏览器# selenium 3# driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())# selenium 4driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))self._setup_driver(driver)return driverdef _firefox_headless_driver(self):# firefox headless模式firefox_options = webdriver.FirefoxOptions()firefox_options.add_argument("--headless")firefox_options.add_argument("--disable-gpu")# selenium 3# driver = webdriver.Firefox(executable_path=GeckoDriverManager().install())# selenium 4driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()), options=firefox_options)self._setup_driver(driver)return driverdef _edge_driver(self):# Edge浏览器# selenium 3# driver = webdriver.Edge(EdgeChromiumDriverManager().install())# selenium 4edge_options = webdriver.EdgeOptions()edge_options.use_chromium = True# 屏蔽inforbaredge_options.add_experimental_option('useAutomationExtension', False)edge_options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])driver = webdriver.Edge(service=EdgeService(EdgeChromiumDriverManager().install()), options=edge_options)self._setup_driver(driver)return driverif __name__ == '__main__':driver = GetDriver("chrome").get_driver()print(driver)driver.get("https://www.baidu.com")

http://www.xdnf.cn/news/1391275.html

相关文章:

  • Spring AOP:JDK与CGLIB代理机制解析
  • 数据结构(C语言篇):(五)单链表算法题(上)
  • 对于牛客网—语言学习篇—编程初学者入门训练—函数类型:BC156 牛牛的数组匹配及BC158 回文数解析
  • 美食推荐|美食推荐小程序|基于微信小程序的美食推荐系统设计与实现(源码+数据库+文档)
  • GPFS性能优化
  • Skywork:昆仑万维推出天工超级智能体
  • vue3 表单项不对齐的解决方案
  • Custom SRP - LOD and Reflections
  • 【AI】常见8大LLM大语言模型地址
  • SPSA为什么要求三阶可导
  • 事务和锁(进阶)
  • 对接连连支付(七)-- 退款查询
  • C++ 线程安全初始化机制详解与实践
  • Elasticsearch核心配置与性能优化
  • 从零开始的python学习——常量与变量
  • 复杂保单信息如何自动提取
  • 【新启航】3D 逆向抄数的工具技术与核心能力:基于点云处理的扫描设备操作及模型重建方法论
  • Java面试现场:Spring Boot+Redis+MySQL在电商场景下的技术深度剖析
  • Shell 编程基础(续):流程控制与实践
  • Python Imaging Library (PIL) 全面指南:PIL图像处理异常处理与优化
  • 数据结构:选择排序 (Selection Sort)
  • JavaScript 中,判断一个数组是否包含特定值
  • 【完整源码+数据集+部署教程】停车位状态检测系统源码和数据集:改进yolo11-DCNV2-Dynamic
  • 机器学习入门,从线性规划开始
  • 基于 Selenium 和 BeautifulSoup 的动态网页爬虫:一次对百度地图 POI 数据的深度模块化剖析
  • el-table实现双击编辑-el-select选择框+输入框限制非负两位小数
  • SQL知识
  • Python的一次实际应用:利用Python操作Word文档的页码
  • 打造高效外贸网站:美国服务器的战略价值
  • ASCM使用手册