驱动下载软件 驱动软件app排行榜

2023-04-23 08:47  ca 蜻蜓知识  浏览: 4413  作者: tiger  

公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核

本文为霍格沃兹测试学院学员 @felix 测试开发实用技能分享。

在学院学员群交流时,有同学说 Appium 官方支持自动下载兼容的浏览器驱动,想来 Selenium 也有类似的方法,于是在网上搜索一番,并参考了 Medium 上的一篇文章所介绍的方法进行尝试,对相关步骤进行了改进,增加了对多浏览器的支持。本文就总结下整体过程与实现代码。

首先,想明白大致的几个步骤:

  1. 识别本地浏览器版本
  2. 下载对应浏览器版本的驱动
  3. 解压到对应文件夹
  4. 记录到 mapping.json 文件中

接下来就是撸起袖子开干了。

定义好目录结构

|— config

 |— mapping.json: 浏览器驱动配置信息

|— driver: 存放浏览器驱动

|— utils

 |— driver_util.py: 封装的工具包

|— test_search.py: 测试脚本

数据准备

导入第三方库,定义好路径名称等常量。

import json
import os
import zipfile
import shutil
import requests
import pathlib
from win32com import client as win_client


 工作目录(当前路径调试时需加上.parent)
BASE_DIR = str(pathlib.Path.cwd())
 BASE_DIR = str(pathlib.Path.cwd().parent)

CHROME_DRIVER_BASE_URL = &34;http://chromedriver.storage.googleapis.com&34;
EDGE_DRIVER_BASE_URL = &34;http://msedgedriver.azureedge.net&34;
CHROME_DRIVER_ZIP = &34;chromedriver_win32.zip&34;
EDGE_DRIVER_ZIP = &34;edgedriver_win64.zip&34;
CHROME_DRIVER = &34;chromedriver.exe&34;
EDGE_DRIVER = &34;msedgedriver.exe&34;

BROWSER_DRIVER_DIR = str(pathlib.PurePath(BASE_DIR, &34;driver&34;))
DRIVER_MAPPING_FILE = os.path.join(BASE_DIR, &34;config&34;, &34;mapping.json&34;)

第一步:获取浏览器的版本

Chrome 浏览器有些小版本没有对应版本号的浏览器驱动,需要借助 Query API 查询对应大版本LATEST RELEASE版本,再根据查询对应的浏览器驱动。

新版 Edge 浏览器每个版本号官网都有对应的驱动下载。

Latest Version API
http://chromedriver.storage.googleapis.com/origin/LATEST_RELEASE_{version}Download Chrome Driver 
API
http://chromedriver.storage.googleapis.com/origin/{version}/chromedriver_win32.zip
http://msedgedriver.azureedge.net/{version}/edgedriver_win64.zip

代码如下:

def get_browser_version(file_path):
    &34;&34;&34;
    获取浏览器版本
    :param file_path: 浏览器文件路径
    :return: 浏览器大版本号
    &34;&34;&34;
     判断路径文件是否存在
    if not os.path.isfile(file_path):
        raise FileNotFoundError(f&34;{file_path} is not found.&34;)
    win_obj = win_client.Dispatch(&39;Scripting.FileSystemObject&39;)
    version = win_obj.GetFileVersion(file_path)

    return version.strip()


def get_browser_major_version(file_path):
    &34;&34;&34;
    获取浏览器大版本号
    :param file_path: 浏览器文件路径
    :return: 浏览器大版本号
    &34;&34;&34;
    browser_ver = get_browser_version(file_path)
    browser_major_ver = browser_ver.split(&34;.&34;)[0]

    return browser_major_ver


def get_latest_browser_version(browser_major_ver):
    &34;&34;&34;
    获取匹配大版本的最新release版本
    :param browser_major_ver: 浏览器大版本号
    :return: 最新release版本号
    &34;&34;&34;
    latest_api = f&34;{CHROME_DRIVER_BASE_URL}/LATEST_RELEASE_{browser_major_ver}&34;
    resp = requests.get(latest_api)
    latest_driver_version = resp.text.strip()

    return latest_driver_version

第二步:下载浏览器驱动

