admin管理员组

文章数量:1537551

自动获取谷歌版本,并自动下载对应版本的chromedriver.exe

  • 前言
    • 依赖包安装
    • 代码内容
    • 驱动自动下载逻辑说明

前言

问题:google浏览器频繁更新自动升级、同事使用的Google浏览器版本不一致,需要手动去下载驱动,非常的无语。本着碰到问题就解决问题的心态,写一个自动下载驱动的方法,后来发现了一个驱动管理包非常实用,分享给大家。
当前方法只适配了Windows上的驱动,其它系统和浏览器可以自己修改配置信息适配一下。废话不多说直接上代码。

依赖包安装

python -m pip install -i https://mirrors.aliyun/pypi/simple webdriver-manager==4.0.1

代码内容

# coding:utf-8 

import json
import os
import re
# python -m pip install -i https://mirrors.aliyun/pypi/simple webdriver-manager==4.0.1
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager
from webdriver_manager.microsoft import EdgeChromiumDriverManager


def get_driver_path(driver_name: str = 'chromedriver') -> str:
    """
    获取驱动路径,如果没有、版本与安装的浏览器版本不一致则自动更新下载,有的话获取缓存的驱动
    :param driver_name: 浏览器名称,值如下:
        chromedriver        谷歌驱动
        edgedriver          edge 驱动
        geckodriver         火狐驱动
    :return: 浏览器驱动路径
    """
    driver_names = {
        'chromedriver': {
            'query': r'reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version',
            'class': ChromeDriverManager,
        },
        'edgedriver': {
            'query': r'reg query "HKEY_CURRENT_USER\Software\Microsoft\Edge\BLBeacon" /v version',
            'class': EdgeChromiumDriverManager,
        },
        'geckodriver': {
            'query': r'reg query "HKEY_LOCAL_MACHINE\SOFTWARE\mozilla\Mozilla" /v CurrentVersion',
            'class': GeckoDriverManager,
        },
    }
    if driver_name in driver_names:
        local_verinfo = os.popen(driver_names[driver_name]['query']).read().strip()
        browser_verinfo = re.compile(r' ([0-9]+)\.[0-9]+').findall(local_verinfo)
        if len(browser_verinfo) < 1:
            print(f'获取本地 {driver_name} 浏览器版本失败:{local_verinfo}')
        # 获取本地浏览器驱动缓存路径
        drivers_path = os.path.join(os.path.expanduser("~"), '.wdm/drivers.json')
        ver_path = ''
        if os.path.isfile(drivers_path):
            with open(drivers_path, 'r') as file:
                data = json.load(file)
            for i in [k for k in data]:
                cache_ver = re.compile(driver_name + r'.*_for_([0-9]+)\.').findall(i)
                if len(cache_ver) == len(browser_verinfo) == 1 and cache_ver[0] == browser_verinfo[0]:
                    ver_path = data[i]['binary_path']
        return driver_names[driver_name]['class']().install() if ver_path == '' else ver_path
    else:
        raise ValueError(f'{driver_name} 驱动暂不支持')

驱动自动下载逻辑说明

  1. 本地不存在驱动,自动获取当前安装的浏览器(浏览器存在)版本,并下载跟本地浏览器版本匹配的浏览器驱动,例如:chrome_driver。
  2. 本地存在驱动(或多个),优先获取本地已下载的驱动版本和本地浏览器版本进行比较,不一致则会重新下载最新的驱动。
  3. 本地存在驱动(或多个),优先获取本地已下载的驱动版本和本地浏览器版本进行比较,版本一致且多个同一版本的驱动则取本地最新下载的驱动路径。
  4. 优先取本地驱动的原因:例如重复调用google驱动下载类影响启动浏览器的效率,且容易封ip(亲测),最重要的是太慢了。
  5. 只适配了window,其他平台未适配,如有需要欢迎留言;如果查询本地浏览器版本的bat命令无效,则需要自己改一下query的内容。

本文标签: 版本浏览器测试seleniumchromedriver