python/selenium中msedgedriver版本自动更新,解决“This version of MSEdgeDriver only supports MSEdge version 100“
目录
前言
在学习或编写selenium库相关代码过程中,会遇到因为webdriver.exe文件缺失或其版本落后于浏览器版本造成的selenium库运行错误(Exceptions)。对于这个问题,比较繁琐的办法是浏览官网并下载合适的webdriver文件对本地文件进行替换。如果能够自动完成这个过程,那将带来不少方便。以Edge的开发工具msedgedriver.exe为例,自动更新的代码实现过程如下:
一、如何识别Edge浏览器的版本?
更新msedgedriver的前提是获得Edge浏览器的版本号。
通过浏览Edge的本地目录(如:C:\Program Files (x86)\Microsoft\Edge\Application),发现名为msedge.VisualElementsManifest.xml的文件中存在Edge的版本信息,如下图所示:

因此,可以通过xml文件提取Edge的版本号(如:103.0.1264.44)。官方的下载链接格式为:https://msedgedriver.azureedge.net/103.0.1264.44/edgedriver_win64.zip。只要找到了版本号,替换掉链接中的数字,自然就是需要版本对应的下载链接。
二、自动更新代码
1.引入库
import requests # 请求并下载相应的msedgedriver版本
import zipfile # 用于解压下载文件
import os # 检查目录下的文件
import re # 对信息进行正则匹配
import xml.dom.minidom # 处理包含浏览器版本信息的xml文件
from selenium.common.exceptions import *
from selenium import webdriver
from selenium.webdriver.edge.options import Options
2.构造解压文件函数
def unzip(file_dir, out_dir):
zf = zipfile.ZipFile(file_dir) # 实例化压缩文件
try:
zf.extract('msedgedriver.exe', path=out_dir) # 解压文件
except RuntimeError as e:
print(e)
zf.close()
3.更新msedgedriver文件
这里构造一段更新代码,主要包括2个部分:
①如果系统path中没有msedgedriver.exe文件,则通过Edge软件目录下的msedge.VisualElementsManifest.xml文件提取版本信息,并通过requests进行msedgedriver文件下载;
②path中有msedgedriver,但是版本落后于浏览器,出现SessionNotCreatedException错误:

通过对错误信息进行正则匹配,识别需要的版本号,并通过requests进行msedgedriver文件下载。
class UpdateEdge:
def __init__(self, src_dir):
self.src_dir = src_dir
def update_edge(self):
if os.path.isfile(self.src_dir+'msedgedriver.exe'): # 查看是否有msedgedriver.exe文件
pass
else:
dom = xml.dom.minidom.parse(r'C:\Program Files (x86)\Microsoft\Edge\Application\msedge'
r'.VisualElementsManifest.xml') # 读取edge文件夹下面的xml文件(包含版本信息)
dom_ele = dom.documentElement
ve = dom_ele.getElementsByTagName('VisualElements')
ve_text = ve[0].toxml() # 包含版本号的字符串文本
rematch = re.match(r'(.*)\"(.*)\\VisualElements\\Logo.png', ve_text)
edge_version = rematch.group(2) # 匹配得到版本号
url = 'https://msedgedriver.azureedge.net/'+edge_version+'/edgedriver_win64.zip'
response = requests.get(url=url) # 请求edgedriver下载链接
file_dir = self.src_dir+edge_version+'edgedriver_win64.zip'
open(file_dir, 'wb').write(response.content) # 下载edgedriver压缩包
unzip(file_dir, self.src_dir) # 在下载目录下解压edgedriver压缩包
if os.path.isfile(file_dir):
os.remove(file_dir)
else:
pass
try:
options = Options()
options.add_argument('headless')
webdriver.Edge(options=options)
except SessionNotCreatedException as msg:
reg = re.search("(.*)Current browser version is (.*) with", str(msg)) # 识别并匹配Exception信息中出现的版本号
edge_version = reg.group(2) # 获得版本号
url = 'https://msedgedriver.azureedge.net/'+edge_version+'/edgedriver_win64.zip'
response = requests.get(url=url)
file_dir = self.src_dir+edge_version+'.zip'
open(file_dir, 'wb').write(response.content) # 下载压缩文件
unzip(file_dir, self.src_dir) # 解压文件
if os.path.isfile(file_dir):
os.remove(file_dir) # 将多余的压缩文件删除
else:
pass
pass
if __name__ == '__main__':
source_dir = r'C:\Users\maradona\AppData\Local\Microsoft\WindowsApps\\'
up = UpdateEdge(source_dir)
up.update_edge()
总结
- 通过xml文件对Edge浏览器版本号进行识别。(也可以百度“chrome识别版本号api”,参考类似方法对版本进行识别)
- 用re进行正则匹配,从xml文件或Exceptions错误信息中提取版本号
- 用requests下载msedgedriver压缩包
- 用zipfile解压文件
通过以上操作实现selenium中msedgedriver的自动更新。
当然,搜索“webdriver-manager”库,可以通过简单的库引用实现自动更新~~。
from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager
更多推荐
所有评论(0)