selenium自动升级115以上版本谷歌游览器驱动方案

原本selenium4已经更新了自动获取驱动的方案,但目前最大只能获取到115版本,而115版本还能够使用也只是因为114版本能够驱动谷歌游览器。
如今,我的谷歌游览器已经到了119版本,以前编写的自动更新驱动的方案全部报废。
自动更新Selenium驱动chromedriver:https://blog.csdn.net/as604049322/article/details/125540557

具体情况,可查看https://chromedriver.chromium.org/downloads

If you are using Chrome version 115 or newer, please consult the
Chrome for Testing availability dashboard. This page provides
convenient JSON endpoints for specific ChromeDriver version
downloading.

目前115以上版本的谷歌游览器基本只能手动升级驱动,但经过我潜心对上述json的研究,已经整理出了一套自动升级方案,下面直接给出完整代码:

# 博客地址:https://blog.csdn.net/as604049322
__author__ = '小小明-代码实体'
__date__ = '2023/11/1'import os
import platform
import re
import subprocess
import sys
import time
import winreg
import zipfileimport requests
from selenium import webdriver
from selenium.common import WebDriverException
from tqdm import tqdmdef linux_browser_apps_to_cmd() -> str:"""获取以下类似的命令的结果:google-chrome --version || google-chrome-stable --version"""apps = ("google-chrome", "google-chrome-stable","google-chrome-beta", "google-chrome-dev")ignore_errors_cmd_part = " 2>/dev/null" if os.getenv("WDM_LOG_LEVEL") == "0" else ""return " || ".join(f"{i} --version{ignore_errors_cmd_part}" for i in apps)def window_get_browser_version():"""代码作者:小小明-代码实体 xxmdmst.blog.csdn.net"""try:key = winreg.OpenKey(winreg.HKEY_CURRENT_USER,r"SOFTWARE\Google\Chrome\BLBeacon")version, _ = winreg.QueryValueEx(key, "version")winreg.CloseKey(key)return versionexcept:passtry:key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,r"SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\Google Chrome")version, _ = winreg.QueryValueEx(key, "version")winreg.CloseKey(key)return versionexcept:passdef read_version_from_cmd(cmd):with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL,stdin=subprocess.DEVNULL, shell=True) as stream:stdout = stream.communicate()[0].decode()return stdoutdef get_browser_version_from_os():pl = sys.platformtry:if pl == "linux" or pl == "linux2":cmd = linux_browser_apps_to_cmd()version = read_version_from_cmd(cmd)elif pl == "darwin":cmd = r"/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version"version = read_version_from_cmd(cmd)elif pl == "win32":version = window_get_browser_version()else:return Noneversion = re.search(r"\d+\.\d+\.\d+", version)return version.group(0) if version else Noneexcept Exception as e:return Nonedef os_type():pl = sys.platformarchitecture = platform.machine().lower()if pl == "darwin":if architecture == "x86_64":architecture = "x64"return f"mac_{architecture}"pl = re.search("[a-z]+", pl).group(0)architecture = 64 if architecture.endswith("64") else 32return f"{pl}{architecture}"def get_chromedriver_url(version):chrome_url = "https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json"res = requests.get(chrome_url)os_type_str = os_type()for obj in reversed(res.json()["versions"]):if obj["version"].startswith(version):for downloads in obj["downloads"]["chromedriver"]:if downloads["platform"] == os_type_str:return obj["version"], downloads["url"]breakdef show_download_progress(response, _bytes_threshold=100):"""代码作者:小小明-代码实体 xxmdmst.blog.csdn.net"""total = int(response.headers.get("Content-Length", 0))if total > _bytes_threshold:content = bytearray()progress_bar = tqdm(desc="[WDM] - Downloading", total=total,unit_scale=True, unit_divisor=1024, unit="B")for chunk in response.iter_content(chunk_size=8192):if chunk:progress_bar.update(len(chunk))content.extend(chunk)progress_bar.close()response._content = contentdef install_new_driver():"""代码作者:小小明-代码实体 xxmdmst.blog.csdn.net"""version = get_browser_version_from_os()print(f"谷歌游览器版本:{version}")driver_version, url = get_chromedriver_url(version)filename = url[url.rfind("/") + 1:]filename, ext = os.path.splitext(filename)file = f"{filename}_v{driver_version}{ext}"if os.path.exists(file):print(file, "已存在,跳过下载~")else:resp = requests.get(url, stream=True)show_download_progress(resp)with open(file, 'wb') as f:f.write(resp._content)with zipfile.ZipFile(file) as zf:for name in zf.namelist():if name.endswith("chromedriver.exe"):zf.extract(name, ".")print(name, "已解压到当前文件夹~")breakif name != os.path.basename(name):if os.path.exists(os.path.basename(name)):os.remove(os.path.basename(name))os.rename(name, os.path.basename(name))print("已从", name, "移动到", os.path.basename(name))return os.path.abspath(os.path.basename(name))def getChromeDriver(options=None):"""代码作者:小小明-代码实体 xxmdmst.blog.csdn.net"""if not os.path.exists("chromedriver.exe") and get_browser_version_from_os() > "114":# 如果chromedriver不存在并且版本大于114直接升级,否则可以使用selenium4自动获取driver的功能install_new_driver()try:driver = webdriver.Chrome(options=options)return driverexcept WebDriverException as e:print(e)install_new_driver()driver = webdriver.Chrome(options=options)return driverif __name__ == '__main__':options = webdriver.ChromeOptions()options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation'])# driver = webdriver.Chrome(options=options)driver = getChromeDriver(options)driver.get("https://www.baidu.com/")time.sleep(5)