def download_browser_driver(latest_driver_version, browser_name):
    &34;&34;&34;
    下载浏览器驱动压缩包
    :param browser_name: 浏览器名称
    :param latest_driver_version: 浏览器的版本号
    &34;&34;&34;
    download_api = None
    if browser_name == &34;Chrome&34;:
        download_api = f&34;{CHROME_DRIVER_BASE_URL}/{latest_driver_version}/{CHROME_DRIVER_ZIP}&34;
    elif browser_name == &34;Edge&34;:
        download_api = f&34;{EDGE_DRIVER_BASE_URL}/{latest_driver_version}/{EDGE_DRIVER_ZIP}&34;

    download_dir = os.path.join(str(BROWSER_DRIVER_DIR), os.path.basename(download_api))
     下载,设置超时时间20s
    resp = requests.get(download_api, stream=True, timeout=20)

    if resp.status_code == 200:
        with open(download_dir, &39;wb&39;) as fo:
            fo.write(resp.content)
    else:
        raise Exception(&34;Download chrome driver failed&34;) 

第三步:解驱动压缩包

解压后将原压缩包删除。

def unzip_driver(browser_major_ver, browser_name):
    &34;&34;&34;
    解压驱动压缩包
    :param browser_name: 浏览器名称
    :param browser_major_ver: 浏览器大版本号
    :return: 驱动文件路径
    &34;&34;&34;
    file_path = None
    driver_path = None

    if browser_name == &34;Chrome&34;:
        file_path = os.path.join(BROWSER_DRIVER_DIR, os.path.basename(CHROME_DRIVER_ZIP))
        driver_path = os.path.join(BROWSER_DRIVER_DIR, browser_major_ver, CHROME_DRIVER)
    elif browser_name == &34;Edge&34;:
        file_path = os.path.join(BROWSER_DRIVER_DIR, os.path.basename(EDGE_DRIVER_ZIP))
        driver_path = os.path.join(BROWSER_DRIVER_DIR, browser_major_ver, EDGE_DRIVER)
    browser_driver_dir = os.path.join(BROWSER_DRIVER_DIR, browser_major_ver)

     解压到指定目录
    with zipfile.ZipFile(file_path, &39;r&39;) as zip_ref:
        zip_ref.extractall(browser_driver_dir)

    return driver_path


def remove_driver_zip(browser_name):
    &34;&34;&34;
    删除下载的驱动压缩包
    :param browser_name: 浏览器名称
    &34;&34;&34;
    file_path = None
    if browser_name == &34;Chrome&34;:
        file_path = os.path.join(BROWSER_DRIVER_DIR, os.path.basename(CHROME_DRIVER_ZIP))
    elif browser_name == &34;Edge&34;:
        file_path = os.path.join(BROWSER_DRIVER_DIR, os.path.basename(EDGE_DRIVER_ZIP))
    os.remove(file_path)

第四步,读写配置文件信息

def read_driver_mapping_json():
    &34;&34;&34;
    读取 mapping_json
    :return: 字典格式
    &34;&34;&34;
    if os.path.exists(DRIVER_MAPPING_FILE):
        with open(DRIVER_MAPPING_FILE) as fo:
            try:
                driver_mapping_dict = json.load(fo)
             mapping.json内容为空时,返回空字典
            except json.decoder.JSONDecodeError:
                driver_mapping_dict = {}
    else:
        raise FileNotFoundError(f&34;{DRIVER_MAPPING_FILE} is not found&34;)

    return driver_mapping_dict


def write_driver_mapping_json(browser_major_ver, latest_driver_version, driver_path, browser_name):
    &34;&34;&34;
    写入 mapping_json
    :param browser_major_ver: 浏览器大版本号
    :param latest_driver_version: 浏览器驱动版本号
    :param driver_path: 驱动存放路径
    :param browser_name: 浏览器名称
    &34;&34;&34;
    mapping_dict = read_driver_mapping_json()
     版本号在dict中(浏览器名不在dict中)
    if browser_major_ver in mapping_dict:

        mapping_dict[browser_major_ver][browser_name] = {
                            &34;driver_path&34;: driver_path,
                            &34;driver_version&34;: latest_driver_version
                }
     大版本号不在dict中,且字典不为空
    elif browser_major_ver not in mapping_dict and mapping_dict:
        mapping_dict[browser_major_ver] = {
            browser_name:
                {
                    &34;driver_path&34;: driver_path,
                    &34;driver_version&34;: latest_driver_version
                }
        }
     字典为空
    else:
        mapping_dict = {
            browser_major_ver:
                {
                    browser_name:
                        {
                            &34;driver_path&34;: driver_path,
                            &34;driver_version&34;: latest_driver_version
                        }
                }
        }
        mapping_dict.update(mapping_dict)

    with open(DRIVER_MAPPING_FILE, &39;w&39;) as fo:
        json.dump(mapping_dict, fo)

