selenium 自动下载120版本以上的chromedriver最新版本

脚本实现从GoogleChrome实验室下载Chromedriver,根据不同平台自动解压和管理不同版本,适用于自动化测试。
摘要由CSDN通过智能技术生成
def getchromeversion():
    # 浏览器版本号
    if 'win' in sys.platform:
        import winreg
        key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Google\Chrome\BLBeacon')
        chrome_version = winreg.QueryValueEx(key, 'version')[0]
        return chrome_version
    else:
        from webdriver_manager.utils import get_browser_version_from_os
        browserVersion = get_browser_version_from_os("google-chrome")  # 获取当前系统chrome浏览器的版本号
        print(f'Chrome version is {browserVersion}')
        mainBrowserVersion = browserVersion.split(".")[0]  # 获取chrome浏览器的主版本号
        return browserVersion

 from undetected_chromedriver import find_chrome_executable

chrome_path = find_chrome_executable()  # 获取浏览器路径

import requests, json, os, shutil
from lxml.etree import HTML
# 所有版本驱动的路径 https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json

def upzip_file(zip_path=None, unzip_path=None):
    """
    :zip_path 压缩文件路径
    :unzip_path 解压文件路径
    :return 解压 zip 文件,返回所有解压文件夹下的路径
    """
    import zipfile
    zip_file = zipfile.ZipFile(zip_path)
    if not os.path.isdir(unzip_path):
        os.mkdir(unzip_path)
    for names in zip_file.namelist():
        zip_file.extract(names, unzip_path)
    zip_file.close()
    return [os.path.join(unzip_path, i).replace('\\', '/') for i in zip_file.namelist()]


def down_chromedriver_zip(urll=None, path=None, version=None):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    res1 = requests.get(urll, headers=headers)
    response1 = json.loads(res1.text)
    for i in response1:
        if 'chromedriver_win32' in i['name']:
            zip_url = i['url']
            name = zip_url.split('/')[-1]
            zip_path = os.path.join(path, name)
            res2 = requests.get(zip_url, headers=headers)
            with open(zip_path, 'wb') as f:
                f.write(res2.content)
            uzip_path = zip_path.replace('.zip', '')
            paths = upzip_file(zip_path, uzip_path)
            for chromedriver_path in paths:
                if not chromedriver_path.endswith('.exe'):
                    if os.path.exists(chromedriver_path):
                        os.remove(chromedriver_path)
                    continue
                os.rename(chromedriver_path, chromedriver_path.replace('.exe', '') + f'_{version}.exe')
            if os.path.exists(zip_path):
                os.remove(zip_path)


def get_down_url(chrome_version, headers, platform_name="win64"):
    """ 获取chromedriver 驱动压缩文件链接
    platform_name = ["linux64","mac-arm64","mac-x64","win32","win64"]
    """
    import sys
    if not platform_name:
        platform_name = sys.platform
    bit_number = platform.architecture()[0]
    url = 'https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json'
    proxies = {"http": None, "https": None}
    res = requests.get(url, headers=headers, proxies=proxies)
    response = json.loads(res.text)
    down_url = None
    versions = []
    for ver in response['versions']:
        version = ver['version']
        if str(chrome_version) not in version:
            continue
        if not str(version).startswith(str(chrome_version)):
            continue
        versions.append(version)
    
    if len(versions) > 0:
        # versiondict = [[int(i.replace('.', '')), i] for i in versions]
        # version_new = sorted(versiondict, key=lambda x: x[0])[-1][1]
        # print('version_new:', version_new)
        version = versions[-1]
        if 'linux' in str(platform_name) and bit_number == '64bit':
            down_url = f'https://storage.googleapis.com/chrome-for-testing-public/{version}/linux64/chromedriver-linux64.zip'
        elif 'win' in str(platform_name) and bit_number == '32bit':
            down_url = f'https://storage.googleapis.com/chrome-for-testing-public/{version}/win32/chromedriver-win32.zip'
        elif 'win' in str(platform_name) and bit_number == '64bit':
            down_url = f'https://storage.googleapis.com/chrome-for-testing-public/{version}/win64/chromedriver-win64.zip'
        else:
            down_url = f'https://storage.googleapis.com/chrome-for-testing-public/{version}/mac-x64/chromedriver-mac-x64.zip'
        return down_url
        # chrome_paths = ver['downloads']['chrome']
        # for i in chrome_paths:
        #     if i["platform"] == platform:
        #         down_url = i['url']
        #         return down_url
    return down_url


