【SeleniumVBA】driver.Start○○でエラーになる
以前紹介した、GitHub GCuser99さんのSeleniumVBAですが、
個人のパソコンでSeleniumVBAを使用する際に特に制限がなく簡単に実行できますが、会社のPCだとポリシーでいくつかの処理が制限されています。
まず、ウェブドライバーの自動更新処理です。
これは何をしているかというと、現在のブラウザのバージョンとウェブドライバーのバージョンを比較し、現在のブラウザに合致するドライバーをマイクロソフトのサーバーから自動でDL、その後Tmpフォルダを作成、そこにウェブドライバーのZipファイルを保存、解凍、現在のウェブドライバーと置き換えた後、Tmpフォルダを削除する。
ここで問題になるのが、Zipファイルの自動解凍です。
自動DL⇒自動解凍がウィルスの動きに似ており企業によっては自動解凍を禁止していることが多いです。
そこで自分はウェブドライバーの自動更新処理のコードをコメントアウトしてスキップすることにしています。
▼クラスモジュール
▼WebDriver クラス
▼Private Sub start プロシージャ内の以下のところ
If checkDriverBrowserVersionAlignment Then
Dim mngr As New WebDriverManager
Dim platform As svbaPlatform
'it's important to run these in silent mode so that if there is a problem, we don't get in the way of automation activity
If browser_ = svbaBrowser.IE Then platform = svbaWin32 Else platform = svbaSystem
mngr.AlignDriverWithBrowser browser_, driverPath, minDriverBrowserCompatibilityLevel, True, platform
End If
ここをすべてコメントアウトしています。
また、VBAからコマンド経由で外部アプリの自動実行を禁止している場合があります。
同じプロシージャ内の以下のコードがその例です。
processID = Shell(commandStr, appWinStyle)
この処理は、ウェブドライバーを起動して起動したウェブドライバーのプロセスIDを取得します。
プロセスIDはこの後の処理に必要で取得できないとブラウザが起動できません。
必要なプロセスIDですが、ウェブドライバーを間接的に自動実行しますので例によって制限をかけている企業も多いと思います。
BATファイルでWebDriverを手動起動して、その後、直接プロセスIDを確認するか、制限回避の方法でプロセスIDを取得する方法を使ってこのprocessIDに値を渡せれば問題ありません。
ただしそれがどういう制限なのか不明なため一概に正解がありません。
試行錯誤して制限にひっかからない処理を探すしかないです。
processID = 123456
タスクマネージャーからウェブドライバーのPIDを確認して直接打ち込む手もあります(笑)
スマートではありませんが・・・
Declare PtrSafe Function OpenProcess Lib "kernel32" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" ( _
ByVal hWnd As Long, ByRef lpdwProcessId As Long) As Long
Const PROCESS_QUERY_INFORMATION = &H400
Const PROCESS_VM_READ = &H10
Declare PtrSafe Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpszClassName As String, ByVal lpszWindowName As String) As Long
Sub GetProcessHandleAndWindowTitle()
Dim hWnd As Long
Dim hProcess As Long
Dim PID As Long
'メモ帳起動
Shell "notepad.exe", vbNormalFocus
'メモ帳のウィンドウハンドルを取得
hWnd = FindWindow(vbNullString, "無題 - メモ帳")
'メモ帳のプロセスIDを取得
GetWindowThreadProcessId hWnd, PID
'メモ帳のプロセスIDを表示
MsgBox PID
End Sub
こんな感じでプロセスIDは取得できるので、あとはこれをさっきの処理にかませてあげれば大丈夫そうです。
ただ、ウェブドライバーの名前は保存先フォルダに依るからちまちま変更するのはダルそうだ…。
フォルダを固定してしまえばいいのだが。
SeleniumBasicならこんなことやらなくて済むんだけどなあwww