首先我应该说我暂时只支持 Chrome 和 Edge 驱动程序。但是,如果您可以继续,您也许可以添加自己对任何其他 SeleniumBasic 支持的 WebDrivers 的支持。
在我们开始之前,重要的是通过进入Tools > ReferencesVBE 来启用以下引用:

接下来,您需要创建一个名为SeleniumWebDriver的类模块。

我决定把它做成一个类对象,因为我打算在未来做一些事情。您可以根据需要添加自己的属性和功能,但提供的代码仅允许更新 WebDrivers,至少目前如此。
这是完整的类模块代码:
Option Explicit
Rem Did Chrome change their file url and break your code?
' Check for an update: https://stackoverflow.com/a/67996166/5781745
Private ChromeDriver As Selenium.ChromeDriver
Private EdgeDriver As Selenium.EdgeDriver
Private SeleniumFolder As String
Private TempZipFile As String
Private ChromeInit As Boolean, EdgeInit As Boolean
Public Enum dType
Chrome
Edge
End Enum
Public Property Get SeleniumFolderPath() As String
SeleniumFolderPath = SeleniumFolder
End Property
Public Property Let SeleniumFolderPath(ByVal FolderPath As String)
SeleniumFolder = FolderPath
End Property
Public Sub UpdateDriver(ByVal DriverType As dType)
'URLs to the drivers' home pages to which we can grab the curr versions
Dim URLPath As String
Select Case DriverType
Case dType.Chrome
URLPath = "https://chromedriver.chromium.org/home"
Case dType.Edge
URLPath = "https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/"
End Select
'Grab the current Version # from the driver's webpage
Dim Doc As New HTMLDocument, DriverVer As String
With New MSXML2.XMLHTTP60
.Open "GET", URLPath
.send
Doc.body.innerHTML = .responseText
End With
DriverVer = getCurrentVersion(Doc, DriverType)
DownloadUpdatedDriver DriverVer, DriverType
ExtractZipAndCopy DriverType
End Sub
' For use in a later project. Not needed at this time
Private Sub InitializeDriver(ByVal DriverType As dType)
Select Case DriverType
Case dType.Chrome
Set ChromeDriver = New Selenium.ChromeDriver
ChromeDriver.Start
ChromeInit = True
Case dType.Edge
Set EdgeDriver = New Selenium.EdgeDriver
EdgeDriver.Start
EdgeInit = True
End Select
End Sub
Private Function getCurrentVersion(Doc As HTMLDocument, DriverType As dType) As String
Dim div As HTMLDivElement
Select Case DriverType
Case dType.Chrome
For Each div In Doc.getElementsByTagName("p")
If div.innerText Like "Latest stable release*" Then
With New VBScript_RegExp_55.RegExp
.Pattern = "ChromeDriver\s([\d\.]+)\b"
getCurrentVersion = .Execute(div.innerText)(0).SubMatches(0)
Exit Function
End With
End If
Next
Case dType.Edge
With New VBScript_RegExp_55.RegExp
.Pattern = "Version:\s([\d\.]+)"
For Each div In Doc.getElementsByClassName("module")(0).getElementsByTagName("p")
If .test(div.innerText) Then
getCurrentVersion = .Execute(div.innerText)(0).SubMatches(0)
Exit Function
End If
Next
End With
End Select
End Function
Private Sub DownloadUpdatedDriver(ByVal CurrVersion As String, DriverType As dType)
Dim URLPath As String
Select Case DriverType
Case dType.Chrome
URLPath = "https://chromedriver.storage.googleapis.com/" & CurrVersion & "/chromedriver_win32.zip"
Case dType.Edge
Kill Environ$("LocalAppData") & "\SeleniumBasic\Driver_Notes\*.*"
URLPath = "https://msedgedriver.azureedge.net/" & CurrVersion & "/edgedriver_win64.zip"
End Select
Dim FileStream As New ADODB.Stream
With New MSXML2.XMLHTTP60
.Open "GET", URLPath
.send
FileStream.Open
FileStream.Type = adTypeBinary
FileStream.Write .responseBody
FileStream.SaveToFile TempZipFile, adSaveCreateOverWrite
FileStream.Close
End With
End Sub
Private Sub ExtractZipAndCopy(ByVal DriverType As dType)
Dim FileName As String
Select Case DriverType
Case dType.Chrome: FileName = "\chromedriver.exe"
Case dType.Edge: FileName = "\edgedriver.exe"
End Select
'Delete the old WebDriver
Kill SeleniumFolder & FileName
'Copy the new driver from .zip file to SeleniumBasic folder
Dim oShell As New shell
oShell.Namespace(SeleniumFolder).CopyHere oShell.Namespace(TempZipFile).Items
'Selenium VBA expects 'edgedriver' for edge, but new drivers are named 'msedgedriver'.
'If we are updating Edge, we need to rename the file
If DriverType = dType.Edge Then
Name SeleniumFolder & "msedgedriver.exe" As SeleniumFolder & "edgedriver.exe"
End If
'Delete the temporary zip file
Kill TempZipFile
End Sub
Private Sub Class_Initialize()
' Set the default file path. Can be modified later using ChromeDriverPath property
SeleniumFolder = Environ$("LocalAppData") & "\SeleniumBasic\"
TempZipFile = Environ$("LocalAppData") & "\Temp\WebDriver.zip"
End Sub
现在您已经创建了 Selenium 类,您现在可以在标准模块中使用它,例如:

