CatLab Studio
article thumbnail

 

 

셀레니움(Selenium)은 강력한 웹 드라이버입니다. 그러나 오토핫키에서 셀레니움 기반으로 작성한 코드는 배포시 타 PC 에서 별도로 셀레니움을 설치해주어야 하고, 셀레니움을 설치하더라도 크롬 버전에 맞는 드라이버를 맞춰주어야 하기 때문에 번거로움이 많습니다. 

 

이 때문에 Chrome.ahk , Rufaydium 등 별도의 설치과정 필요없이 크롬만 있으면 작동하는 웹소켓 기반 드라이버가 주목받고 있는것 같습니다.

 

본 라이브러리는 셀레니움 작동에 필요한 모든 필수구성 요소를 감지하고 설치과정을 제공합니다.

셀레니움이 아예 설치되지 않은 PC라도 약 1분만에 환경설정이 끝나도록 빠른 설치를 가능하게 합니다.

또한 셀레니움이 이미 설치된 PC도 해당 라이브러리를 이용해 크롬 드라이버의 버전 업데이트를 확인하고, 신규 업데이트가 감지될 경우 자동적으로 크롬 드라이버 버전을 업데이트 할 수 있습니다.

 

라이브러리가 제공하는 기능은 다음과 같습니다

  1. 셀레니움 설치 감지 / 미 설치시 설치 프로그램 제공
  2. 크롬 드라이버 버전 확인 / 버전이 일치하지 않을 경우 자동 업데이트 제공
  3. .Net Framework 3.5 설치 확인 / 미 설치시 설치 프로그램 제공

※ 주의사항 ※

본 라이브러리는 배포시 빠른 설치를 제공하기 위해 컴파일시 설치파일들을 exe 파일 내 모두 포함시킵니다.

고로 컴파일시 dotNetFx35setup.exe / SeleniumBasic-2.0.9.0 Installer.exe 가 스크립트와 같은 위치에 있어야합니다.

두 파일이 없더라도 컴파일전에 함수를 실행시키면 별도로 다운로드 받을 수 있도록 제공해놨습니다.

 

- v1.1 업데이트(24.03.20)

  • Chrome 115 이후 버전 자동 업데이트 지원 추가

● 다운로드

AHKSelenium Chrome Driver Installer.zip
0.01MB


환경 테스트를 위해 아무것도 설치되지 않은 윈도우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
}
profile

CatLab Studio

@CatLab

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!