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

ChromeDriverManager的具体用法

ChromeDriverManagerwebdriver_manager 库的一部分,它用于自动管理 ChromeDriver 的下载和更新。使用 ChromeDriverManager 可以避免手动下载 ChromeDriver 并匹配系统中安装的 Chrome 浏览器版本。以下是 ChromeDriverManager 的基本用法:

步骤

1.安装 webdriver_manager 库:
pip install webdriver-manager
2.导入相关依赖
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
3.设置options参数(optional)

这边因为博主要做CI/CD 需要进行无头模式的设置所以是必需的

# 设置 Chrome 选项(如果需要)
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")
4.用chromedrivermanager安装驱动 
# 使用 ChromeDriverManager 处理驱动安装
driver_path = ChromeDriverManager().install()
service = Service(driver_path)

代码解释:

  1. ChromeDriverManager().install():

    • 目标: 自动管理 ChromeDriver 的安装。

    • 功能: ChromeDriverManager()webdriver_manager 包中的一个类,它负责管理 Chrome 浏览器驱动的下载和更新。

    • 方法 install(): 此方法检查系统上是否已经安装了 ChromeDriver,以及它的版本是否与系统上的 Google Chrome 浏览器兼容。如果没有安装或者版本不正确,它会自动下载与当前 Chrome 浏览器版本兼容的 ChromeDriver。

    • 结果: install() 返回下载的 ChromeDriver 的文件路径。这是一个可执行文件的路径,通常是 chromedriver 二进制文件在你的本地机器上的位置。

  2. Service(driver_path):

    • 目标: 启动 Selenium 的 Chrome WebDriver 服务。

    • 功能: Service 是 Selenium 中的一个类,用于代表驱动程序的后台服务。它主要负责启动、终止和管理生命周期中的驱动进程。

    • 参数 driver_path: 这是 ChromeDriver 在本地系统上的路径,由 ChromeDriverManager().install() 返回。将此路径传递给 Service 构造函数来告诉 Selenium 如何找到和使用 ChromeDriver。

    • 使用: 当你创建一个 webdriver.Chrome 实例时,你可以将创建好的 Service 对象作为参数传递,使得 WebDriver 能够启动并与驱动程序正常通信。

整个过程:

  • 通过 ChromeDriverManager().install(),避免手动下载并管理 ChromeDriver 的版本问题。

  • 创建一个 Service 对象来确保在启动 WebDriver 时能够正确地引用和使用 ChromeDriver。

  • 最终用于初始化 WebDriver(例如 webdriver.Chrome(service=service))来启动一个新的浏览器实例。

这种方法简化了驱动安装的管理,确保了驱动程序与浏览器版本的兼容性,同时提高了代码的可维护性和稳定性。无论是在本地开发还是在CI/CD环境中,这种自动化驱动管理的方式都非常有用。

 

5.初始化并执行测试
# 正确的 WebDriver 初始化方式
driver = webdriver.Chrome(service=service)# 使用 WebDriver 做一些事情
driver.get("https://example.com")
print(driver.title)# 关闭浏览器
driver.quit()

基本用法示例

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager# 使用 ChromeDriverManager 处理驱动安装
driver_path = ChromeDriverManager().install()
service = Service(driver_path)# 正确的 WebDriver 初始化方式
driver = webdriver.Chrome(service=service)# 使用 WebDriver 做一些事情
driver.get("https://stage.me.sap.com/createIssue/0")
print(driver.title)# 关闭浏览器
driver.quit()

注意:

在较新的 Selenium 版本中,webdriver.Chrome 的构造函数不再接受 executable_path 作为参数,而是使用 Service 对象来指定 ChromeDriver 的路径。 如果还用老的方法会出现下面的报错

# 创建 webdriver.Chrome 实例
driver = webdriver.Chrome(executable_path=driver_path)# 使用 WebDriver
driver.get("https://www.example.com")

TypeError: WebDriver.__init__() got an unexpected keyword argument 'executable_path'

