見出し画像

【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


この記事が気に入ったらサポートをしてみませんか?