Excel - VBA

ChromeDriver를 자동으로 업데이트 하기

EGTools 2024. 4. 26. 19:00
728x90

SeleniumBasic을 사용하여 Chrome제어를 할 때가 많은데,

Chrome이 버전업이 되면 ChromeDriver도 다시 새 버전을 설치해 줘야 합니다.

이게 귀찮아 지게 되면,,,,

 

우선 현재 Selenium이 설치된 폴더를 확인해 봅니다.

마땅한 Registry를 찾지 못해서 대충 CLSID에 있는 걸 써 봅니다.

Private Function getSeleniumPath()
    Dim sPath As String
    sPath = CreateObject("WScript.Shell").RegRead("HKEY_CLASSES_ROOT\CLSID\{0277FC34-FD1B-4616-BB19-5D556733E8C9}\InprocServer32\CodeBase")
    getSeleniumPath = Replace(sPath, "\Selenium.dll", "")
End Function

 

Shell 명령어를 통해서 ChromeDriver 버전을 확인합니다.

Private Function getChromeDriverVersion()
    Dim sVer As String
    sVer = CreateObject("WScript.Shell").Run("cmd /c " & getSeleniumPath & "\chromedriver.exe --version > " & Environ("TEMP") & "\CDver.txt", 0, True)
    sVer = CreateObject("Scripting.FileSystemObject").openTextFile(Environ("TEMP") & "\CDver.txt", 1).ReadAll
    If InStr(sVer, "ChromeDriver") Then sVer = Split(sVer, " ")(1) Else sVer = ""
    If InStr(sVer, ".") Then sVer = Split(sVer, ".")(0)
    getChromeDriverVersion = sVer
End Function

 

 

이제 Registry에 등록된  Chrome 브라우저 버전을 확인합니다.

Private Function getChromeVersion()
    Dim sVer As String
    sVer = CreateObject("WScript.Shell").RegRead("HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon\version")
    If InStr(sVer, ".") Then sVer = Split(sVer, ".")(0)
    getChromeVersion = sVer
End Function

 

 

만약 브라우저 버전이 업데이트가 되어 새 버전이라면 다운로드 해서 교체 합니다.

최신 버전은 여기에서 확인할 수 있습니다.

https://googlechromelabs.github.io/chrome-for-testing/

 

Chrome for Testing availability

chrome-headless-shellmac-arm64https://storage.googleapis.com/chrome-for-testing-public/124.0.6367.91/mac-arm64/chrome-headless-shell-mac-arm64.zip200

googlechromelabs.github.io

 

위 웹페이지 내용을 JSON 형태로 버전을 알려 주는 곳은 여기입니다.

https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json

 

Stable의 chromedriver에서 win32와 win64를 구별하여 가져오도록 합니다.

 

다운로드한 파일은 responseBody를 이진 파일로 저장하면 되므로 ADODB.Stream을 사용합니다.

 

마지막으로 다운로드한 Zip파일에서 chromedriver.exe만 Selenium 폴더로 복사해 줍니다.
복사하기 전에 미리 삭제(Kill) 해 둡니다.

Zip파일 내에서 특정 파일을 지정할 때 아래와 같은 방식으로 지정합니다.

oShell.Namespace( ZIP파일명 & "\" & 하위폴더명).Items.Item("chromedriver.exe")

 

다운로드 사이트에서 어떤 버전으로 다운로드 할 지 점검합니다.

Chrome이 64bit로 설치되었는지 Registry에 나와 있지 않으므로 Windows의 bit를 점검합니다.

Private Function Is64BitWin()
    Dim sVer As String
    sVer = CreateObject("WScript.Shell").Environment("System").Item("Processor_Architecture")
    If InStr(sVer, "64") Then Is64BitWin = True Else Is64BitWin = False
End Function

 

이제 이들을 조합하여 실제적으로 파일을 다운로드 합니다.

Private Sub UpdateDriver()
    Dim URL As String, DownURL As String, JSON As String, fileName As String

    If Is64BitWin Then fileName = "chromedriver-win64.zip" Else fileName = "chromedriver-win32.zip"
    
    URL = "https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json"
    With CreateObject("MSXML2.XMLHTTP.6.0")
        .Open "GET", URL
        .Send
        JSON = .responseText
        If Len(JSON) < 3000 Then Exit Sub
    End With
    
    DownURL = Left(JSON, InStr(1, JSON, fileName, vbTextCompare) + Len(fileName) - 1)
    DownURL = Split(DownURL, """:""")(UBound(Split(DownURL, """:""")))
    
    Dim bStream As Object
    Set bStream = CreateObject("ADODB.Stream")
    
    With CreateObject("MSXML2.XMLHTTP.6.0")
        .Open "GET", DownURL
        .Send
        bStream.Open
        bStream.Type = 1
        bStream.Write .responseBody
        bStream.SaveToFile Environ("TEMP") & "\" & fileName, 2
        bStream.Close
    End With
    
    Dim oShell As Object: Set oShell = CreateObject("Shell.Application")
    If Dir(getSeleniumPath & "\" & "chromedriver.exe") <> "" Then Kill getSeleniumPath & "\" & "chromedriver.exe"
    oShell.Namespace(getSeleniumPath).CopyHere oShell.Namespace(Environ("TEMP") & "\" & fileName & "\" & Replace(fileName, ".zip", "")).Items.Item("chromedriver.exe")
    
End Sub

 

 

최종적으로 다른 프로세스에서 버전 점검 및 자동 업데이트를 호출 하는 함수를 만들어 줍니다.

버전이 맞지 않으면 최신 ChromeDriver를 다운로드하여 교체하고, 

다시 버전이 맞지 않으면 Chrome버전이 업데이트가 필요한 사항이므로 False를 반환합니다. 

정상적으로 두 버전이 일치하게 되면 True가 되어 정상적으로 Chrome 컨트롤을 계속하면 됩니다.

'////////////////////////////////////////////////////////////////////////////////////////////
'//
'//   Name      ChromeDriver Update
'//   Version   v1r0,  2024-04-26
'//   Author    EGTools (egexcelvba@gmail.com)
'//   Return    버전이 다르면 자동 업데이트를 시행하고
''/             업데이트 이후 버전이 같으면 True, 다르면 False (브라우저 업데이트가 필요함)
'//   Remarks   Chrome 브라우저 버전과 Selenium에서 사용하는 ChromeDriver의 버전을 비교하여
'//             Chrome 브라우저 버전이 높으면 새로운 ChromeDriver를 다운로드하여 업데이트 함
'//
'////////////////////////////////////////////////////////////////////////////////////////////

Function CheckChromeDriver()
    Dim CBver As Long
    CBver = CLng(getChromeVersion)
    If CBver > CLng(getChromeDriverVersion) Then Call UpdateDriver
    If CBver <> CLng(getChromeDriverVersion) Then
        Debug.Print "ERROR: Chrome버전과 ChrimeDriver버전이 다릅니다." & vbNewLine & "Chrome을 업데이트 하세요."
        CheckChromeDriver = False
    Else
        CheckChromeDriver = True
    End If
End Function

 

 

ChromeDriver_v1r0_240426.bas
0.00MB

728x90