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