VBA에서 Selenium을 사용할 때
해당 브라우저가 업데이트될 때마다 새로 깔아줘야 하는 불편함이 있습니다.
크롬 브라우저의 드라이버를 자동으로 설치해주는 VBA 코드입니다.
이전에 작성된 내용을 바탕으로
크롬 드라이버를 자동으로 다운로드하고 설치하는 코드를 작성했습니다.
1. VBA로 내 컴퓨터에 설치된 ChromeDriver 버전 확인하기
2. 크롬 브라우저 버전 정보 확인하기
3. 내 크롬 브라우저의 버전에 맞는 최신 ChromeDriver 버전 VBA로 확인하기
4. VBA로 ChromeDriver(크롬드라이버) 압축파일 다운받기, VBA로 파일 다운로드 하기
SeleniumBasic은 설치되어 있다고 가정하고 작성한 코드이며,
윈도우11 64비트 환경입니다.
현재 설치되어 있는 ChromeDriver 버전 확인
SeleniumBasic 폴더가 없다면 프로그램이 종료됩니다.
chromedriver.exe 파일을 실행해 현재 크롬드라이버 버전을 확인합니다.
혹시 chromedriver.exe 파일이 없다고 하더라도 작동합니다.
result로 두 개의 값을 반환합니다.
하나는 버전 전체(ex) 111.1.1111.11)
하나는 맨 앞의 숫자(ex) 111)
맨 앞의 숫자만 같다면 chromedriver가 정상 작동하는 것으로 알고 있습니다.
Function CheckChromeVer() As Variant
On Error GoTo ErrorHandler
Dim WSShell As Object
Dim SeleniumPath As String
Dim filePath As String
Dim execute_command As String
Dim raw_version As String
Dim version_num As Variant
Dim version_temp As String
Dim Main_Version As Variant
Dim fso As Object
Dim result(0 To 1) As String
Set fso = CreateObject("Scripting.FileSystemObject")
SeleniumPath = Environ("LOCALAPPDATA") & "\SeleniumBasic\"
If Not fso.FolderExists(SeleniumPath) Then
CheckChromeVer = "0"
MsgBox "해당 폴더가 존재하지 않습니다. SeleniumBasic이 설치되었는지 확인하세요.", vbExclamation
GoTo ExitHandler
End If
filePath = SeleniumPath & "chromedriver.exe"
If Not fso.FileExists(filePath) Then
CheckChromeVer = Array("0", "0")
GoTo ExitHandler
End If
If fso.FileExists(filePath) Then
Set WSShell = CreateObject("Wscript.Shell")
execute_command = filePath & " --version"
On Error Resume Next
raw_version = WSShell.Exec(execute_command).StdOut.ReadAll
On Error GoTo 0
If Err.Number <> 0 Then
CheckChromeVer = "0"
Err.Clear
GoTo ExitHandler
End If
version_num = Split(raw_version, " ")
If UBound(version_num) >= 1 Then
version_temp = version_num(1)
Main_Version = Split(version_temp, ".")
If UBound(Main_Version) >= 0 Then
CheckChromeVer = Main_Version(0)
Else
CheckChromeVer = "0"
End If
Else
CheckChromeVer = "0"
End If
Else
CheckChromeVer = "0"
End If
result(0) = version_temp
result(1) = Main_Version(0)
CheckChromeVer = result
ExitHandler:
Set fso = Nothing
Set WSShell = Nothing
Exit Function
ErrorHandler:
CheckChromeVer = "0"
End Function
크롬 브라우저 버전 확인
현재 설치되어있는 크롬 브라우저의 버전을 확인합니다.
레지스트리에서 크롬 드라이버 버전을 확인합니다.
Function ChromeBrowserVer() As String
On Error GoTo ErrorHandler
Dim WSShell As Object
Dim Chrome_version As Variant
Dim temp_version As Variant
Dim bro_version As String
Set WSShell = CreateObject("Wscript.Shell")
On Error Resume Next
Chrome_version = WSShell.RegRead("HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon\version")
On Error GoTo 0
If Err.Number <> 0 Then
ChromeBrowserVer = "0"
Exit Function
End If
If IsEmpty(Chrome_version) Then
bro_version = "0"
Else
temp_version = Split(Chrome_version, ".")
If IsArray(temp_version) And UBound(temp_version) >= 0 Then
bro_version = temp_version(0)
Else
bro_version = "0"
End If
End If
ChromeBrowserVer = bro_version
ExitHandler:
Set WSShell = Nothing
Exit Function
ErrorHandler:
ChromeBrowserVer = "0"
End Function
최신 버전의 크롬 드라이버 확인
해당 버전에 맞는 최신 드라이버를 검색합니다.
내 브라우저의 맨 앞 세 자리에 해당하는 버전 중 최신 드라이버를 확인합니다.
Function GetLatestChromeVersion(majorVersion As String) As String
On Error GoTo ErrorHandler
Dim Https As Object
Dim Url As String
Dim version_number As String
Set Https = CreateObject("MSXML2.ServerXMLHTTP.6.0")
Url = "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_" & majorVersion
Https.Open "GET", Url, False
Https.send
If Https.Status = 200 Then
version_number = Https.responseText
Else
version_number = ""
GoTo ExitHandler
End If
GetLatestChromeVersion = version_number
ExitHandler:
Set Https = Nothing
Exit Function
ErrorHandler:
version_number = ""
Resume ExitHandler
End Function
검색된 크롬 드라이버 다운로드
내 브라우저의 버전에 맞는 크롬 드라이버를 다운로드합니다.
바탕화면에 임시로 폴더를 만들어 다운로드한 파일을 저장합니다.
Function DownloadChromeDriver(chromeVersion As String) As String
On Error GoTo ErrorHandler
Dim http As Object, fileStream As Object
Dim TempPath As String, zipTempPath As String
Dim fileSize As Long, actualFileSize As Long
Dim Url As String
Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
Url = "https://storage.googleapis.com/chrome-for-testing-public/" & chromeVersion & "/win64/chromedriver-win64.zip"
http.Open "GET", Url, False
http.send
If http.Status = 200 Then
If http.getResponseHeader("Content-Length") <> "" Then
fileSize = CLng(http.getResponseHeader("Content-Length"))
Else
MsgBox "파일 크기를 확인할 수 없습니다."
DownloadChromeDriver = ""
Exit Function
End If
TempPath = Environ("USERPROFILE") & "\Desktop\TempSelenium\"
If Dir(TempPath, vbDirectory) = "" Then
On Error Resume Next
MkDir TempPath
On Error GoTo ErrorHandler
If Err.Number <> 0 Then
MsgBox "폴더를 생성할 수 없습니다: " & Err.Description, vbCritical
DownloadChromeDriver = ""
Exit Function
End If
End If
zipTempPath = TempPath & "chromedriver-win64.zip"
Set fileStream = CreateObject("ADODB.Stream")
With fileStream
.Open
.Type = adTypeBinary
.Write http.responseBody
.Position = 0
.SaveToFile zipTempPath, adSaveCreateOverWrite
.Close
End With
actualFileSize = FileLen(zipTempPath)
If actualFileSize = fileSize Then
DownloadChromeDriver = TempPath
Else
DownloadChromeDriver = ""
End If
Else
MsgBox "다운로드 실패: HTTP 상태 코드 " & http.Status
DownloadChromeDriver = ""
End If
ExitHandler:
Set http = Nothing
Set fileStream = Nothing
Exit Function
ErrorHandler:
DownloadChromeDriver = ""
Resume ExitHandler
End Function
다운로드 한 파일 압축 풀고 SeleniumBasic 폴더로 복사하기
다운로드한 파일의 압축을 풀고
chromedriver.exe 파일을 SeleniumBasic이 설치된 폴더로 복사합니다.
Function UnzipAndMoveFile(zipFilePath As String) As Boolean
Dim destinationPath As String
Dim shell As Object
Dim cmd As String
Dim pos As Integer
Dim basePath As String
Dim fso As Object
Dim sourceFile As String
Dim targetFile As String
pos = InStrRev(zipFilePath, "\")
If pos > 0 Then
basePath = Left(zipFilePath, pos)
Else
MsgBox "유효한 경로가 아닙니다.", vbExclamation
UnzipAndMoveFile = False
Exit Function
End If
destinationPath = basePath
Set shell = CreateObject("WScript.Shell")
cmd = "powershell.exe -Command ""Expand-Archive -Path '" & zipFilePath & "' -DestinationPath '" & destinationPath & "' -Force"""
shell.Run cmd, 0, True
Set fso = CreateObject("Scripting.FileSystemObject")
sourceFile = destinationPath & "chromedriver-win64\chromedriver.exe"
If fso.FileExists(sourceFile) Then
targetFile = Environ("LOCALAPPDATA") & "\SeleniumBasic\chromedriver.exe"
fso.CopyFile sourceFile, targetFile
Else
MsgBox "chromedriver.exe 파일이 존재하지 않습니다.", vbExclamation
UnzipAndMoveFile = False
Exit Function
End If
UnzipAndMoveFile = True
End Function
메 인 함 수
○ 크롬 브라우저와 드라이버의 버전 확인
○ 레지스트리 값을 읽을 수 없다면 프로그램 종료
○ 크롬 브라우저의 크롬 드라이버 버전의 맨 앞 세 자리 숫자가 같을 때
1. 양쪽의 전체 버전을 확인해서 같으면 프로그램 종료
2. 양쪽의 전체 버전을 확인해서 다르면 최신 버전 다운로드
○ 크롬 브라우저의 크롬 드라이버 버전의 맨 앞 세자리 숫자가 다를 때 최신 버전의 드라이버 다운로드
○ 다운로드 한 파일의 압축을 풀고 SeleniumBasic 폴더로 파일 복사
○ 임시로 만든 폴더 삭제
Sub ChromeDriverAutoDownload()
Dim chromeVer As Variant
Dim Browser_Version As String
Dim Full_Version As String
Dim Main_Version As String
Dim Latest_Version As String
Dim downloadPath As String
Dim zipFilePath As String
Dim powerShellCommand As String
Dim wsh As Object
chromeVer = CheckChromeVer()
Full_Version = chromeVer(0)
Main_Version = chromeVer(1)
If IsNull(Main_Version) Then
Exit Sub
End If
Browser_Version = ChromeBrowserVer()
If Browser_Version = "0" Then
MsgBox "레지스트리 값을 읽을 수 없습니다.", vbExclamation
Exit Sub
Else
End If
Latest_Version = GetLatestChromeVersion(Browser_Version)
If Main_Version = Browser_Version Then
If Full_Version = Latest_Version Then
MsgBox "크롬드라이버가 최신 버전입니다."
Exit Sub
Else
downloadPath = DownloadChromeDriver(Latest_Version)
End If
Else
downloadPath = DownloadChromeDriver(Latest_Version)
Debug.Print downloadPath
End If
zipFilePath = downloadPath & "chromedriver-win64.zip"
If Not UnzipAndMoveFile(zipFilePath) Then
MsgBox "작업이 실패했습니다.", vbExclamation
End If
powerShellCommand = "powershell.exe -Command ""Remove-Item -Recurse -Force '" & downloadPath & "'"""
Set wsh = CreateObject("WScript.Shell")
wsh.Run powerShellCommand, 0, True
MsgBox "작업이 성공적으로 완료되었습니다.", vbInformation
End Sub
마 치 며
첨부파일은 크롬 드라이버 자동 설치와 SeleniumBasic 다운로드 버튼 두개가 생성됩니다.
제한된 상황에서 테스트하였기 때문에
몇 가지 예외처리가 안되있을 수도 있습니다.
참조해야할 라이브러리는 첨부파일을 참고해 주시기 바랍니다.
여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.