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()