拓展(可自行了解

  • 自动下载和更新:

    • ChromeDriverManager().install() 方法会自动下载与系统安装的 Chrome 版本兼容的 ChromeDriver(如果未安装或版本过旧则更新)。
  • 版本控制:

    • 可以指定 ChromeDriver 的版本,比如使用 ChromeDriverManager(version='2.46').install() 来安装特定版本的驱动。
  • 自定义路径:

    • 如果需要把下载的驱动放在特定路径,可以在运行时设置相关的环境变量来管理下载目录:
    import os
    from webdriver_manager.chrome import ChromeDriverManageros.environ['WDM_LOCAL'] = '1'  # 启用本地目录使用
    os.environ['WDM_DIR'] = '/path/to/store/drivers'driver_path = ChromeDriverManager().install()
  • 日志和缓存控制:

    • webdriver_manager 默认会缓存下载的驱动,并在新版本发布时更新。对于调试和开发,可以通过环境变量控制日志输出和缓存政策。

 

相关文章:

ChromeDriverManager的具体用法

ChromeDriverManager 是 webdriver_manager 库的一部分,它用于自动管理 ChromeDriver 的下载和更新。使用 ChromeDriverManager 可以避免手动下载 ChromeDriver 并匹配系统中安装的 Chrome 浏览器版本。以下是 ChromeDriverManager 的基本用法: 步骤 1…...

DeepSeek Copilot idea插件推荐

🌌 DeepSeek Copilot for IntelliJ IDEA 让 AI 成为你的编程副驾驶,极速生成单元测试 & 代码注释驱动开发! 🚀 简介 DeepSeek Copilot 是一款为 IntelliJ IDEA 打造的 AI 编程助手插件,它能够智能分析你的代码逻辑…...

贪心算法应用:最小反馈顶点集问题详解

贪心算法应用:最小反馈顶点集问题详解 1. 问题定义与背景 1.1 反馈顶点集定义 反馈顶点集(Feedback Vertex Set, FVS)是指在一个有向图中,删除该集合中的所有顶点后,图中将不再存在任何有向环。换句话说,反馈顶点集是破坏图中所…...

游戏引擎学习第259天:OpenGL和软件渲染器清理

回顾并为今天的内容做好铺垫 今天,我们将对游戏的分析器进行升级。在之前的修复中,我们解决了分析器的一些敏感问题,例如它无法跨代码重新加载进行分析,以及一些复杂的小问题。现在,我们的分析器看起来已经很稳定了。…...

一篇文章看懂时间同步服务

Linux 系统时间与时区管理 一、时间与时钟类型 时钟类型说明管理工具系统时钟由 Linux 内核维护的软件时钟,基于时区配置显示时间timedatectl硬件时钟 (RTC)主板上的物理时钟,通常以 UTC 或本地时间存储,用于系统启动时初始化时间hwclock …...

12.模方ModelFun工具-立面修整

摘要:本文主要介绍模方ModelFun修模工具——立面修整的操作方法。 点击工具栏即可找到立面修整工具,点击可打开并使用该工具,如下图: 图 工具菜单栏 (1)截面绘制: 快速绘制竖直矩形&#xff1…...

git命令常见用法【持续更新中……】

一、已有本地代码,在gitee创建了空仓库后想将代码与该仓库相连 在本地项目目录下初始化Git # 1. 初始化本地仓库 git init# 2. 添加所有文件到暂存区 git add .# 3. 提交第一个版本 git commit -m "Initial commit: 项目初始化"将本地仓库关联到Gitee 根…...

Docker 渡渡鸟镜像同步站 使用教程

Docker 渡渡鸟镜像同步站 使用教程 🚀 介绍 Docker.aityp.com(渡渡鸟镜像同步站)是一个专注于为国内开发者提供 Docker 镜像加速和同步服务的平台。它通过同步官方镜像源(如 Docker Hub、GCR、GHCR 等),为…...

Python TensorFlow库【深度学习框架】全面讲解与案例

一、TensorFlow 基础知识 1. 核心概念 张量 (Tensor): 多维数组,是 TensorFlow 的基本数据单位(标量、向量、矩阵等)。计算图 (Graph): 早期版本中的静态图机制(TF2.x 默认启用动态图)。会话 (Session): 在 TF1.x 中用于执行计算图(TF2.x 中已弃用)。2. 基本操作 impo…...

火影bug,未保证短时间数据一致性,拿这个例子讲一下Redis

本文只拿这个游戏的bug来举例Redis,如果有不妥的地方,联系我进行删除 描述:今天在高速上打火影(有隧道,有时候会卡),发现了个bug,我点了两次-1000的忍玉(大概用了1千七百…...

Power Query 是 Excel 和 Power BI 中强大的数据获取、转换和加载工具

Power Query 链接是什么 Power Query 是 Excel 和 Power BI 中强大的数据获取、转换和加载工具。Power Query 链接指的是在 Excel 或 Power BI 里通过 Power Query 建立的与外部数据源的连接。这些数据源可以是各种类型,像文本文件(CSV、TXT&#xff09…...

探索元生代:ComfyUI 工作流与计算机视觉的奇妙邂逅

目录 一、引言 二、蓝耘元生代和 ComfyUI 工作流初印象 (一)蓝耘元生代平台简介 (二)ComfyUI 工作流创建是啥玩意儿 三、计算机视觉是个啥 (一)计算机视觉的基本概念 (二)计算…...

Unity-Shader详解-其五

关于Unity的Shader部分的基础知识其实已经讲解得差不多了,今天我们来一些实例分享: 溶解 效果如下: 代码如下: Shader "Chapter8/chapter8_1" {Properties{// 定义属性[NoScaleOffset]_Albedo("Albedo", 2…...

【Java 专题补充】流程控制语句

流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中既基本又非常关键的部分。流程控制语句可以把单个的语句组合成有意义的、能完成一定功能的小逻辑模块。最主要的流程控制方式是结构化程序设计中规定的三种基本流程结构。 1.1 结构化程序设计的三种基本流…...

恶心的win11更新DIY 设置win11更新为100年

‌打开注册表编辑器‌:按下Win R键,输入regedit,然后按回车打开注册表编辑器。‌12‌导航到指定路径‌:在注册表编辑器中,依次展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings‌新建DWORD值‌&…...

【ArcGIS微课1000例】0146:将多个文件夹下的影像移动到一个目标文件夹(以Landscan数据为例)

本文讲述将多个文件夹下的影像移动到一个目标文件夹,便于投影变换、裁剪等操作。 文章目录 一、数据准备二、解压操作三、批量移动四、查看效果五、ArcGIS操作一、数据准备 全球人口数据集Landscan2000-2023如下所示,每年数据位一个压缩包: 二、解压操作 首先将其解压,方…...

【redis】分片方案

Redis分片(Sharding)是解决单机性能瓶颈的核心技术,其本质是将数据分散存储到多个Redis节点(实例)中,每个实例将只是所有键的一个子集,通过水平扩展提升系统容量和性能。 分片的核心价值 性能提…...

springboot+mysql+element-plus+vue完整实现汽车租赁系统

目录 一、项目介绍 二、项目截图 1.项目结构图 三、系统详细介绍 管理后台 1.登陆页 2.管理后台主页 3.汽车地点管理 4.汽车类别 5.汽车品牌 6.汽车信息 7.用户管理 8.举报管理 9.订单管理 10.轮播图管理 11.交互界面 12.图表管理 汽车租赁商城 1.首页 2.汽…...

Linux第四节:进程控制

一、进程创建 1.1 fork函数 1. fork函数有两个返回值问题 返回的本质就是写入!所以,谁先返回,谁就先写入id,因为进程具有独立性,会发生写时拷贝,父进程和子进程各自指向return语句。 2. fork返回后&#x…...

Qt 编译 sqldrivers之psql

编译postgres pgsql驱动 下载驱动源码修改配置文件编译 下载驱动源码 // 源代码下载 https://download.qt.io/archive/qt/5.15/5.15.2/submodules/驱动目录:qtbase-everywhere-src-5.15.2\src\plugins\sqldrivers 修改配置文件 打开pro文件 右键点击添加库 此处的为debu…...

382_C++_在用户会话结束时,检查是否有其他会话仍然来自同一个客户端 IP 地址,没有连接状态设置为断开,否则为连接

之前出现的问题:重启管理机,工作机上面热备连接状态显示未连接 (此时是有一个工作机连接管理机的),所以正常应该是连接状态解决:根因分析: 重启管理机后,管理机给过来的cookie是空的,导致工作机同时存在两个管理机的session,在其中一个超时后,调用回调函数通知会话断开…...

RViz(机器人可视化工具)的配置文件(moveitcpp)

1. Panels(面板设置) 面板是RViz界面中的各个功能区域,用于显示和操作不同的数据。 Displays(显示面板) Class: rviz_common/Displays 指定面板的类型,这里是显示面板。 Help Height: 78 帮助区域的高度…...

Redis中6种缓存更新策略

Redis作为一款高性能的内存数据库,已经成为缓存层的首选解决方案。然而,使用缓存时最大的挑战在于保证缓存数据与底层数据源的一致性。缓存更新策略直接影响系统的性能、可靠性和数据一致性,选择合适的策略至关重要。 本文将介绍Redis中6种缓…...

如何使用极狐GitLab 软件包仓库功能托管 terraform?

极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Terraform 模块库 (BASIC ALL) 基础设施仓库和 Terraform 模块仓库合并到单个 Terraform 模块仓库功能引入于极狐GitLab 15.1…...

观测云:安全、可信赖的监控观测云服务

引言 近日,“TikTok 遭欧盟隐私监管机构调查并处以 5.3 亿欧元”一案,再次引发行业内对数据合规等话题的热议。据了解,仅 2023 年一年就产生了超过 20 亿美元的 GDPR 罚单。这凸显了在全球化背景下,企业在数据隐私保护方面所面临…...

【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】5.3 相关性分析(PEARSON/SPEARMAN相关系数)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 5.3 相关性分析(PEARSON/SPEARMAN相关系数)5.3.1 相关性分析理论基础5.3.1.1 相关系数定义与分类5.3.1.2 Pearson相关系数( Pearson Corr…...

Redis面试 实战贴 后面持续更新链接

redis是使用C语言写的。 面试问题列表: Redis支持哪些数据类型?各适用于什么场景? Redis为什么采用单线程模型?优势与瓶颈是什么? RDB和AOF持久化的区别?如何选择?混合持久化如何实现&#x…...

小程序滚动条隐藏(uniapp版本)

单独指定页面隐藏&#xff08;找到对应的scroll-view&#xff09; <style> /* 全局隐藏滚动条样式 */ ::-webkit-scrollbar { display: none; width: 0; height: 0; color: transparent; background: transparent; } /* 确保scroll-view组件也隐藏滚动条 */ …...

python基础:序列和索引-->Python的特殊属性

一.序列和索引 1.1 用索引检索字符串中的元素 # 正向递增 shelloworld for i in range (0,len(s)):# i是索引print(i,s[i],end\t\t) print(\n--------------------------) # 反向递减 for i in range (-10,0):print(i,s[i],end\t\t)print(\n--------------------------) print(…...