综合

将以上步骤整合到 automatic_discover_driver 函数中,通过调用该函数返回浏览器驱动路径。

def automatic_discover_driver(browser_path, browser_name=&34;Chrome&34;):
    &34;&34;&34;
    侦测浏览器驱动是否在mapping.json有记录,否则下载该驱动
    :param browser_path: 浏览器路径
    :param browser_name: 浏览器名称
    &34;&34;&34;
    browser_maj_ver = get_browser_major_version(browser_path)
     Chrome需要获取大版本号对应的latest release version
     Edge 可直接用当前浏览器版本号
    if browser_name == &34;Chrome&34;:
        latest_browser_ver = get_latest_browser_version(browser_maj_ver)
    elif browser_name == &34;Edge&34;:
        latest_browser_ver = get_browser_version(browser_path)
    else:
        raise Exception(f&34;{browser_name} is not found&34;)

     读取mapping.json内容
    mapping_dict = read_driver_mapping_json()

     json为空 或版本号不在mapping_dict中 或浏览器名不在mapping_dict中
    if not mapping_dict or \
            browser_maj_ver not in mapping_dict or \
            browser_name not in mapping_dict[browser_maj_ver]:

         下载浏览器驱动压缩包
        download_browser_driver(latest_browser_ver, browser_name)
         解压浏览器驱动压缩包,并返回驱动路径
        driver_path = unzip_driver(browser_maj_ver, browser_name)
         将浏览器大版本号、浏览器名、驱动路径、对应的浏览器版本号信息写入到mapping.json中
        write_driver_mapping_json(browser_maj_ver, latest_browser_ver, driver_path, browser_name)

         删除浏览器驱动压缩包
        remove_driver_zip(browser_name)

     返回浏览器驱动的路径
    mapping_dict = read_driver_mapping_json()
    return mapping_dict[browser_maj_ver][browser_name][&34;driver_path&34;]

测试

创建一个 test_search.py 文件验证是否可以自动下载对应的浏览器驱动。

import pytest
from time import sleep
from selenium import webdriver
from utils.driver_util import automatic_discover_driver as automatic


class TestSearch:
    _CHROME_PATH = r&34;C:\Program Files (x86)\Google\Chrome\Application\chrome.exe&34;
    _EDGE_PATH = r&34;C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe&34;
    _browser = &34;Edge&34;

    def setup(self):
        driver_path = automatic(self._EDGE_PATH, self._browser)
        if self._browser == &34;Chrome&34;:
            self.driver = webdriver.Chrome(driver_path)
        elif self._browser == &34;Edge&34;:
            self.driver = webdriver.Edge(driver_path)

    def teardown(self):
        self.driver.close()
        self.driver.quit()

    def test_search_bing(self):
        self.driver.get(&34;http://cn.bing.com/origin/&34;)
        self.driver.find_element_by_id(&34;sb_form_q&34;).send_keys(&34;selenium&34;)
        self.driver.find_element_by_id(&34;sb_go_par&34;).click()
        sleep(3)


if __name__ == &39;__main__&39;:
    pytest.main()

实测,成功打开浏览器!

详细代码可参考:

  • http://github.com/origin/felixzfq/AutomaticDiscoverBrowserDriver
TAG: 驱动,下载软件,软件,app,排行榜,公众,号,搜索,
版权声明

本文仅代表作者观点,不代表蜻蜓百科-做你身边的百科发动机立场。
本文系作者授权蜻蜓百科-做你身边的百科发动机发表,未经许可,不得转载。

已有 40条评论
Copyright Your WebSite.Some Rights Reserved. Powered By 蜻蜓百科heme By 京ICP备11041704号-42