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/
위 웹페이지 내용을 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
'Excel - VBA' 카테고리의 다른 글
TXT, CSV 파일 분할하기 (0) | 2024.05.11 |
---|---|
[VBA] JSONParse 함수 (1) | 2024.03.28 |
[VBA] JSON 을 배열로 변환하기 (JSONtoArray) (0) | 2024.03.28 |
[VBA] JSON 을 이름, 값 배열로 변환하기 (JSONPair) (0) | 2024.03.28 |
Google Calendar를 Excel에 연결하기 (2) | 2024.03.18 |