; Notes/Extra Info/#Includes ;------------------------------------------------ ; Chrome Global Variables ;------------------------------------------------ ; Chrome/Selenium global ChromeFilepath ; Declare global variables here so they don't have to be declared in each script global ChromeTabsURLArray global DriverTitleArray global LastWebsitePostURL global CurrentTabURL global URLOfLastErrorPage global chromeDLURL64 global chromedriverDLURL64 global InstalledChromeVersion ; Chrome Related Functions ;------------------------------------------------ DownloadLatestChromium(){ Message = Checking Variables for Downloading Newest Chrome SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") if(ChromeFilepath = "") ChromeFilepath := GetInstalledChromeFilepath() if(chromedriverDLURL64 ="" or chromeDLURL64 = ""){ ChromeStableLatestVersion := GetLatestChromeStableVersion() GetDownloadURLOfChromeAndDriver(ChromeStableLatestVersion) } ; Msgbox % "chromedriverDLURL64: " chromedriverDLURL64 ; Msgbox % "chromeDLURL64: " chromeDLURL64 ParentFolder = %A_ScriptDir%\Lib\Downloads ChromeDriverDownloadZipFilepath = %ParentFolder%\chromedriver-win64.zip ChromeDriverDownloadFilepath = %ParentFolder%\chromedriver-win64 ChromeDriverTemporaryExeFilepath = %ParentFolder%\chromedriver-win64\chromedriver-win64\chromedriver.exe ChromeDownloadZipFilepath = %ParentFolder%\chrome-win64.zip ChromeExtractedDirectory = %A_ScriptDir%\Lib\chrome-win64 ChromeDriverMoverEXEFilepath = %A_ScriptDir%\Lib\Chromedriver-Mover.exe ChromeDriverMoverURL = https://freedomain.dev/attachments/b7b608b6-379a-42bb-a7c4-23fd67a05bb3 ChromeDriverProgramFilesExeFilepath = C:\Program Files\SeleniumBasic\chromedriver.exe ManualMoveChromedriverMessage =Please manually copy chromedriver.exe from:`n`n%ChromeDriverDownloadFilepath%`n`nTo:`n`nC:\Program Files\SeleniumBasic\chromedriver.exe /* With URLDownloadToFile you don't need to delete pre-existing files, as they get overwriten when a new file is downloaded. FileRemoveDir, %ParentFolder%, 1 if(ErrorLevel){ Message = Failed to download Parent Download Folder. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") } if(!FileExist(ParentFolder)){ ; msgbox, creating dir FileCreateDir, %ParentFolder% } Msgbox % "ParentFolder: " ParentFolder msgbox % FileExist(ParentFolder) if(!FileExist(ParentFolder)){ msgbox, creating dir FileCreateDir, %ParentFolder% } FileDelete, %ChromeDriverDownloadZipFilepath% if(ErrorLevel) msgbox, failed to delete %ChromeDriverDownloadZipFilepath% FileRemoveDir, %ChromeDownloadZipFilepath%, 1 if(ErrorLevel) msgbox, failed to delete %ChromeDownloadZipFilepath% FileRemoveDir, %ChromeDriverDownloadFilepath%, 1 msgbox, failed to delete %ChromeDriverDownloadFilepath% FileRemoveDir, %ChromeExtractedDirectory%, 1 */ if(!FileExist(ParentFolder)){ ; msgbox, creating dir FileCreateDir, %ParentFolder% } ; close any open instances of Chromium ; SetTitleMatchMode, 2 ; substring /* if(WinExist(" - Chromium")){ Message = Trying to close any open Chromium Windows SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Loop, 10 { WinClose, - Chromium ; , WinText, SecondsToWait, ExcludeTitle, ExcludeText] sleep, 500 } } if(WinExist(" - Chromium")){ Message = Failed to close existing Chromium Window(s). Please close them manually and then click the "Update Chrome" button again SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ToolTip MsgBox 0x10,, %Message% return } */ ; make sure all instances of chrome are closed Loop, { ChromeOpen := WinExist("ahk_exe chrome.exe") if(ChromeOpen) { Message = Chrome is Open. Asking user to close instances before continuing. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") MsgBox 0x41, Chrome is Open, Please close all instances of Chrome and then click OK to continue with replacing Chrome with the newest version. IfMsgBox OK, { } Else IfMsgBox Cancel, { return } } else, break } ; make sure all instances of chromedriver.exe are closed Message = Checking and killing any instances of the chromedriver.exe process SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Loop, 5 { Process, Exist, chromedriver.exe ChromedriverExists := ErrorLevel if(ChromedriverExists){ Message = Chromedriver Exists on check number %A_Index% SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,DiscordErrorLogging") Process, Close, chromedriver.exe sleep, 5000 ; wait 5 seconds before checking again continue } else, break Message = Chrome Update Failed. Unable to kill background chromedriver.exe process SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") return } FileGetTime, ChromeDriverExeOldCreationTime, %ChromeDriverProgramFilesExeFilepath%, C Message = Downloading Chromedriver v%ChromeStableLatestVersion% `nFrom: %chromedriverDLURL64%`nTo: %ChromeDriverDownloadZipFilepath% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") UrlDownloadToFile, %chromedriverDLURL64%, %ChromeDriverDownloadZipFilepath% Message = Downloading Chromium v%ChromeStableLatestVersion% `nfrom: %chromeDLURL64% to:`n%ChromeDownloadZipFilepath%`n(This might take 1-2 minutes) SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") UrlDownloadToFile, %chromeDLURL64%, %ChromeDownloadZipFilepath% ; delete the pre-existing chrome-win64 directory Message = Deleting Old Chromium Directory SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") FileRemoveDir, %ChromeExtractedDirectory%, 1 if(FileExist(ChromeExtractedDirectory)){ Message = Failed to delete the old Chromium. `nPlease manually delete the following directory and then run the Chrome Update again.`n`n %ChromeExtractedDirectory% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar") MsgBox 0x10,, %Message% ToolTip return } ; Double check that .zip files exist ChromeDriverZipExists := FileExist(ChromeDriverDownloadZipFilepath) if(!ChromeDriverZipExists){ Message = Download of chromedriver failed for some reason. chromedriver.zip not found. SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") MsgBox 0x10,, %Message% Return } ChromeZipExists := FileExist(ChromeDownloadZipFilepath) if(!ChromeZipExists){ Message = Download of chrome failed for some reason. chrome.zip not found. SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") MsgBox 0x10,, %Message% Return } Message = Extracting Chromedriver v%ChromeStableLatestVersion% Zip file SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Unzip(ChromeDriverDownloadZipFilepath, ChromeDriverDownloadFilepath) Message = Extracting Chromium v%ChromeStableLatestVersion% Zip file SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Unzip(ChromeDownloadZipFilepath, ChromeExtractedDirectory) ; Check if the Copy-ChromeDriver-To-Program-Files.exe file exists ; @todo, remove later. this is temporary to fix chromedriver-mover being broken and needing to be replaced FileDelete, %ChromeDriverMoverEXEFilepath% Message = Checking Chromedriver-Mover.exe exists SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") if(!FileExist(ChromeDriverMoverEXEFilepath)){ Message = Chromedriver-Mover not found. Downloading from Gitea SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") UrlDownloadToFile, %ChromeDriverMoverURL%, %ChromeDriverMoverEXEFilepath% if(ErrorLevel){ Message = Failed to download the Copy-ChromeDriver-To-Program-Files.exe executable. `n`n%ManualMoveChromedriverMessage% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") ToolTip Return } } if(!FileExist(ChromeDriverMoverEXEFilepath)){ Message = ChromeDriver-Mover not found after downloading. `nPossibly triggered and deleted by Antivirus?`n`n%ManualMoveChromedriverMessage% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging,msgbox") ToolTip return } Message = Starting up Chromedriver-Mover SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ; Msgbox % "ChromeDriverMoverEXEFilepath: " ChromeDriverMoverEXEFilepath ; Msgbox % "ChromeDriverDownloadFilepath: " ChromeDriverDownloadFilepath try, Run "%ChromeDriverMoverEXEFilepath%" "%ChromeDriverDownloadFilepath%" if(ErrorLevel = "ERROR"){ Message = Failed to run Chromedriver-Mover.exe program to automatically copy the chromedriver to Program Files.`n%ManualMoveChromedriverMessage% MsgBox 0x40,, %Message% } Message = Waiting 30 seconds for new Chromedriver to get moved to C:\Program Files\SeleniumBasic\ SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Loop, 30 { sleep, 1000 FileGetTime, ChromeDriverExeCurrentCreationTime, %ChromeDriverProgramFilesExeFilepath%, C ; Msgbox % "ChromeDriverExeOldCreationTime: " ChromeDriverExeOldCreationTime ; Msgbox % "ChromeDriverExeCurrentCreationTime: " ChromeDriverExeCurrentCreationTime if(ErrorLevel){ Message = chromedriver.exe not found in %ChromeDriverProgramFilesExeFilepath%. `nWaiting for new version to get copied over. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ; sleep, 1000 Continue } if(ChromeDriverExeCurrentCreationTime != ChromeDriverExeOldCreationTime and ChromeDriverExeCurrentCreationTime != ""){ break } ; sleep, 1000 Continue } if(!FileExist(ChromeDriverProgramFilesExeFilepath)){ Message = Failed to Automatically move chromedriver.exe`n%ManualMoveChromedriverMessage% MsgBox 0x40,, %Message% ToolTip return } Message = Chromium and Chromedriver.exe were updated successfully. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") MsgBox 0x40,, %Message% ChromeFilepath := ; clear out chromefilepath variable in case the path changed ToolTip return } /* */ CheckForChromeUpdates(ChromeFilepath := ""){ if(ChromeFilepath = "") ChromeFilepath := GetInstalledChromeFilepath() CurrentInstalledChromeVersion := GetInstalledChromeVersion() CurrentChromeStableVersion := GetLatestChromeStableVersion() if(CurrentInstalledChromeVersion < CurrentChromeStableVersion){ ChromeUpdateAvailable := 1 return ChromeUpdateAvailable } else, Return 0 } GetInstalledChromeFilepath(){ ; ChromeFilepath is global variable if(ChromeFilepath = ""){ ChromePortableFilepath = %A_ScriptDir%\Lib\chrome-win64\chrome.exe ChromePortableFilepath2 = %A_ScriptDir%\Lib\chrome-win64\chrome-win64\chrome.exe ; filepath of chrome.exe that was downloaded automatically using this uploader if(FileExist(ChromePortableFilepath) or FileExist(ChromePortableFilepath2)){ if(FileExist(ChromePortableFilepath2)) ChromeFilepath := ChromePortableFilepath2 if(FileExist(ChromePortableFilepath)) ChromeFilepath := ChromePortableFilepath Message = Using Chromium Portable for Upload SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,DiscordErrorLogging") } else { MsgBox 0x10, Chrome Not Found, Chrome for Testing not found.`nIf this is your first time running on this computer, please click the "Chrome Up-To-Date" button to download the latest chrome binaries. } } ToolTip } GetInstalledChromeVersion(){ if(ChromeFilepath = ""){ GetInstalledChromeFilepath() } GetInstalledChromeVersionCommand = powershell (Get-Item '%ChromeFilepath%').VersionInfo.ProductVersion InstalledChromeVersion := RunCMD(GetInstalledChromeVersionCommand) if(InStr(InstalledChromeVersion, "`r")) InstalledChromeVersion := StrReplace(InstalledChromeVersion, "`r") ; replace any newline characters that powershell returns return InstalledChromeVersion } GetLatestChromeStableVersion(){ ; https://github.com/GoogleChromeLabs/chrome-for-testing#json-api-endpoints json_str := urldownloadtovar("https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions.json") ; converts json data variable into object parsed := JSON.Load(json_str) try ChromeStableLatestVersion := parsed.channels.stable.version if(ChromeStableLatestVersion = ""){ return "Failed to parse json. " } return ChromeStableLatestVersion } GetDownloadURLOfChromeAndDriver(InstalledChromeVersion){ ; Will return the download URL of Chrome for Testing and Chrome Driver, seperated by a || ; https://github.com/GoogleChromeLabs/chrome-for-testing#json-api-endpoints json_str := urldownloadtovar("https://googlechromelabs.github.io/chrome-for-testing/known-good-versions-with-downloads.json") ; requires #include of json.ahk in parent script parsed := JSON.Load(json_str) ChromelabsJsonEntriesCount := parsed.versions.count() if(ChromelabsJsonEntriesCount = ""){ return "Failed to parse chromedriver json. " } loop % ChromelabsJsonEntriesCount { if(A_index = ChromelabsJsonEntriesCount){ Message = "Failed to find %InstalledChromeVersion% in the ChromeLabs Json" return Message } if(InstalledChromeVersion = parsed.versions[A_Index].version){ VersionIndex := A_Index ; loop through the platforms to get download URL for Chrome loop % parsed.versions[VersionIndex].downloads.chrome.count() { if(parsed.versions[VersionIndex].downloads.chrome[A_Index].platform = "win64") chromeDLURL64 := parsed.versions[VersionIndex].downloads.chrome[A_Index].url } ; loop through the platforms to get download URL for Chromedriver loop % parsed.versions[VersionIndex].downloads.chromedriver.count() { if(parsed.versions[VersionIndex].downloads.chromedriver[A_Index].platform = "win64") chromedriverDLURL64 := parsed.versions[VersionIndex].downloads.chromedriver[A_Index].url } break } } URLS = %chromeDLURL64%||%chromedriverDLURL64% return URLS }