以上代码可以以一个工具函数的形式单独存储。

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

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

相关文章

C语言重点突破(五) 动态内存管理

前言 动态内存管理是指在一个程序运行期间动态地分配、释放和管理内存空间的过程。在应用程序中,当程序需要使用变量或对象时,需要在内存中分配一段空间,并在使用完毕后释放该空间,以提高程序的效率和性能。本文意在介绍常用动态…

PostGreSQL:JSON|JSONB数据类型

JSON JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)JSON 是轻量级的文本数据交换格式JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许…

Android WMS——WMS窗口添加(十)

Android 的 WMS(Window Manager Service)是一个关键组件,负责管理窗口的创建、显示、布局和交互等。Window 的操作有两大部分,一部分是 WindowManager 来处理,一部分是 WMS 来处理,如下图所示: …

Android渲染流程

目录 缓冲区的不同生命周期代表当前缓冲区的状态: 多个源 ViewRootImpl: Android4.0: Android5.0: Android应用程序调用SurfaceFliger将测量,布局,绘制好的Surface借助GPU渲染显示到屏幕上。 一个Acti…

Python中字符串前“b”,“r”,“u”,“f”,“l”的作用

文章目录 1、字符串前加 u2、字符串前加 r3、字符串前加 b4、字符串前加 f5、字符串前加 “l” 1、字符串前加 u 例:u"我是含有中文字符组成的字符串。" name "中文字符".replace(u"中"," ")作用: 前缀u表示…

webpack、rollup、parcel 优势和劣势?

结论先行: webpack 是模块化构建工具,具有强大的 loader 和插件生态,适用于大型复杂项目的构建; rollup 适用于基础库的打包,功能没有webpack 强大; parcel 适用于简单的实验性项目,在公司真…

搜维尔科技:Varjo在心理学、医学研究、技术、工程学等领域都在使用

该软件用于心理学、医学研究、可用性、品牌和营销等领域。vajio头显组合到了运动8.0平台中,提供了在高保真虚拟环境中进行的行为研究,否则这些环境的成本太高,不切实际,甚至无法在现实世界中再现。 在心理学、医学研究、可用性、技术、工程学、市场营销等领域工作的学术和商业研…

【编程语言发展史】C语言的诞生及其影响

目录 一、C语言的历史背景 二、C语言的设计思想 三、C语言的语法特点 四、C语言的应用领域 五、C语言的影响 六、总结 C语言是一种高级计算机编程语言,它的诞生和发展对计算机科学和软件工程领域产生了深远的影响。本文将详细介绍C语言的诞生及其影响&#xf…

