目录

前言

一、如何识别Edge浏览器的版本?

二、自动更新代码

1.引入库

2.构造解压文件函数

3.更新msedgedriver文件

总结


前言

在学习或编写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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