Selenium Webdriver驱动自管理

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   #github
    https://pypi.org/project/webdriver-manager/          #pypi
    
  • 简介

    • 支持多种浏览器
      • ChromeDriver
      • GeckoDriver
      • IEDriver
      • OperaDriver
      • EdgeChromiumDriver
    • 兼容selenium4.0及以下版本

实例

官方的DEMO

  • chrome

    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service as ChromeService
    from webdriver_manager.chrome import ChromeDriverManager
    
    driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
    driver.get('https://www.baidu.com')
    
  • firefox

    from selenium import webdriver
    from selenium.webdriver.firefox.service import Service as FirefoxService
    from webdriver_manager.firefox import GeckoDriverManager
    
    driver = webdriver.Firefox(service=FirefoxService(GeckoDriverManager().install()))
    
  • 执行效果:控制台会打印如下信息(以chrome为例);浏览器在打开后自动退出

    ====== WebDriver manager ======
    Current google-chrome version is 103.0.5060
    Get LATEST chromedriver version for 103.0.5060 google-chrome
    Trying to download new driver from https://chromedriver.storage.googleapis.com/103.0.5060.134/chromedriver_win32.zip
    Driver has been saved in cache [C:\Users\songqin008\.wdm\drivers\chromedriver\win32\103.0.5060.134]
    
  • 注意driver的保存位置

webdriver_manager 提供的配置项

  • 指定下载路径

    from webdriver_manager.chrome import ChromeDriverManager
    
    ChromeDriverManager(path = r".\\Drivers").install()
    
  • 取消日志打印

    import logging
    import os
    
    os.environ['WDM_LOG'] = str(logging.NOTSET)
    
  • 指定版本下载

    from webdriver_manager.chrome import ChromeDriverManager
    
    ChromeDriverManager(version="2.26").install()
    

改良版本

  • 基于官方的版本,主要有2个问题

    • 1:下载位置无法二次利用(一般不在path中)
      • 参考目录结构:D:\chrome_driver\drivers\chromedriver\win32\103.0.5060.134,下面会有一个chromedriver.exe和driver.zip(前者是后者解压出来的)
    • 2:输出日志没有必要
  • 改进版本

    def get_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()  #新建目录
        if not 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 webdriver
    get_driver()
    driver = webdriver.Chrome()
    driver.get('https://www.baidu.com')
    
  • 25
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wuxianfeng023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值