카테고리 없음

[ 엑셀 VBA ] VBA 크롬 드라이버(Chromedriver) 자동설치, ChromeDriver autoinstall

카루루1007 2024. 10. 29. 18:11
728x90
반응형

VBA에서 Selenium을 사용할 때

해당 브라우저가 업데이트될 때마다 새로 깔아줘야 하는 불편함이 있습니다.

 
크롬 브라우저의 드라이버를 자동으로 설치해주는 VBA 코드입니다.
 
이전에 작성된 내용을 바탕으로

크롬 드라이버를 자동으로 다운로드하고 설치하는 코드를 작성했습니다.

1. VBA로 내 컴퓨터에 설치된 ChromeDriver 버전 확인하기
2. 크롬 브라우저 버전 정보 확인하기
3. 내 크롬 브라우저의 버전에 맞는 최신 ChromeDriver 버전 VBA로 확인하기
4. VBA로 ChromeDriver(크롬드라이버) 압축파일 다운받기, VBA로 파일 다운로드 하기
 
SeleniumBasic은 설치되어 있다고 가정하고 작성한 코드이며,

윈도우11 64비트 환경입니다.

 

728x90

 현재 설치되어 있는 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 다운로드 버튼 두개가 생성됩니다.

제한된 상황에서 테스트하였기 때문에

몇 가지 예외처리가 안되있을 수도 있습니다.

참조해야할 라이브러리는 첨부파일을 참고해 주시기 바랍니다.

chromedriverautodownload(배포).xlsm
0.03MB

 

여기를 방문하시면 더 많은 엑셀 관련 자료를 확인할 수 있습니다.

엑셀 공부하기
VBA 공부하기

728x90
반응형