驱动下载软件 驱动软件app排行榜
2023-04-23 08:47 ca 蜻蜓知识 浏览: 4413 作者: tiger
公众号搜索:TestingStudio 霍格沃兹测试开发的干货都很硬核
本文为霍格沃兹测试学院学员 @felix 测试开发实用技能分享。
在学院学员群交流时,有同学说 Appium 官方支持自动下载兼容的浏览器驱动,想来 Selenium 也有类似的方法,于是在网上搜索一番,并参考了 Medium 上的一篇文章所介绍的方法进行尝试,对相关步骤进行了改进,增加了对多浏览器的支持。本文就总结下整体过程与实现代码。
首先,想明白大致的几个步骤:
- 识别本地浏览器版本
- 下载对应浏览器版本的驱动
- 解压到对应文件夹
- 记录到 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
版权声明
本文仅代表作者观点,不代表蜻蜓百科-做你身边的百科发动机立场。
本文系作者授权蜻蜓百科-做你身边的百科发动机发表,未经许可,不得转载。
已有
40条评论