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 @ 2022-03-08 20:59  吹神  阅读(513)  评论(0编辑  收藏  举报