[python+selenium]自动下载与当前浏览器驱动版本匹配的webdriver

python使用selenium自动化操作浏览器,隔一段时间Chrome自动升级,或者换一台电脑,相同的脚本又不能运行了。出现错误如下错误:

“selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 97
Current browser version is 96.0.4664.45 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”
这是因为“ChromeDriver”和浏览器版本不对应所导致的。那么如何解决这个问题呢,

1.手动下载与当前浏览器版本对应的webdriver。网址如下:

http://chromedriver.storage.googleapis.com/index.html

2.每次都下载太麻烦了,那么让代码自动下载与当前浏览器版本匹配的webdriver。

2.1 安装

pip install webdriver-manager

2.2脚本

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import os
import sys
sys.path.append(os.path.abspath(''))
from config.config import ConfigManager
# 下载webdriver 到指定的路径
print(ConfigManager.DRIVER_PATH)
driver = webdriver.Chrome(ChromeDriverManager(path=ConfigManager.DRIVER_PATH).install())
运行上面的代码后,就会先检查本地的浏览器版本,然后下载对应的driver版本。

安装第三方包
# pip install webdriver-manager#https://zhuanlan.zhihu.com/p/520759229from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import os
import sys
sys.path.append(os.path.abspath(''))driver_path = r'D:\Program Files\python'
driver_path = r'D:\2'
# 下载webdriver 到指定的路径
driver = webdriver.Chrome(ChromeDriverManager(path=driver_path).install())
# driver = webdriver.Chrome()# chromedriver下载地址如下
# http://chromedriver.storage.googleapis.com/index.html#版本太高导致报错
# ValueError: There is no such driver by url https://chromedriver.storage.googleapis.com/117.0.5938/chromedriver_win32.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白级教程,10秒开服《幻兽帕鲁》

在帕鲁的世界,你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活,也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活,也可以为你在工厂工作。你也可以将它们进行售卖,或肢解后食用。 前言 马上过年…

STM32——感应开关盖垃圾桶

STM32——感应开关盖垃圾桶 1.定时器介绍 软件定时 缺点:不精确、占用CPU资源 void Delay500ms() //11.0592MHz {unsigned char i, j, k;_nop_();i 4;j 129;k 119;do{do{while (--k);} while (--j);} while (--i); }定时器工作原理 使用精准的时基&#xff…

算法面试八股文『 基础知识篇 』

博客介绍 近期在准备算法面试,网上信息杂乱不规整,出于强迫症就自己整理了算法面试常出现的考题。独乐乐不如众乐乐,与其奖励自己,不如大家一起嗨。以下整理的内容可能有不足之处,欢迎大佬一起讨论。 PS:…

Redis常见问题

击穿 概念:在Redis获取某一key时, 由于key不存在, 而必须向DB发起一次请求的行为, 称为“Redis击穿”。 引发击穿的原因: 第一次访问恶意访问不存在的keyKey过期 合理的规避方案: 服务器启动时, 提前写入规范key的命名, 通过中间件拦截对…

Flask介绍和优势

Flask诞生于2010年,是由Armin Ronacher用Python语言编写的一款轻量级Web开发框架。自发布以来,Flask逐渐成为开发人员喜爱的选择,并在2021年5月发布了Flask 2.0版本,引入了一些新增特性,如基本的异步支持。 使用Flask…

Kotlin:用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系‘

Kotlin:用源码来深入理解 ‘StateFlow和SharedFlow的区别和联系’ 在这篇文章中,我们将深入研究Kotlin中的StateFlow和SharedFlow,以及它们的相似之处和不同之处。我们将通过查看它们的源代码来理解它们的工作原理,这将帮助我们更…

【五】【C++】类与对象(三)

const只读 在 C 中,const 关键字用于声明一个变量为常量,意味着一旦被初始化之后,它的值就不能被改变。 声明常量: 使用 const 关键字可以声明变量为常量。这意味着这个变量的值不能被修改。 const int MAX_SIZE 100; 指针与…

2024.1.31 寒假训练记录(14)

文章目录 CF 1918C XOR-distanceCF 1918D Blocking ElementsCF 1918E ace5 and Task Order CF 1918C XOR-distance 题目链接 这题出思路还挺快的,就是考虑二进制每一位的贡献,可惜写了个假的贪心 正确贪心是,考虑两种情况,第一…

Quartus生成烧录到FPGA板载Flash的jic文件

