셀레니움(Selenium)은 강력한 웹 드라이버입니다. 그러나 오토핫키에서 셀레니움 기반으로 작성한 코드는 배포시 타 PC 에서 별도로 셀레니움을 설치해주어야 하고, 셀레니움을 설치하더라도 크롬 버전에 맞는 드라이버를 맞춰주어야 하기 때문에 번거로움이 많습니다.
이 때문에 Chrome.ahk , Rufaydium 등 별도의 설치과정 필요없이 크롬만 있으면 작동하는 웹소켓 기반 드라이버가 주목받고 있는것 같습니다.
본 라이브러리는 셀레니움 작동에 필요한 모든 필수구성 요소를 감지하고 설치과정을 제공합니다.
셀레니움이 아예 설치되지 않은 PC라도 약 1분만에 환경설정이 끝나도록 빠른 설치를 가능하게 합니다.
또한 셀레니움이 이미 설치된 PC도 해당 라이브러리를 이용해 크롬 드라이버의 버전 업데이트를 확인하고, 신규 업데이트가 감지될 경우 자동적으로 크롬 드라이버 버전을 업데이트 할 수 있습니다.
라이브러리가 제공하는 기능은 다음과 같습니다
- 셀레니움 설치 감지 / 미 설치시 설치 프로그램 제공
- 크롬 드라이버 버전 확인 / 버전이 일치하지 않을 경우 자동 업데이트 제공
- .Net Framework 3.5 설치 확인 / 미 설치시 설치 프로그램 제공
※ 주의사항 ※
본 라이브러리는 배포시 빠른 설치를 제공하기 위해 컴파일시 설치파일들을 exe 파일 내 모두 포함시킵니다.
고로 컴파일시 dotNetFx35setup.exe / SeleniumBasic-2.0.9.0 Installer.exe 가 스크립트와 같은 위치에 있어야합니다.
두 파일이 없더라도 컴파일전에 함수를 실행시키면 별도로 다운로드 받을 수 있도록 제공해놨습니다.
- v1.1 업데이트(24.03.20)
- Chrome 115 이후 버전 자동 업데이트 지원 추가
● 다운로드
환경 테스트를 위해 아무것도 설치되지 않은 윈도우10 가상머신에 크롬만 설치한 후 배포테스트를 한 영상입니다.
약 1분만에 모든 구성요소를 자동 감지해 설치하고 정상적으로 셀레니움 기반 코드를 동작시킨 것을 확인할 수 있습니다.
;==================================================================================
; 파일명 : AHKSeleniumChromeDriverInstaller.ahk
; 버전 : v1.1
; 설명 : 크롬 셀레니움 드라이버 설치 라이브러리
; 제작목적 : 셀레니움 기반으로 제작한 스크립트의 호환성 개선을 위함
; 라이센스 : CC BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/deed.ko)
; 제작자 : https://catlab.tistory.com/ (fty816@gmail.com)
; 기능 : 셀레니움 드라이버 자동감지 설치 / 크롬 드라이버 최신 버전 자동 감지 업데이트 / .NetFramework3.5 자동감지 설치
; 설치방법 (예시) :
/*
#Include AHKSeleniumChromeDriverInstaller.ahk
if !SeleniumChromeDriverUpdateCheck()
{
MsgBox, 16, ERROR, Selenium 구성요소가 설치되지않아 프로그램이 종료됩니다
ExitApp
}
*/
;==================================================================================
SeleniumChromeDriverUpdateCheck()
{
if !A_IsCompiled
{
InfoMessage := "스크립트가 컴파일되어있지 않습니다.`n본 라이브러리는 exe 파일로 컴파일시 동작합니다.`n"
InfoMessage .= "컴파일시 스크립트와 다음 파일들이 스크립트와 있어야 합니다.`n`n"
InfoMessage .= "SeleniumBasic-2.0.9.0 Installer.exe`ndotNetFx35setup.exe"
MsgBox, 16, Install Error, % InfoMessage
if !FileExist(A_ScriptDir "\SeleniumBasic-2.0.9.0 Installer.exe")
{
MsgBox, 52, Not Found Essential File, 컴파일시 필요한`nSeleniumBasic-2.0.9.0 Installer.exe`n파일이 스크립트 폴더 내 존재하지 않습니다.`n다운로드 하시겠습니까? (예상 소모시간 : 20초)
IfMsgBox, Yes
{
URLDownloadToFile, https://drive.google.com/u/0/uc?id=1uvKJ0VQyFVRRyL4GiakVL4LWxeQlglCC&export=download, % A_ScriptDir "\SeleniumBasic-2.0.9.0 Installer.exe"
if FileExist(A_ScriptDir "\SeleniumBasic-2.0.9.0 Installer.exe")
MsgBox, 64, Download Complete, SeleniumBasic-2.0.9.0 Installer.exe`nDownload Complete.
else
MsgBox, 16, Download Failed, SeleniumBasic-2.0.9.0 Installer.exe`nDownload Failed.
}
}
if !FileExist(A_ScriptDir "\dotNetFx35setup.exe")
{
MsgBox, 52, Not Found Essential File, 컴파일시 필요한`ndotNetFx35setup.exe`n파일이 스크립트 폴더 내 존재하지 않습니다.`n다운로드 하시겠습니까? (예상 소모시간 : 20초)
IfMsgBox, Yes
{
URLDownloadToFile, https://drive.google.com/u/0/uc?id=1qbaAt12HSNdMb4oo8GOnqWzOsXN90QUG&export=download, % A_ScriptDir "\dotNetFx35setup.exe"
if FileExist(A_ScriptDir "\dotNetFx35setup.exe")
MsgBox, 64, Download Complete, dotNetFx35setup.exe`nDownload Complete.
else
MsgBox, 16, Download Failed,dotNetFx35setup.exe`nDownload Failed.
}
}
return 0
}
Dir_Chromedriver:= "C:\Users\" A_UserName "\AppData\Local\SeleniumBasic\chromedriver.exe"
;Dir_Chromedriver:= "C:\Program Files\SeleniumBasic\chromedriver.exe"
SplitPath, Dir_Chromedriver, , Folder_Chromedriver
if FileExist("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")
{
FileGetVersion, Version_Chrome, C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
Version_Chrome := RegexReplace(Version_Chrome, "\.\d+$")
}
else if FileExist("C:\Program Files\Google\Chrome\Application\chrome.exe")
{
FileGetVersion, Version_Chrome, C:\Program Files\Google\Chrome\Application\chrome.exe
Version_Chrome := RegexReplace(Version_Chrome, "\.\d+$")
}
else
{
MsgBox, 17, ERROR, Chrome 응용프로그램이 존재하지 않습니다.`nChrome 응용프로그램을 설치후 다시 시도해주세요.
IfMsgBox, OK
Run, https://www.google.com/chrome/
return 0
}
if !FileExist(Folder_Chromedriver)
{
MsgBox, 68, INFO, Selenium 구성요소가 존재하지 않습니다`n해당 구성요소를 설치 하시겠습니까?
IfMsgBox, No
return 0
FileInstall, SeleniumBasic-2.0.9.0 Installer.exe, % A_ScriptDir "\SeleniumBasic Installer.exe", 1
Run, % A_ScriptDir "\SeleniumBasic Installer.exe"
Sleep, 800
while WinExist("Setup - Selenium Basic")
Sleep, 50
;
Sleep, 500
FileDelete, % A_ScriptDir "\SeleniumBasic Installer.exe"
if FileExist(Folder_Chromedriver)
MsgBox, 64, INFO, Selenium 구성요소가 설치되었습니다.
else
return SeleniumChromeDriverUpdateCheck()
}
if FileExist(Dir_Chromedriver)
{
Version_ChromeDriver := RunHide("""" Dir_Chromedriver """ --version")
Version_ChromeDriver := RegexReplace(Version_ChromeDriver, "[^\d]*([\.\d]*).*", "$1")
if !InStr(Version_Chromedriver, Version_Chrome)
FileDelete, % Dir_Chromedriver
}
if !FileExist(Dir_Chromedriver)
{
MsgBox, 68, INFO, Selenium Chrome Driver 구성요소의 업데이트가 존재합니다.`n해당 구성요소를 업데이트 하시겠습니까?
IfMsgBox, No
return 0
CheckVersionUrl := ""
if (Version_Chrome < 115)
CheckVersionUrl := "https://chromedriver.storage.googleapis.com/LATEST_RELEASE_" Version_Chrome
else
CheckVersionUrl := "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_" Version_Chrome
WinHttp := ComObjCreate("WinHttp.WinHttpRequest.5.1")
WinHttp.Open("GET", CheckVersionUrl, true)
WinHttp.Send()
WinHttp.WaitForResponse()
ChromeDriverVersion := WinHttp.ResponseText
if (StrLen(ChromeDriverVersion) > 50) {
MsgBox, 16, ERROR, % Version_Chrome "버전을 찾을 수 없습니다.`n"ChromeDriverVersion
return 0
}
FileName := "", DownloadUrl := ""
if (Version_Chrome < 115) {
FileName := "chromedriver_win32.zip"
DownloadUrl := "https://chromedriver.storage.googleapis.com/" ChromeDriverVersion "/" FileName
} else {
FileName := "chromedriver-win32.zip"
DownloadUrl := "https://storage.googleapis.com/chrome-for-testing-public/" ChromeDriverVersion "/win32/" FileName
}
URLDownloadToFile, % DownloadUrl , % A_ScriptDir "\" FileName
TmpFolder := A_ScriptDir "\tmp"
FileCreateDir, % TmpFolder
AppObj := ComObjCreate("Shell.Application")
FolderObj := AppObj.Namespace(A_ScriptDir "\" FileName)
AppObj.Namespace(TmpFolder).CopyHere(FolderObj.Items, 4|16)
Loop, Files, chromedriver.exe, R
FileCopy, % A_LoopFileLongPath, % Folder_Chromedriver, 1
FileRemoveDir, % TmpFolder, 1
FileDelete, % A_ScriptDir "\" FileName
if FileExist(Dir_Chromedriver)
MsgBox, 64, INFO, Selenium Chrome Driver 구성요소가 업데이트 되었습니다.
else
return SeleniumChromeDriverUpdateCheck()
}
if !CheckNetFrameWorkInstall()
{
MsgBox, 68, INFO, .Net FrameWork 3.5가 미설치 되어있습니다.`n해당 구성요소를 설치하시겠습니까?
IfMsgBox, No
return 0
FileInstall, dotNetFx35setup.exe, % A_ScriptDir "\dotNetFx35setup.exe", 1
Run, % A_ScriptDir "\dotNetFx35setup.exe"
Sleep, 800
CheckInstallWinHideTime := A_TickCount
while ((A_TickCount - CheckInstallWinHideTime)<1000)
{
while WinExist("Windows 기능")
{
Sleep, 50
CheckInstallWinHideTime := A_TickCount
}
Sleep, 50
}
Sleep, 500
FileDelete, % A_ScriptDir "\dotNetFx35setup.exe"
if CheckNetFrameWorkInstall()
MsgBox, 64, INFO, .Net FrameWork 3.5가 설치되었습니다.
else
return SeleniumChromeDriverUpdateCheck()
}
return 1
}
CheckNetFrameWorkInstall()
{
powershellcode := "Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name version -EA 0 | Where { $_.PSChildName -Match '^(?!S)\p{L}'} | Select PSChildName, version"
RunWait, "powershell" -Command "&{%powershellcode%}" > ahkpstemp.txt,, Hide
FileRead, PSResult, % A_ScriptDir "\ahkpstemp.txt"
FileDelete, % A_ScriptDir "\ahkpstemp.txt"
if InStr(PSResult, "v3.5")
return 1
else
return 0
}
RunHide(Command)
{
dhw := A_DetectHiddenWindows
DetectHiddenWindows, On
Run, %ComSpec%,, Hide, cPid
WinWait, ahk_pid %cPid%
DetectHiddenWindows, %dhw%
DllCall("AttachConsole", "uint", cPid)
Shell := ComObjCreate("WScript.Shell")
Exec := Shell.Exec(Command)
Result := Exec.StdOut.ReadAll()
DllCall("FreeConsole")
Process, Close, %cPid%
Return Result
}