隐藏页面特效

python - selenium windows下自动根据chrome版本下载最新驱动

前言

在编写自动化测试框架时,chrome浏览器总是会自动更新版本,时不时会导致编写脚本时,chromedriver不可用。所以编写以下脚本完成自动更新检测,在每次启动时,更新或者替换chormedriver,只针对于winodws系统。

代码分解,完整代码放在最后。

1、从windows注册表中获取chrome版本号

# logger是自己封装的日志模块,可以用print代替!!! import winreg # 和注册表交互 def get_chrome_version(): """ 通过windows注册表获取chrome版本号 :return: 版本号(str) """ try: # 从注册表中获得版本号 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon') _v, _type = winreg.QueryValueEx(key, 'version') logger.info('Chrome浏览器版本号为: {}'.format(_v)) return _v # 返回版本号 except WindowsError as e: logger.error(f"检查Chrome失败: {e}")

2、从chromedriver驱动中获取当前驱动版本号

import subprocess # 用于执行cmd命令 def get_driver_version(abs_path): """ 获取driver版本号 :param abs_path: chromedriver.exe的绝对路径 :return: 版本号(str) """ cmd = r'{} --version'.format(abs_path) # 拼接成cmd命令 try: # 执行cmd命令并接收命令回显 out, err = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() out = out.decode('utf-8') _v = out.split(' ')[1] # 拆分回显字符串,获取版本号 logger.info('chromedriver驱动版本号为:{}'.format(_v)) return _v except IndexError as e: logger.error(f'检查driver驱动失败:{e}') return 0

3、下载并解压chromedriver。

import urllib.request # 发送http请求 import urllib.parse # 拼接url import zipfile # 操作.zip文件 def get_driver_version(abs_path): """ 获取driver版本号 :param abs_path: chromedriver.exe的绝对路径 :return: 版本号(str) """ cmd = r'{} --version'.format(abs_path) # 拼接成cmd命令 try: # 执行cmd命令并接收命令回显 out, err = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() out = out.decode('utf-8') _v = out.split(' ')[1] # 拆分回显字符串,获取版本号 logger.info('chromedriver驱动版本号为:{}'.format(_v)) return _v except IndexError as e: logger.error(f'检查driver驱动失败:{e}') return 0

4、主方法运行版本检测并下载

import urllib.request # 发送http请求 import urllib.parse # 拼接url def check_version_match(driver_path=''): if platform.system() == "Windows": chrome_version = get_chrome_version() # 拼接镜像下载路径 url = f"https://cdn.npmmirror.com/binaries/chromedriver/{chrome_version}/chromedriver_win32.zip" if os.path.exists(driver_path): logger.info(f'Chrome版本与chromedriver版本比较') driver_version = get_driver_version(driver_path) if str(chrome_version) != str(driver_version): # 下载文件的保存路径,与chromedriver同级 down_load_driver(url, driver_path) # call下载文件的方法 else: logger.info("版本号一致,忽略下载~") return driver_path else: logger.error(f"不存在的路径:【{driver_path}】") sys.exit()

5、完整代码

import os import platform import winreg # 和注册表交互 import subprocess # 用于执行cmd命令 import urllib.request # 发送http请求 import urllib.parse # 拼接url import zipfile # 操作.zip文件 from config.log_config import logger import sys def get_chrome_version(): """ 通过windows注册表获取chrome版本号 :return: 版本号(str) """ try: # 从注册表中获得版本号 key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon') _v, _type = winreg.QueryValueEx(key, 'version') logger.info('Chrome浏览器版本号为: {}'.format(_v)) return _v # 返回版本号 except WindowsError as e: logger.error(f"检查Chrome失败: {e}") def get_driver_version(abs_path): """ 获取driver版本号 :param abs_path: chromedriver.exe的绝对路径 :return: 版本号(str) """ cmd = r'{} --version'.format(abs_path) # 拼接成cmd命令 try: # 执行cmd命令并接收命令回显 out, err = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() out = out.decode('utf-8') _v = out.split(' ')[1] # 拆分回显字符串,获取版本号 logger.info('chromedriver驱动版本号为:{}'.format(_v)) return _v except IndexError as e: logger.error(f'检查driver驱动失败:{e}') return 0 def down_load_driver(url, original_driver_path): """ 下载driver驱动 :param url: 下载地址 :param original_driver_path: 原始driver驱动存放地址 :return: """ # 访问淘宝镜像首页 logger.info(f'下载url为: {url}') # 指定下载的文件名和保存位置 save_d = os.path.dirname(original_driver_path) logger.info(f'driver文件保存位置为: {save_d}') # 开始下载,并显示下载进度(progressFunc) urllib.request.urlretrieve(url, os.path.join(save_d, 'chromedriver_win32.zip')) # 压缩包路径 z_file_path = os.path.join(save_d, 'chromedriver_win32.zip') # 下载完成后解压 zFile = zipfile.ZipFile(z_file_path, 'r') for fileM in zFile.namelist(): zFile.extract(fileM, save_d) zFile.close() logger.warning("----------------------【driver文件下载完成】---------------------") # 删除压缩包 os.remove(z_file_path) logger.warning("----------------------【删除[chromedriver_win32.zip]压缩包】---------------------") def check_version_match(driver_path=''): if platform.system() == "Windows": chrome_version = get_chrome_version() # 拼接镜像下载路径 url = f"https://cdn.npmmirror.com/binaries/chromedriver/{chrome_version}/chromedriver_win32.zip" if os.path.exists(driver_path): logger.info(f'Chrome版本与chromedriver版本比较') driver_version = get_driver_version(driver_path) if str(chrome_version) != str(driver_version): # 下载文件的保存路径,与chromedriver同级 down_load_driver(url, driver_path) # call下载文件的方法 else: logger.info("版本号一致,忽略下载~") return driver_path else: logger.error(f"不存在的路径:【{driver_path}】") sys.exit()
posted @   吹神  阅读(566)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 分享4款.NET开源、免费、实用的商城系统
· 解决跨域问题的这6种方案,真香!
· 5. Nginx 负载均衡配置案例(附有详细截图说明++)
· Windows 提权-UAC 绕过
点击右上角即可分享
微信分享提示