简要说明: Altera的FPGA芯片有两种基本分类,一类是纯FPGA,另一类是FPGASoc(System on chip),也就是FPGAHPS(Hard Processor System,硬核处理器),对应两种Flash烧录方式&a…

【HTML】自定义属性(data)

自定义属性 data: 的用法(如何设置,如何获取) ,有何优势? data-* 的值的获取和设置,2种方法: 传统方法 getAttribute() 获取 data- 属性值; setAttribute() 设置 data- 属性值getAttribute() 获取 data- 属性值; setAttribute()…

什么是自动化测试分层?3个层次从高到低又是哪些?

自动化测试分层,可以理解为将测试任务分解为多个层次,并在每个层次中定义特定的测试任务和测试范围,通过这种方式,测试人员可以更好地管理和组织测试工作,确保测试的全面性和准确性。 自动化测试可以分解为3个层次&am…

@ControllerAdvice(实现全局异常、全局参数、请求参数预处理)

近期看到了ControllerAdvice这个注解,本身只是为了看下全局异常处理的,简单了解后发现可以分别与ExceptionHandler、ModelAttribute、InitBinder实现 全局异常、全局参数、请求参数预处理 的功能。 目录 一、全局异常处理二、全局参数处理三、请求参数预…

LPC804开发(11.ADC使用)

1.前言 刚刚研究ADC的时候发现芯片里面还有应该mrt 16位的定时器没有搞,那回头补上吧。下午研究了一下ADC的使用,我也只是能用上,这里我只是抛砖引玉一下吧,有需要的还请各位自行深入探究,我这里讲解的是软件触发模式…

一部分cpp的新特性:左右值的深入理解、函数返回引用报错详解以及在此过程中涉及到的指针和引用的部分区别和一点点关于std::array的简单介绍

目录 写在前面 explicit 关键字 左值(left value)和右值(left value) 引用类型作为函数的返回值 std::array 总结 致谢 写在前面 昨天博主完成了cpp基础的学习的最后一部分,cpp新特性,今天开始来逐一…

AI工具【OCR 01】Java可使用的OCR工具Tess4J使用举例(身份证信息识别核心代码及信息提取方法分享)

Java可使用的OCR工具Tess4J使用举例 1.简介1.1 简单介绍1.2 官方说明 2.使用举例2.1 依赖及语言数据包2.2 核心代码2.3 识别身份证信息2.3.1 核心代码2.3.2 截取指定字符2.3.3 去掉字符串里的非中文字符2.3.4 提取出生日期(待优化)2.3.5 实测 3.总结 1.简…

Unity SRP 管线【第九讲:URP 点光源与聚光灯】

文章目录 CPU数据搜集GPU数据使用光照计算 CPU数据搜集 我们只能支持有限数量的其他灯。并将这些灯光数据(位置、颜色、阴影强度、方向光光源、灯光遮蔽Probe、灯光层级Mask)发送到GPU以供场景中所有物体渲染使用。 //ForwardLights.cs 额外光源数量与…

字符串string详细使用(计算机考研复试上机知识点)

字符串去重&#xff1a; 字符串去重 #include <bits/stdc.h> using namespace std;int main() { a"11322";sort(a.begin(),a.end());a.erase(unique(a.begin(),a.end()),a.end());cout<<a<<endl;return 0; } //unique函数返回没有重复区间的区间…

uniform initialization(一致化初始化)

目录 std::initializer_list 和 std::array std::initializer_list 的作用&#xff1a; std::array 的作用&#xff1a; std::initializer_list 和 std::array 使用联系 标准库里面的initializer_list 使用 vector std::initializer_list 和 std::array std::initializer_…

RabbitMQ实战指南(二)—— 基本概念

RabbitMQ实战指南&#xff08;二&#xff09;—— 基本概念 RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间进行可靠的消息传递。它遵循AMQP&#xff08;高级消息队列协议&#xff09;标准&#xff0c;支持多种编程语言和平台。 下面是RabbitMQ的基本概念&…

qt内存自动释放的两种情况

qt内存管理机制 QObject的parent 我们时常能看到QWidget或者其他的控件的构造函数中有一项参数parent&#xff0c;默认值都为NULL&#xff0c;例如&#xff1a; QLineEdit(const QString &contents, QWidget *parent nullptr); QWidget(QWidget *parent nullptr, Qt::…