相关文章推荐
老实的稀饭  ·  使用影子 DOM - Web API | MDN·  1 月前    · 
老实的稀饭  ·  package-lock.json ...·  10 月前    · 
老实的稀饭  ·  v-for v-if 同时使用? ·  11 月前    · 
文雅的沙滩裤  ·  WKWebView拦截请求资源 ·  54 分钟前    · 
独立的眼镜  ·  如何连接Babelfish for RDS ...·  2 小时前    · 
发财的蛋挞  ·  Microsoft Azure Data ...·  2 小时前    · 
冷冷的投影仪  ·  Secure an ASP.NET ...·  2 小时前    · 
不羁的生姜  ·  PSPSDK 开发的时候出现 ...·  2 小时前    · 

基于 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)

获取驱动的版本信息

驱动下载镜像:

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

运行结果信息:

# -*- 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路径下),然后重新运行脚本:

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提供的脚本:

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

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

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

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

官方帮助文档

未配置的情况下

安装第三方库:(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
    driver = webdriver.Chrome()
except SessionNotCreatedException:
    #anacaonda安装路径
    service = ChromeService(executable_path=ChromeDriverManager(path=r"D:\software\Anaconda3").install())
    driver = webdriver.Chrome(service=service)    
 
推荐文章