Microsoft EdgeをWebDriver経由で操作できるのはとても便利なのだが、立て続けにドライバを実行すると、もういらないバイナリが背後で動き続けることがある。リソースの無駄遣いなので、こうした問題の種は最初に処理しておこう。

→連載「意外と知らないMicrosoft Edgeの便利な使い方」の過去回はこちらを参照。

WebDriverを使った起動方法と停止方法

前回までに説明したように、PowerShell SeleniumモジュールからWebDriver経由でMicrosoft Edgeを操作する場合、次のように「Start-SeDriver」コマンドレットを起動してドライバ経由でMicrosoft Edgeを起動する。

PS C:\Users\daichi> Start-SeDriver -Browser Edge -Size '1200,800'

SeFriendlyName                   SeBrowser SeTitle SeUrl
--------------                   --------- ------- -----
804e775a3b606ede2f666c67f6d1227d Edge *            data:,

PS C:\Uses\daichi>

この処理で、次のようにWebDriver経由で操作されているMicrosoft Edgeが起動してくる。

  • WebDriver経由で操作可能なMicrosoft Edge

    WebDriver経由で操作可能なMicrosoft Edge

このようにして起動したMicrosoft Edgeは、「Stop-SeDriver」コマンドレットを実行することで終了することができる。

PS C:\Users\daichi> Stop-SeDriver
PS C:\Users\daichi>

Stop-SeDriverコマンドレットを実行すると、Microsoft Edgeと、それに付随して起動したWebDriverのドライババイナリも終了される。これが適切に終了処理を行った場合の動きだ。

停止中

WebDriver経由でMicrosoft Edgeを起動すると、Microsoft EdgeのみならずWebDriverドライバも起動してくる。このドライバは「msedgedriver.exe」というファイル名になっている。

試しに、Stop-SeDriverコマンドレットを実行して正常に処理が完了した状態で次のようにコマンドレットを実行しても、「msedgedriver.exe」の実行を確認することはできない。

PS C:\Users\daichi> Get-Process -Name msedgedriver
Get-Process: Cannot find a process with the name "msedgedriver". Verify the process name and call the cmdlet again.
PS C:\Users\daichi>

この状態だとStop-SeDriverコマンドレットを実行しても処理は失敗する。すでに停止しているからだ。

PS C:\Users\daichi> Stop-SeDriver
MethodInvocationException: Exception calling "Close" with "0" argument(s): "disconnected: unable to connect to renderer   (failed to check if
window was closed: disconnected: unable to connect to renderer)   (Session info: MicrosoftEdge=107.0.1418.35)"

PS C:\Users\daichi>

常にこの状態に戻ればよいのだが、こうならないケースがある。

WebDriverドライバの実行が残ってしまうケース

例えば、次のように連続してStart-SeDriverコマンドレットを実行して、WebDriver経由でMicrosoft Edgeを起動する。

PS C:\Users\daichi> Start-SeDriver -Browser Edge -Size '1200,800'

SeFriendlyName                   SeBrowser SeTitle SeUrl
--------------                   --------- ------- -----
37ef501e972270074f30e281c69919de Edge *            data:,

PS C:\Users\daichi> Start-SeDriver -Browser Edge -Size '1200,800'

SeFriendlyName                   SeBrowser SeTitle SeUrl
--------------                   --------- ------- -----
a6209d94b6aba036dfc19bbb001087e4 Edge *            data:,

PS C:\Users\daichi> Start-SeDriver -Browser Edge -Size '1200,800'

SeFriendlyName                   SeBrowser SeTitle SeUrl
--------------                   --------- ------- -----
7ab90401176c631d6751f0bbf3f8ab5f Edge *            data:,

PS C:\Users\daichi>

この状態で先ほどと同じようにGet-Processコマンドレットを実行すると、「msedgedriver」というドライババイナリが3つ、実行状態にあることを確認できる。