def get_down_url0(version, headers):
    # 只返回了最新版本
    url = 'https://googlechromelabs.github.io/chrome-for-testing/#stable'
    zip_url = None
    try:
        res = requests.get(url, headers=headers)
        response = HTML(res.text)
        trs = response.xpath('//section/div[@class="table-wrapper"]/table//tr')
        for tr in trs:
            zip_url = tr.xpath('./td/code[contains(text(), "zip")]/text()')
            if 'chromedriver-win32' not in ''.join(zip_url):
                continue
            code = tr.xpath('./td/code[not(contains(text(), "zip"))]/text()')
            if '200' not in ''.join(code):
                continue
            Binary = tr.xpath('./th[1]/code/text()')
            if 'chromedriver' not in Binary:
                continue
            zip_url = zip_url[0]
            if str(version) in zip_url:
                break
        if isinstance(zip_url, list):
            zip_url = zip_url[0]
    except Exception as e:
        print('e1:', e)
        zip_url = None
    return zip_url


def get_chromedriver_version1(path, version=None):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    # zip_url = get_down_url0(version, headers)
    zip_url = get_down_url(version, headers)
    if not zip_url:
        print('获取驱动链接失败')
        return
    print('zip_url:', zip_url)
    try:
        name = zip_url.split('/')[-1]
        zip_path = os.path.join(path, name)
        flag = False
        for i in range(5):
            try:
                res2 = requests.get(zip_url, headers=headers)
                print('res2_status_code::', res2.status_code)
                flag = True
                break
            except:
                pass
        if not flag:
            return
        
        with open(zip_path, 'wb') as f:
            f.write(res2.content)
        uzip_path = zip_path.replace('.zip', '').replace('chromedriver-win32', 'chromedriver_win32')
        # uzip_path = './chromedriver_win32'
        paths = upzip_file(zip_path, uzip_path)
        for chromedriver_path in paths:
            if not chromedriver_path.endswith('.exe'):
                if os.path.exists(chromedriver_path):
                    os.remove(chromedriver_path)
                continue
            # os.rename(chromedriver_path, chromedriver_path.replace('.exe', '') + f'_{version}.exe')
            shutil.copy(chromedriver_path, os.path.join(uzip_path, f'chromedriver_{version}.exe'))
            os.remove(chromedriver_path)
        exe_path = os.path.join(uzip_path, 'chromedriver-win32')
        if os.path.exists(exe_path):
            os.rmdir(exe_path)
        if os.path.exists(zip_path):
            os.remove(zip_path)
    except Exception as e:
        print('e2:', e)


def get_chromedriver_version(path, version0=None):
    url2 = 'https://registry.npmmirror.com/-/binary/chromedriver/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
    }
    if version0 and int(version0) > 116:
        get_chromedriver_version1(path, version0)
        return
    try:
        res = requests.get(url2, headers=headers)
        response = json.loads(res.text)
    except:
        response = {}
    versions = []
    dic = {}
    for i in response:
        if not i['name'].split('.')[0].isdigit():
            continue
        version = int(i['name'].split('.')[0])
        if i['name'].startswith(f'{version0}.'):
            versions.append({version: i['url']})
        if len(dic) == 0:
            dic[version] = i['url']
        if len(dic) > 0 and version > list(dic.keys())[0]:
            dic.pop(list(dic.keys())[0])
            dic[version] = i['url']
    if len(versions) == 0 and len(dic) > 0:
        versions.append(dic)
    if len(versions) > 0:
        for k, zip_url in versions[-1].items():
            try:
                down_chromedriver_zip(zip_url, path, k)
            except:
                pass


if __name__ == '__main__':
    get_chromedriver_version('./', 118)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值