分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制)

分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制) 目录 分类预测 | Matlab实现KOA-CNN-GRU-selfAttention多特征分类预测(自注意力机制)分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matla…

springboot源码阅读需要提前了解的知识点

SpringBoot 源码透彻解析——必须提前了解的几个知识点(这些玩意充斥到springboot源码的各个角落) SpringFactoriesLoader.loadFactories(ApplicationContextFactory.class,getClass().getClassLoader() : 根据 spring.factories文件,获取实现…

线代学习笔记-向量

numpy广播机制,自动增加维数 numpy中的array函数生成向量,()是函数标配,()下必有一个[]表示向量元素集合,第一层[]下的后每一个[]代表一行,没有这个[],表示这…

AI图像识别初次尝试

1.人形识别结果 2.代码 pythonOpenCVyolov3训练库,代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*- import cv2 import numpy as np import osimgFiles["pic03.jpg", "pic04.jpg"]netNone classesNone colorsNonedef r…

Python小试牛刀:GUI(图形界面)实现计算器UI界面(二)

上一篇:Python小试牛刀:GUI(图形界面)实现计算器UI界面(一)-CSDN博客 在上一篇文章中介绍了Python GUI常用的库,以及运用GUI标准库tkinter仅设计了计算器的UI界面。 而在本篇文章,…

【c++|opencv】二、灰度变换和空间滤波---5.中值滤波

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 1. 中值滤波 #include<iostream> #include<opencv2/opencv.hpp> #include"Salt.h"using namespace cv; using namespace std;voi…

一篇文章认识【性能测试】

一、 性能测试术语解释 1. 响应时间 响应时间即从应用系统发出请求开始&#xff0c;到客户端接收到最后一个字节数据为止所消耗的时间。响应时间按软件的特点再可以细分&#xff0c;如对于一个 C/S 软件的响应时间可以细分为网络传输时间、应用服务器处理时间、数据库服务器…

Web安全系列——敏感信息泄露与加密机制

一、前言 数字化时代&#xff0c;越来越多的数据正在被传输到Web应用程序中&#xff0c;这其中不乏个人或机构的敏感信息。 如果Web应用程序未采取正确的加密机制&#xff0c;这些信息可能会遭到窃取或篡改&#xff0c;从而使用户数据或机构的财产受到威胁。 二、加密机制失…

python类如何实例化对象

python类如何实例化对象 1、把类看作是定制的数据类型。既然是类型&#xff0c;只能用来表示数据的类型&#xff0c;不能直接用来保存数据。**要保存数据&#xff0c;首先需要创建一个类似于这类容器的东西&#xff0c;称为对象(或例子)。通过类别产生对象的过程称为例子。 2、…

畅销书《Kali Linux高级渗透测试》更新版速速查收~

懒大王感谢大家的关注和三连支持~ 作者简介&#xff1a; 懒大王敲代码&#xff0c;正在学习嵌入式方向有关课程stm32&#xff0c;网络编程&#xff0c;数据结构C/C等 今天给大家推荐畅销书《Kali Linux高级渗透测试》&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞…

C语言--温度转化(把华氏度转换为摄氏度)

一.问题描述: 有人用温度计测量出用华氏法表示的温度,今要求把它转换为以摄氏法表示的温度,转换公式如下: 这个代码是C语言的入门代码&#xff0c;难点在于5/9在程序中如何写出。在计算机中5/9等于1。 /符号&#xff1a;整除问题(整数/整数 结果是丢弃小数的整数) 5/2 2。那…

十五、redis的使用

目录 一、简介1.1 nosql介绍1.2 redis特性1.3 redis优势1.4 redis应用场景 二、安装2.1 Macos下安装2.2 Linux下安装2.4 客户端连接2.5 切换数据库 三、数据库操作3.1 string类型3.2 键的操作3.3 Hash类型3.4 list类型3.5 set类型3.6 zset类型 四、和python交互4.1 安装redis包…