selenium驱动未随浏览器更新而同步更新的问题

基于selenium模拟谷歌浏览器登录时,依赖chromedriver.exe版本信息。但谷歌浏览器升级后,之前创建的脚本可能会出现因驱动版本过低,使得之前创建的脚本运行失败的问题。

下面针对该问题进行探索和解决。


selenium版本

import selenium

selenium.__version__
#'4.7.2'

获取谷歌浏览器版本信息

import platform
import subprocess

system = platform.system()

if system == 'Windows':
    cmd = r'reg query "HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon" /v version'
    output = subprocess.check_output(cmd, shell=True)
    version = output.split()[-1].decode()
elif system == 'Darwin':
    cmd = r'/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version'
    output = subprocess.check_output(cmd, shell=True)
    version = output.split()[2].decode()
else:
    cmd = r'google-chrome --version'
    output = subprocess.check_output(cmd, shell=True)
    version = output.split()[2].decode()

print('当前谷歌浏览器版本为:', version)

image-20230410172406622

获取驱动的版本信息

image-20230410172624073

驱动下载镜像:

  1. 镜像1
  2. 镜像2

首先我们先查看电脑上有几个chromedriver.exe:

image-20230410181025980

运行结果信息:

# -*- coding=utf-8-*-
import os
from selenium import webdriver

# 获取chromedriver.exe的路径
driver_path = os.path.join(os.getcwd(), "chromedriver.exe")

# 初始化Chrome浏览器,注意需要将executable_path参数指向chromedriver.exe的路径
print(f"driver_path={driver_path}")
browser = webdriver.Chrome(executable_path=driver_path)

# 获取chromedriver.exe的版本信息
print("chromedriver.exe version:", browser.capabilities['chrome']['chromedriverVersion'])

# 关闭浏览器
browser.quit()

"""
driver_path=E:\python_scripts\python\Happy100\selenium\chromedriver.exe
chromedriver.exe version: 112.0.5615.49 (bd2a7bcb881c11e8cfe3078709382934e3916914-refs/branch-heads/5615@{#936})

"""

其与当前谷歌浏览器保持一致。这是为什么呢?我们重新查找chromedriver.exe:发现,在系统盘新增了一个临时文件,上述脚本访问的是该路径下的驱动。

可能原因是:当前Python环境下无对应的驱动,算法自动下载了最新版本的驱动。

进一步验证:我们先删除上述临时驱动,然后下载一个旧的驱动版本(70.0.3538.16,并将其移至anaconda路径下),然后重新运行脚本:

image-20230410182019402

jupyter中执行运行下述命令:

driver = webdriver.Chrome()

"""
SessionNotCreatedException: Message: session not created: Missing or invalid capabilities
  (Driver info: chromedriver=70.0.3538.16 (16ed95b41bb05e565b11fb66ac33c660b721f778),platform=Windows NT 10.0.22000 x86_64)

#和实际相符

"""

此时查询chromedriver.exe并未出现新增。

然后我们重新运行GPT提供的脚本:

image-20230410182435081

其输出仍然是[谷歌浏览器]的版本信息;未获取到真正的版本信息。

结论:

  1. 在python环境中配置驱动(chromedriver.exe放置在anaconda安装路径下)的方式,但浏览器更新时,驱动不会及时得到更新;

  2. 上述获取chromedriver.exe不能获取有效的驱动版本信息;

  3. 在不配置驱动(chromedriver.exe)的情况下,算法第一次调用时会自行下载对应的驱动文件(ps:早些版本貌似必须安装驱动)

官方帮助文档

image-20230410220653137

小结

未配置的情况下

安装第三方库:(Github传送门)

pip install webdriver-manager

在第一次调用是会自动下载对应的驱动文件;

from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium import webdriver


service = ChromeService(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.quit()

已经配置的情况

下载最新的驱动,然后去目标路径下替换对应的驱动即可;

将最新驱动下载到指定的路径下

核心:添加path参数,用于控制最新驱动的缓存;

from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium import webdriver

try:
    driver = webdriver.Chrome()
except SessionNotCreatedException:
    #anacaonda安装路径
    service = ChromeService(executable_path=ChromeDriverManager(path=r"D:\software\Anaconda3").install())
    driver = webdriver.Chrome(service=service)    
    
posted @ 2023-04-11 09:06  LgRun  阅读(298)  评论(0编辑  收藏  举报