WebDriverDownloadウェブドライバーダウンロード

Selenium オブジェクトでブラウザ操作を行うためのWebDriverのダウンロードを行います。

WebDriver.Start メソッド (Selenium)でブラウザを起動する直前に記述することで、ブラウザのバージョンに合ったドライバーをダウンロードします。

直近にダウンロードしたブラウザのバージョンをINIファイルに記録しておくことにより、現在のブラウザのバージョンと同じ場合はダウンロード処理を行いません。

バージョンが同じでもドライバーの再ダウンロードを行いたい場合はforceTrueを指定します。

構文
WebDriverDownload.Chrome( bit64, force )
WebDriverDownload.Firefox( force )
WebDriverDownload.MsEdge( force )
引数
bit64 省略可
Chromeブラウザが64bitの場合はTrue32bitの場合はFalseを指定。省略した場合、インストール先のフォルダパスから判断。
force 省略可
現在インストールされているドライバーとバージョンが一致しても強制的にインストール処理を行うには場合、Trueを指定
戻り値

プログラム

UWSC
//////////////////////////////////////////////////
// 【引数】
//   bit64 : Chromeブラウザが64bitの場合はTrue、32bitの場合はFalseを指定。省略した場合、インストール先のフォルダパスから判断。 
//   force : 現在インストールされているドライバーとバージョンが一致しても強制的にインストール処理を行うには場合、Trueを指定 
// 【戻り値】
//   
//////////////////////////////////////////////////
MODULE WebDriverDownload
	DIM WshShell = CREATEOLEOBJ("WScript.Shell")
	DIM folderspec = WshShell.ExpandEnvironmentStrings("%LOCALAPPDATA%\SeleniumBasic\")
	PROCEDURE Chrome(bit64 = "", force = FALSE)
		HASHTBL url
		HASHTBL version
		TRY
			DIM path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe\Path")
		EXCEPT
			PRINT "Google Chromeがインストールされていません"
			EXIT
		ENDTRY
		version["browser"] = TRIM(DOSCMD("DIR /B /O-N <#DBL>" + path + "<#DBL> | FINDSTR <#DBL>^[0-9].*¥>"))
		IF version["browser"] = READINI("Chrome", "version", folderspec + "WebDriverVersion.ini") AND !force THEN EXIT
		DIM major = VAL(COPY(version["browser"], 1, POS(".", version["browser"]) - 1))
		url["version"] = "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_" + major
		WITH CREATEOLEOBJ("Msxml2.XMLHTTP")
			.Open("GET", url["version"], FALSE)
			.Send()
			version["driver"] = .ResponseText
		ENDWITH
		SELECT bit64
			CASE TRUE
				bit = 64
			CASE FALSE
				bit = 32
			DEFAULT
				bit = IIF(POS("Program Files (x86)", path) <> 0, "32", "64")
		SELEND
		url["driver"] = "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/" + version["driver"] + "/win" + bit + "/chromedriver-win" + bit + ".zip"
		DIM filename = "chromedriver.zip"
		IF Download(url["driver"], folderspec, filename) THEN UnZip(folderspec + filename)
		path = folderspec + "chromedriver-win" + bit + "\chromedriver.exe"
		WITH CREATEOLEOBJ("Scripting.FileSystemObject")
			.CopyFile(path, folderspec, TRUE)
			.DeleteFolder(.GetParentFolderName(path))
		ENDWITH
		WRITEINI("Chrome", "version", version["browser"], folderspec + "WebDriverVersion.ini")
	FEND
	PROCEDURE Firefox(force = FALSE)
		HASHTBL url
		url["version"] = "https://api.github.com/repos/mozilla/geckodriver/tags"
		WITH CREATEOLEOBJ("Msxml2.XMLHTTP")
			.Open("GET", url["version"], FALSE)
			.Send()
			DIM str = .ResponseText
		ENDWITH
		CONST TemporaryFolder = 2
		HASHTBL temp
		DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
		DIM Folder = FSO.GetSpecialFolder(TemporaryFolder)
		temp["folderspec"] = Folder.Path
		temp["filename"] = FSO.GetTempName
		DIM path = FSO.BuildPath(temp["folderspec"], temp["filename"])
		WITH FSO.CreateTextFile(path)
			.WriteLine(str)
			.Close
		ENDWITH
		str = POWERSHELL("Set-Location <#DBL>" + temp["folderspec"] + "<#DBL>; Get-Content -Path " + temp["filename"] + " -Raw | ConvertFrom-Json | ForEach-Object{echo $_.name}")
		DIM version = SPLIT(str, "<#CR>")[0]
		IF version = READINI("Firefox", "version", folderspec + "WebDriverVersion.ini") AND !force THEN EXIT
		FSO.DeleteFile(path)
		TRY
			path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\firefox.exe\")
			DIM bit = IIF(POS("Program Files (x86)", path), 32, 64)
		EXCEPT
			PRINT "Firefoxがインストールされていません"
			EXIT
		ENDTRY
		url["driver"] = "https://github.com/mozilla/geckodriver/releases/download/" + version + "/geckodriver-" + version + "-win" + bit + ".zip"
		DIM filename = "geckodriver.zip"
		IF Download(url["driver"], folderspec , filename, TRUE) THEN UnZip(folderspec + filename)
		WRITEINI("Firefox", "version", version, folderspec + "WebDriverVersion.ini")
	FEND
	PROCEDURE MsEdge(force = FALSE)
		HASHTBL url
		TRY
			path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe\")
		EXCEPT
			PRINT "Microsoft Edgeがインストールされていません"
			EXIT
		ENDTRY
		DIM version = TRIM(POWERSHELL("(get-item (<#DBL>" + path + "<#DBL>)).VersionInfo.FileVersion"))
		DIM major = TOKEN(".", version)
		IF version = READINI("MsEdge", "version", folderspec + "WebDriverVersion.ini") AND !force THEN EXIT
		url["download"] = "https://msedgewebdriverstorage.blob.core.windows.net/edgewebdriver/LATEST_RELEASE_" + major + "_WINDOWS"
		DIM Request = Request(url["download"])
		version = TRIM(Request.responseText)
		url["driver"] = "https://msedgewebdriverstorage.blob.core.windows.net/edgewebdriver/" + version + "/edgedriver_win" + IIF(KINDOFOS(TRUE), "64", "32") + ".zip"
		DIM filename = "msedgedriver." + version + ".zip"
		IF Download(url["driver"], folderspec, filename) THEN UnZip(folderspec + filename)
		WRITEINI("MsEdge", "version", version, folderspec + "WebDriverVersion.ini")
	FEND
ENDMODULE

//////////////////////////////////////////////////
// ダウンロード
// url:URL、dir:ディレクトリ名、filename:ファイル名、isServerXMLHTTP:
//////////////////////////////////////////////////
FUNCTION Download(url, dir, filename, isServerXMLHTTP = FALSE)
	CONST adSaveCreateOverWrite = 2
	WITH CREATEOLEOBJ("ADODB.Stream")
		.Open()
		.Type = 1
		IF isServerXMLHTTP THEN
			obj = CREATEOLEOBJ("Msxml2.ServerXMLHTTP")
		ELSE
			obj = CREATEOLEOBJ("Msxml2.XMLHTTP")
		ENDIF
		obj.Open("GET", url, FALSE)
		obj.Send()
		.Write(obj.responseBody)
		.SaveToFile(dir + filename, adSaveCreateOverWrite)
		.Close()
	ENDWITH
	RESULT = FOPEN(dir + filename, F_EXISTS)
FEND

//////////////////////////////////////////////////
// 要求
// url:URL、isServerXMLHTTP:
//////////////////////////////////////////////////
FUNCTION Request(url, isServerXMLHTTP = FALSE)
	IFB isServerXMLHTTP THEN
		RESULT = CREATEOLEOBJ("Msxml2.ServerXMLHTTP")
	ELSE
		RESULT = CREATEOLEOBJ("Msxml2.XMLHTTP")
	ENDIF
	WITH RESULT
		.Open("GET", url, FALSE)
		.Send()
	ENDWITH
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻り値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   path 
//   destination 
// 【戻り値】
//   
//////////////////////////////////////////////////
PROCEDURE UnZip(path, destination = "")
	DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject")
	DIM folderspec = FSO.GetParentFolderName(path)
	DIM filename = FSO.GetFileName(path)
	IF destination = "" THEN destination = folderspec
	POWERSHELL("Set-Location " + folderspec + "; Expand-Archive " + filename + " -DestinationPath " + destination + " -Force")
FEND

解説

  1. 2行目
    UWSC
    	DIM WshShell = CREATEOLEOBJ("WScript.Shell")
    WshShell オブジェクトを生成しWshShellに代入します。
  2. 3行目
    UWSC
    	DIM folderspec = WshShell.ExpandEnvironmentStrings("%LOCALAPPDATA%\SeleniumBasic\")
    SeleniumBasicがインストールされているパスをfolderspecに代入します。
  3. 4,39行目
    UWSC
    	PROCEDURE Chrome(bit64 = "", force = FALSE)
    		…
    	FEND
    Chrome関数。Google Chromeドライバーのダウンロード処理をする関数です。
  4. 5行目
    UWSC
    		HASHTBL url
    URLを格納しておく連想配列。url["version"]にバージョンを取得するためのURL、url["driver"]にダウンロードするドライバーのURLを代入します。
  5. 6行目
    UWSC
    		HASHTBL version
    バージョンを格納しておく連想配列。version["browser"]にブラウザのバージョン、version["driver"]にドライバーのバージョンを代入します。
  6. 7-12行目
    UWSC
    		TRY
    			DIM path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe\Path")
    		EXCEPT
    			PRINT "Google Chromeがインストールされていません"
    			EXIT
    		ENDTRY
    レジストリからGoogle Chromeがインストールされているフォルダのパスを取得し、pathに代入する。インストールされていない場合エラーが発生するので、その場合はプログラムを終了する。
  7. 13行目
    UWSC
    		version["browser"] = TRIM(DOSCMD("DIR /B /O-N <#DBL>" + path + "<#DBL> | FINDSTR <#DBL>^[0-9].*¥>"))
    コマンドプロンプトでインストールされているブラウザのバージョンを取得し、version["browser"]に格納する。
  8. 14行目
    UWSC
    		IF version["browser"] = READINI("Chrome", "version", folderspec + "WebDriverVersion.ini") AND !force THEN EXIT
    WebDriverVersion.iniに保存しているバージョンとコマンドプロンプトで取得したバージョンが同じ、もしくはforceFalseが指定された場合以下の処理を行わずに終了します。
  9. 15行目
    UWSC
    		DIM major = VAL(COPY(version["browser"], 1, POS(".", version["browser"]) - 1))
    ブラウザのバージョンからメジャーバージョンの箇所を取得しmajorに代入します。
  10. 16行目
    UWSC
    		url["version"] = "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_" + major
    Chromeのメジャーバージョンからchromedriver.exeのバージョンを取得するためのURLをurl["version"]に代入します。このリンクを開くとChromeの指定したメジャーバージョンに対応するchromedriver.exeのバージョンを確認することができます。
  11. 17-21行目
    UWSC
    		WITH CREATEOLEOBJ("Msxml2.XMLHTTP")
    			.Open("GET", url["version"], FALSE)
    			.Send()
    			version["driver"] = .ResponseText
    		ENDWITH
    url["version"]に指定されたURLを開き、ダウンロードするドライバーのバージョンを取得し、version["driver"]に代入します。
  12. 22-29行目
    UWSC
    		SELECT bit64
    			CASE TRUE
    				bit = 64
    			CASE FALSE
    				bit = 32
    			DEFAULT
    				bit = IIF(POS("Program Files (x86)", path) <> 0, "32", "64")
    		SELEND
    bit64の値からダウンロードするドライバーのビット数を取得し、bitに代入します。Trueの場合は64bit、Falseの場合は32bit、値が指定されていない場合は、Chromeがインストールされているフォルダパスから判定します。パスにProgram Files (x86)が含まれている場合は32bit、含まれていない場合は64bitと判断します。
  13. 30行目
    UWSC
    		url["driver"] = "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/" + version["driver"] + "/win" + bit + "/chromedriver-win" + bit + ".zip"
    ドライバーのバージョンとChromeのビット数から、ダウンロードするドライバーのURLを生成し、url["driver"]に代入します。
  14. 31行目
    UWSC
    		DIM filename = "chromedriver.zip"
    ダウンロードしたZIPファイルに付ける名前をfilenameに代入します。
  15. 32行目
    UWSC
    		IF Download(url["driver"], folderspec, filename) THEN UnZip(folderspec + filename)
    url["driver"]にリクエストを送り、ファイルをダウンロードします。ダウンロードできた場合、ZIPファイルを解凍します。
  16. 33-37行目
    UWSC
    		path = folderspec + "chromedriver-win" + bit + "\chromedriver.exe"
    		WITH CREATEOLEOBJ("Scripting.FileSystemObject")
    			.CopyFile(path, folderspec, TRUE)
    			.DeleteFolder(.GetParentFolderName(path))
    		ENDWITH
    解凍したZIPファイルからchromedriver.exefolderspecにコピーし、解凍したZIPファイルを削除します。
  17. 38行目
    UWSC
    		WRITEINI("Chrome", "version", version["browser"], folderspec + "WebDriverVersion.ini")
    ChromeブラウザのバージョンをWebDriverVersion.iniに書き込みます。次回WebDriverDownload.Chrome関数を実行したときに14行目>>>でバージョンチェックを行い、同じ場合はドライバーのダウンロード処理(15行目>>>以降)を省略することができます。

Chromeのインストール先のフォルダ

Ver.85より前からChromeをインストールしていた場合、64bitでも32bitと同じC:\Program Files (x86)\にインストールされています。

bit64の引数を省略すると正しく判定できない場合があるので、正しくドライバーがインストールできない場合はブール値を指定してください。

使い方

以下のようにWebDriver.Start メソッド (Selenium)より前にWebDriverDownloadモジュールを記述することで、ブラウザとドライバーのバージョンが一致せずブラウザが起動できないということがなくなります。

UWSC
DIM WebDriver = CREATEOLEOBJ("Selenium.WebDriver")

WebDriverDownload.Chrome()    // Startメソッドの前に記述
WebDriver.Start("chrome")

プログラム実行例

未読メールの本文からURLを抽出

UWSC
使用関数

この記事は役に立ちましたか?

はい
いいえ
ご協力ありがとうございます。

参考文献

  1. https://kzstock.blogspot.com/2020/06/chrome64-defaultfolder.html
  2. 「C:\Program Files」:2 - 無無無庵2
  3. Releases · mozilla/geckodriver · GitHub
  4. 各種Driverの取得方法について - hifive
  5. ChromeDriver - WebDriver for Chrome - Downloads
  6. Chromeバージョン115より最新のWebドライバー取得ができない - 誰でもカンタンにテスト自動化ができる時代 テスト自動化ツール T-DASH