Webdriver驱动自管理
背景
- 在selenium自动化中,驱动和浏览器有一定的对应关系,以最常见的chrome和firefox为例。
- chrome- 要求比较严格。- 比如在地址栏输入chrome://version/,得到版本信息如下:
Google Chrome 103.0.5060.106 (正式版本) (64 位) (cohort: Stable)
- 去驱动下载站:https://registry.npmmirror.com/binary.html?path=chromedriver/ (如下图),你可能找不到完全匹配上的版本,你只能103.0.5060.三个中找一个接近的试试(一般应该选择134)。这个给自动下载带来了麻烦。- 还有很大的一个问题就是浏览器往往是自动更新的,你的驱动可能在一段时间后就匹配不到了,需要重新下载。 - firefox- 向下兼容性比较好。你就选择下载最新的版本即可(更新时间最新的)
第三方库 webdriver-manager
- 这是官方推荐的一个库,用于管理webdriver这些二进制文件
https://www.selenium.dev/zh-cn/documentation/webdriver/getting_started/install_drivers/
- 安装
pip install webdriver-manager
- 官网
https://github.com/SergeyPirogov/webdriver_manager #githubhttps://pypi.org/project/webdriver-manager/#pypi
- 简介- 支持多种浏览器 - ChromeDriver- GeckoDriver- IEDriver- OperaDriver- EdgeChromiumDriver- 兼容selenium4.0及以下版本
实例
官方的DEMO
- chrome
from selenium import webdriverfrom selenium.webdriver.chrome.service import Service as ChromeServicefrom webdriver_manager.chrome import ChromeDriverManagerdriver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))driver.get('https://www.baidu.com')
- firefox
from selenium import webdriverfrom selenium.webdriver.firefox.service import Service as FirefoxServicefrom webdriver_manager.firefox import GeckoDriverManagerdriver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
- 执行效果:控制台会打印如下信息(以chrome为例);浏览器在打开后自动退出
====== WebDriver manager ======Current google-chrome version is 103.0.5060Get LATEST chromedriver version for 103.0.5060 google-chromeTrying to download new driver from https://chromedriver.storage.googleapis.com/103.0.5060.134/chromedriver_win32.zipDriver has been saved in cache [C:\Users\songqin008\.wdm\drivers\chromedriver\win32\103.0.5060.134]
- 注意driver的保存位置
webdriver_manager 提供的配置项
- 指定下载路径
from webdriver_manager.chrome import ChromeDriverManagerChromeDriverManager(path =r".\\Drivers").install()
- 取消日志打印
import loggingimport osos.environ['WDM_LOG']=str(logging.NOTSET)
- 指定版本下载
from webdriver_manager.chrome import ChromeDriverManagerChromeDriverManager(version="2.26").install()
改良版本
- 基于官方的版本,主要有2个问题- 1:下载位置无法二次利用(一般不在path中) - 参考目录结构:D:\chrome_driver\drivers\chromedriver\win32\103.0.5060.134,下面会有一个chromedriver.exe和driver.zip(前者是后者解压出来的)- 2:输出日志没有必要
- 改进版本
defget_driver(tmp_driver_store_dir=r'd:\chrome_driver', delete_tmp_file=True, show_log=False):""" :param tmp_driver_store_dir: 驱动临时存储位置 :param delete_tmp_file: 是否要删除临时文件,默认要删除 :param show_log: 是否显示安装驱动的过程,默认为不显示 :return: None """import os from shutil import rmtree import sys from pathlib import Path from time import strftime from webdriver_manager.chrome import ChromeDriverManager import logging python_dir = os.path.dirname(sys.executable)#获取当前python解释器所在的位置 tmp_driver_store_dir = tmp_driver_store_dir+strftime('%Y%m%d%H%M%S')#定义一个临时存放驱动的位置if Path(tmp_driver_store_dir).exists():#如果存在 rmtree(tmp_driver_store_dir)#删除该目录 Path(tmp_driver_store_dir).mkdir()#新建目录ifnot show_log: os.environ['WDM_LOG']=str(logging.NOTSET) ChromeDriverManager(path=tmp_driver_store_dir).install()for _ in Path(tmp_driver_store_dir).rglob('*.exe'): Path(_).replace(Path(python_dir)/ Path(_).name)#移动到python解释器主目录下if delete_tmp_file: rmtree(tmp_driver_store_dir)from selenium import webdriverget_driver()driver = webdriver.Chrome()driver.get('https://www.baidu.com')
本文转载自: https://blog.csdn.net/Mantou023/article/details/134904233
版权归原作者 wuxianfeng023 所有, 如有侵权,请联系我们删除。
版权归原作者 wuxianfeng023 所有, 如有侵权,请联系我们删除。