重要提示:我不确定您更新网络浏览器和正式发布驱动程序之间是否存在延迟。因此,在更新您的驱动程序之前,我会先进行一些错误处理以查看 Selenium 是否会首先引发错误。如果驱动程序与浏览器版本不匹配,Selenium 将抛出错误 #33。如果您检查此错误,您应该可以安全地继续更新 WebDriver。我们要防止的是您在浏览器自动更新之前更新驱动程序,导致版本不匹配。
也有可能您的浏览器可能会更新并且 Selenium 驱动程序尚未发布 - 但不幸的是,这不是我们可以控制的。
这个答案的其余部分将详细介绍它在做什么。如果你不介意,你现在可以离开了。
首先,与任何其他对象一样,我们必须对其进行初始化。在上面的示例中,我们使用With New SeleniumWebDriver
语句执行此操作。这会在这里触发Class_Initialize()
事件:
Private Sub Class_Initialize()
' Set the default file path. Can be modified later using ChromeDriverPath property
SeleniumFolder = Environ$("LocalAppData") & "\SeleniumBasic\"
TempZipFile = Environ$("LocalAppData") & "\Temp\WebDriver.zip"
End Sub
这样做的目的是为 SeleniumBasic 文件夹和临时文件设置默认文件路径。但是,如果您的文件夹位于其他位置,则此类具有您可以手动更改文件夹的属性。只需使用该属性来建立您的新路径。ClassObj
.SeleniumFolderPath()
这TempZipFile
是一个类范围的变量,它将存储您从相应网站下载的 .zip 文件。
调用该UpdateDriver
方法后,该类将向相应驱动程序的网页发出GET请求,然后从页面中获取当前版本#。然后它将这个驱动程序版本传递给DownloadUpdatedDriver
例程,该例程存储每个驱动程序的下载链接。对于 Chrome,链接是:https://chromedriver.storage.googleapis.com/<Version#>/chromedriver_win32.zip
,对于 Edge,它是:https://msedgedriver.azureedge.net/<Version#>/edgedriver_win64.zip
。重要的是要意识到,如果您碰巧使用的是 32 位版本的 Edge,则需要将 URL 更改为edgedriver_win32.zip
. 此例程将 .zip 文件下载到本地 AppData 的临时文件夹。
下载文件后,我们继续调用ExtractZipAndCopy
例程。这只是将 .exe 文件提取到 Selenium 文件夹,首先删除旧文件。Edge 做了一些额外的维护工作,但您现在基本上已经更新了!
我希望这可以帮助那些因为我不得不定期更新这些驱动程序并且想要一个自动化解决方案而烦恼的人。如果需要进行细微更改(例如 URL 损坏),请随时编辑此答案。