Selenium オブジェクトでブラウザ操作を行うためのWebDriverのダウンロードを行います。
WebDriver.Start メソッド (Selenium)でブラウザを起動する直前に記述することで、ブラウザのバージョンに合ったドライバーをダウンロードします。
直近にダウンロードしたブラウザのバージョンをINIファイルに記録しておくことにより、現在のブラウザのバージョンと同じ場合はダウンロード処理を行いません。
バージョンが同じでもドライバーの再ダウンロードを行いたい場合はforceにTrueを指定します。
- 構文
- WebDriverDownload.Chrome( bit64, force )
WebDriverDownload.Firefox( force )
WebDriverDownload.MsEdge( force )
- 引数
- bit64 省略可
- Chromeブラウザが64bitの場合はTrue、32bitの場合はFalseを指定。省略した場合、インストール先のフォルダパスから判断。
- force 省略可
- 現在インストールされているドライバーとバージョンが一致しても強制的にインストール処理を行うには場合、Trueを指定
- 戻り値
プログラム
//////////////////////////////////////////////////
// 【引数】
// 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
解説
- 2行目
- WshShell オブジェクトを生成しWshShellに代入します。
DIM WshShell = CREATEOLEOBJ("WScript.Shell")
- 3行目
- SeleniumBasicがインストールされているパスをfolderspecに代入します。
DIM folderspec = WshShell.ExpandEnvironmentStrings("%LOCALAPPDATA%\SeleniumBasic\")
- 4,39行目
- Chrome関数。Google Chromeドライバーのダウンロード処理をする関数です。
PROCEDURE Chrome(bit64 = "", force = FALSE) … FEND
- 5行目
- URLを格納しておく連想配列。url["version"]にバージョンを取得するためのURL、url["driver"]にダウンロードするドライバーのURLを代入します。
HASHTBL url
- 6行目
- バージョンを格納しておく連想配列。version["browser"]にブラウザのバージョン、version["driver"]にドライバーのバージョンを代入します。
HASHTBL version
- 7-12行目
- レジストリからGoogle Chromeがインストールされているフォルダのパスを取得し、pathに代入する。インストールされていない場合エラーが発生するので、その場合はプログラムを終了する。
TRY DIM path = WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe\Path") EXCEPT PRINT "Google Chromeがインストールされていません" EXIT ENDTRY
- 13行目
- コマンドプロンプトでインストールされているブラウザのバージョンを取得し、version["browser"]に格納する。
version["browser"] = TRIM(DOSCMD("DIR /B /O-N <#DBL>" + path + "<#DBL> | FINDSTR <#DBL>^[0-9].*¥>"))
- 14行目
- WebDriverVersion.iniに保存しているバージョンとコマンドプロンプトで取得したバージョンが同じ、もしくはforceにFalseが指定された場合以下の処理を行わずに終了します。
IF version["browser"] = READINI("Chrome", "version", folderspec + "WebDriverVersion.ini") AND !force THEN EXIT
- 15行目
- ブラウザのバージョンからメジャーバージョンの箇所を取得しmajorに代入します。
DIM major = VAL(COPY(version["browser"], 1, POS(".", version["browser"]) - 1))
- 16行目
- Chromeのメジャーバージョンからchromedriver.exeのバージョンを取得するためのURLをurl["version"]に代入します。このリンクを開くとChromeの指定したメジャーバージョンに対応するchromedriver.exeのバージョンを確認することができます。
url["version"] = "https://googlechromelabs.github.io/chrome-for-testing/LATEST_RELEASE_" + major
- 17-21行目
- url["version"]に指定されたURLを開き、ダウンロードするドライバーのバージョンを取得し、version["driver"]に代入します。
WITH CREATEOLEOBJ("Msxml2.XMLHTTP") .Open("GET", url["version"], FALSE) .Send() version["driver"] = .ResponseText ENDWITH
- 22-29行目
- bit64の値からダウンロードするドライバーのビット数を取得し、bitに代入します。Trueの場合は64bit、Falseの場合は32bit、値が指定されていない場合は、Chromeがインストールされているフォルダパスから判定します。パスにProgram Files (x86)が含まれている場合は32bit、含まれていない場合は64bitと判断します。
SELECT bit64 CASE TRUE bit = 64 CASE FALSE bit = 32 DEFAULT bit = IIF(POS("Program Files (x86)", path) <> 0, "32", "64") SELEND
- 30行目
- ドライバーのバージョンとChromeのビット数から、ダウンロードするドライバーのURLを生成し、url["driver"]に代入します。
url["driver"] = "https://edgedl.me.gvt1.com/edgedl/chrome/chrome-for-testing/" + version["driver"] + "/win" + bit + "/chromedriver-win" + bit + ".zip"
- 31行目
- ダウンロードしたZIPファイルに付ける名前をfilenameに代入します。
DIM filename = "chromedriver.zip"
- 32行目
- url["driver"]にリクエストを送り、ファイルをダウンロードします。ダウンロードできた場合、ZIPファイルを解凍します。
IF Download(url["driver"], folderspec, filename) THEN UnZip(folderspec + filename)
- 33-37行目
- 解凍したZIPファイルからchromedriver.exeをfolderspecにコピーし、解凍したZIPファイルを削除します。
path = folderspec + "chromedriver-win" + bit + "\chromedriver.exe" WITH CREATEOLEOBJ("Scripting.FileSystemObject") .CopyFile(path, folderspec, TRUE) .DeleteFolder(.GetParentFolderName(path)) ENDWITH
Chromeのインストール先のフォルダ
Ver.85より前からChromeをインストールしていた場合、64bitでも32bitと同じC:\Program Files (x86)\にインストールされています。
bit64の引数を省略すると正しく判定できない場合があるので、正しくドライバーがインストールできない場合はブール値を指定してください。
使い方
以下のようにWebDriver.Start メソッド (Selenium)より前にWebDriverDownloadモジュールを記述することで、ブラウザとドライバーのバージョンが一致せずブラウザが起動できないということがなくなります。
DIM WebDriver = CREATEOLEOBJ("Selenium.WebDriver")
WebDriverDownload.Chrome() // Startメソッドの前に記述
WebDriver.Start("chrome")
プログラム実行例
未読メールの本文からURLを抽出
使用関数
この記事は役に立ちましたか?
ご協力ありがとうございます。
参考文献
- https://kzstock.blogspot.com/2020/06/chrome64-defaultfolder.html
- 「C:\Program Files」:2 - 無無無庵2
- Releases · mozilla/geckodriver · GitHub
- 各種Driverの取得方法について - hifive
- ChromeDriver - WebDriver for Chrome - Downloads
- Chromeバージョン115より最新のWebドライバー取得ができない - 誰でもカンタンにテスト自動化ができる時代 テスト自動化ツール T-DASH