PS C:\Users\daichi> Get-Process -Name msedgedriver

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     26     8.45      23.53       0.00    1940   1 msedgedriver
     26    8.50      23.55       0.02   27288   1 msedgedriver
     25     8.53      23.61       0.02   30968   1 msedgedriver

PS C:\Users\daichi> 

ここでStop-SeDriverコマンドレットを実行する。次のように「msedgedriver」が1つ消えることを確認できる。

PS C:\Users\daichi> Stop-SeDriver
PS C:\Users\daichi> Get-Process -Name msedgedriver

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     25     8.34      23.48       0.02   27288   1 msedgedriver
     24     8.41      23.56       0.02   30968   1 msedgedriver

PS C:\Users\daichi>

さらにStop-SeDriverコマンドレットを実行しても、残りの「msedgedriver」は消えずに残り続けている。

PS C:\Users\daichi> Stop-SeDriver
PS C:\Users\daichi> Get-Process -Name msedgedriver

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     23     8.15      23.38       0.02   27288   1 msedgedriver
     23     8.25      23.48       0.02   30968   1 msedgedriver

PS C:\Users\daichi> Stop-SeDriver
PS C:\Users\daichi> Get-Process -Name msedgedriver

 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     23     8.15      23.38       0.02   27288   1 msedgedriver
     23     8.25      23.48       0.02   30968   1 msedgedriver

PS C:\Users\daichi>

こんな感じでStart-SeDriverコマンドレットで起動したものはStop-SeDriverコマンドレットで終了させないと、意味のないプロセスとしてシステムに残留してしまう。

WebDriverドライバの実行が残ってしまうケース

無駄なWebDriverドライバが残らないようにする方法はいくつか考えられるが、てっとり早いのは「msedgedriver」を全部終了してしまうことだ。WebDrvier経由でMicrosoft Edgeを操作するという作業を同時に2つ以上実行する場合は都合が悪いが、同時に1つしか実行しない前提であればこれで十分だ。

次のようにコマンドレットを実行すればまとめて終了させることができる。

PS C:\Users\daichi> Get-Process -Name msedgedriver 2> $Null | Stop-Process
PS C:\Users\daichi> Get-Process -Name msedgedriver
Get-Process: Cannot find a process with the name "msedgedriver". Verify the process name and call the cmdlet again.
PS C:\Users\daichi>

雑な方法ではあるが、もう使われないプロセスが残るといった状態は簡単に避けることができるので、まずこの方法を用意しておこう。

スクリプトにまとめる

これまで説明してきた処理を「webdriver_edge_stop.ps1」というPowerShellスクリプトにまとめておく。次のような感じだ。

#!/usr/bin/env pwsh

#========================================================================
# Microsoft Edge WebDriverを終了する
#========================================================================

#========================================================================
# WebDriverプロセスを終了
#========================================================================
if  (Get-Process -Name msedgedriver 2> $Null) 
{
    '動作しているMicrosoft Edge WebDriverを終了します。'
    Get-Process -Name msedgedriver 2> $Null

    # Microsoft Edge WebDriverを終了
    Stop-SeDriver 2> $Null

    # まだ動作しているほかのMicrosoft Edge WebDriverを終了
    if  (Get-Process -Name msedgedriver 2> $Null) 
    {
        Get-Process -Name msedgedriver 2> $Null | Stop-Process
    }

    '動作しているMicrosoft Edge WebDriverの終了処理完了。'
}

Microsoft EdgeをWebDriver経由で起動するスクリプトの対となるスクリプトとして、このスクリプトを用意しておく。そして、Microsoft EdgeをWebDriver経由で起動するスクリプトの中で「webdriver_edge_stop.ps1」を呼び出すようにすれば、使われないプロセスが残るといった状態を避けることができる。

webdriver_edge_stop.ps1のような名前にしてあるのは、ほかのWebブラウザ用のPowerShellスクリプトも用意できるようにするためだ。webdriver_chrome_stop.ps1、webdriver_firefox_stop.ps1、webdriver_safari_stop.ps1あたりまで用意しておけば十分だろう。