PowerShell+タスクスケジューラでWebDriver(Edge)を自動更新する設定手順まとめ

プログラミング

はじめに

Selenium を使って Microsoft Edge の自動操作を行う際、msedgedriver.exe のバージョンとブラウザ本体のバージョンが一致していないと、起動エラーや動作不良が発生することがある。
特に企業環境や定期的なアップデートがかかるPCでは、知らぬ間にバージョン不整合が起きやすい。

そこで今回は、Edge本体のバージョンと WebDriver を照合し、自動的に更新する PowerShell スクリプトと、Windows タスクスケジューラによる自動実行設定を紹介する。
Python や PowerShell からの起動例も合わせて掲載しているので、すぐに使い始められる構成だ。


スポンサーリンク
スポンサーリンク

スクリプトの概要と特徴

以下の PowerShell スクリプトは、次の機能を持つ。

  • Edge のバージョンをレジストリから取得
  • インストール済み msedgedriver.exe のバージョンと照合
  • バージョンが異なる場合は自動ダウンロード・更新
  • 64bit 版を既定で使用(32bit にも切替可能)
  • ドライバが PATH に登録されていない場合は自動で追加
  • ログ記録や一時ファイルのクリーンアップも完備

スクリプト本体は以下のパスに保存する前提で作成されている。

C:\Scripts\Update-EdgeWebDriver.ps1

配置ディレクトリや構成は冒頭で自由に調整可能だ。


PowerShell スクリプトの設置手順

  1. 任意のエディタで以下の内容を貼り付け、「C:\Scripts\Update-EdgeWebDriver.ps1」として保存する
  2. 必要に応じて $InstallDir$DriverArch を自環境に合わせて変更する
  3. 管理者権限で一度手動実行し、動作を確認する

✅ ポイント:タスクスケジューラで自動化する場合でも、初回だけは管理者で手動実行しておくと安心だ

#requires -Version 5.1
<#
.SYNOPSIS
  Microsoft Edge のバージョンと msedgedriver.exe のバージョンを照合し、必要に応じて自動更新する。
.DESCRIPTION
  - Stable版 Edge を前提(Beta/Dev を使う場合は REG パスを切替)
  - 64bit ドライバを取得(必要に応じて win32 に変更可)
  - C:\Tools\msedgedriver に配置(変更可能)
#>

$ErrorActionPreference = 'Stop'

# ===== 設定ここから =====
$DriverArch   = 'win64'                      # 'win64' or 'win32'
$InstallDir   = 'C:\Tools\msedgedriver'      # ドライバの配置先
$TempDir      = Join-Path $env:TEMP 'EdgeWD_Update'
$LogDir       = 'C:\Scripts\Logs'
$LogPath      = Join-Path $LogDir 'Update-EdgeWebDriver.log'
$TimeoutSec   = 120
# Stable の Edge バージョンを取るレジストリ。Beta/Devを使うなら以下のコメントを参照。
$EdgeRegPath  = 'HKLM:\SOFTWARE\Microsoft\Edge\BLBeacon'     # Stable
# Beta: 'HKLM:\SOFTWARE\Microsoft\Edge Beta\BLBeacon'
# Dev : 'HKLM:\SOFTWARE\Microsoft\Edge Dev\BLBeacon'
# Canary は通常自動更新のみ。ドライバURLは同様形式。
# ===== 設定ここまで =====

# ログ準備
New-Item -Force -ItemType Directory -Path $LogDir | Out-Null
Start-Transcript -Path $LogPath -Append

try {
    Write-Host "=== Edge WebDriver Auto-Updater ==="
    New-Item -Force -ItemType Directory -Path $InstallDir | Out-Null
    New-Item -Force -ItemType Directory -Path $TempDir | Out-Null

    # 1) Edge(ブラウザ)のバージョン取得
    $edgeVersion = (Get-ItemProperty -Path $EdgeRegPath -Name 'version' -ErrorAction Stop).version
    if (-not $edgeVersion) { throw "Edge version not found in registry: $EdgeRegPath" }
    Write-Host "Edge version: $edgeVersion"

    # 2) 既存ドライバのバージョン取得
    $driverPath = Join-Path $InstallDir 'msedgedriver.exe'
    $currentDriverVersion = $null
    if (Test-Path $driverPath) {
        try {
            # "MSEdgeDriver.exe --version" の出力例: "MSEdgeDriver 129.0.2792.52 ..."
            $verOut = & $driverPath --version 2>$null
            if ($verOut -match '(\d+\.\d+\.\d+\.\d+)') {
                $currentDriverVersion = $Matches            }
        } catch { }
        if (-not $currentDriverVersion) {
            # ファイル バージョンから取得
            $currentDriverVersion = (Get-Item $driverPath).VersionInfo.FileVersion
        }
    }
    Write-Host ("Current driver version: " + ($currentDriverVersion ?? "[not installed]"))

    # 同一メジャー/ビルド系が必須。基本は完全一致を狙う。
    $needsUpdate = $true
    if ($currentDriverVersion -and ($currentDriverVersion -eq $edgeVersion)) {
        $needsUpdate = $false
        Write-Host "Driver is up to date."
    }

    if ($needsUpdate) {
        Write-Host "Updating driver to: $edgeVersion"

        # 3) ダウンロード URL を組み立て
        # 公式配布: https://msedgedriver.azureedge.net/<version>/edgedriver_win64.zip
        $baseUrl = "https://msedgedriver.azureedge.net/$edgeVersion/edgedriver_$DriverArch.zip"
        $zipPath = Join-Path $TempDir "edgedriver_$DriverArch.zip"

        # 4) ダウンロード(リトライ付き)
        $maxRetry = 3
        for ($i=1; $i -le $maxRetry; $i++) {
            try {
                Write-Host "Downloading ($i/$maxRetry): $baseUrl"
                Invoke-WebRequest -UseBasicParsing -Uri $baseUrl -OutFile $zipPath -TimeoutSec $TimeoutSec
                if ((Get-Item $zipPath).Length -gt 0) { break }
            } catch {
                if ($i -eq $maxRetry) { throw }
                Start-Sleep -Seconds ([int][Math]::Min(5 * $i, 15))
            }
        }

        # 5) 展開して配置
        # zip 内にドライバ本体 "msedgedriver.exe" が含まれる
        $extractDir = Join-Path $TempDir "extracted"
        if (Test-Path $extractDir) { Remove-Item $extractDir -Recurse -Force }
        Expand-Archive -Path $zipPath -DestinationPath $extractDir -Force

        $extractedDriver = Get-ChildItem -Recurse -Filter 'msedgedriver.exe' -Path $extractDir | Select-Object -First 1
        if (-not $extractedDriver) { throw "msedgedriver.exe not found in archive." }

        # 既存プロセスが掴んでいると上書き失敗するため念のため終了
        Get-Process -Name 'msedgedriver' -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue

        Copy-Item -Force $extractedDriver.FullName $driverPath

        # 6) PATH に追加(なければ)
        $currentPath = [Environment]::GetEnvironmentVariable('Path','Machine')
        if ($currentPath -notmatch [Regex]::Escape($InstallDir)) {
            [Environment]::SetEnvironmentVariable('Path', ($currentPath.TrimEnd(';') + ';' + $InstallDir), 'Machine')
            Write-Host "System PATH に $InstallDir を追加しました(次回のシェルから有効)。"
        }

        # 7) 検証
        $newVerOut = & $driverPath --version 2>$null
        if ($newVerOut -match '(\d+\.\d+\.\d+\.\d+)') {
            $newDriverVersion = $Matches            Write-Host "Updated driver version: $newDriverVersion"
            if ($newDriverVersion -ne $edgeVersion) {
                Write-Warning "Driver version and Edge version do not match exactly. Edge:$edgeVersion Driver:$newDriverVersion"
            }
        } else {
            Write-Warning "Driver updated, but version check failed."
        }
    }

    Write-Host "Done."
}
catch {
    Write-Error $_.Exception.Message
    exit 1
}
finally {
    # 後始末
    try {
        if (Test-Path $TempDir) { Remove-Item $TempDir -Recurse -Force }
    } catch {}
    Stop-Transcript | Out-Null
}


タスクスケジューラでの自動実行登録

スクリプトを自動で定期実行するため、タスクスケジューラに登録する。

  • PC 起動時に1回実行

次のコマンドを管理者 PowerShell で実行することで、必要なタスクが登録される。
ps1ファイルのフォルダパス($script)の値は各環境に合わせて修正をしてほしい。

$script = 'C:\Scripts\Update-EdgeWebDriver.ps1'

# 起動時に実行
$act1 = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument "-NoProfile -ExecutionPolicy Bypass -File `"$script`""
$trg1 = New-ScheduledTaskTrigger -AtStartup
$set1 = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable
Register-ScheduledTask -TaskName 'Update Edge WebDriver (At Startup)' `
  -Action $act1 -Trigger $trg1 -Settings $set1 -RunLevel Highest -Force

Selenium での起動例(Python / PowerShell)

Python で Edge を起動するサンプル

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.edge.options import Options

driver_path = r"C:\Tools\msedgedriver\msedgedriver.exe"
options = Options()
options.add_argument("--start-maximized")

service = Service(executable_path=driver_path)
with webdriver.Edge(service=service, options=options) as driver:
    driver.get("https://www.example.com")
    print(driver.title)

PowerShell で Edge を起動するサンプル(.NET Selenium)

Add-Type -Path "$env:USERPROFILE\.nuget\packages\selenium.webdriver\*\lib\net48\WebDriver.dll"

$driverPath = "C:\Tools\msedgedriver\msedgedriver.exe"
$svcType = [OpenQA.Selenium.Edge.EdgeDriverService]
$svc = $svcType]::CreateDefaultService((Split-Path $driverPath), (Split-Path $driverPath -Leaf))
$opts = New-Object OpenQA.Selenium.Edge.EdgeOptions
$opts.AddArgument("--start-maximized")

$driver = New-Object OpenQA.Selenium.Edge.EdgeDriver($svc, $opts)
$driver.Navigate().GoToUrl("https://www.example.com")
$driver.Title
$driver.Quit()

ハマりポイントとその対策

トラブル内容 原因と対処方法
Edge と WebDriver のバージョン不一致 スクリプトが自動で完全一致版を取得。レジストリのバージョン取得元を要確認
zip 解凍時にアクセス拒否が出る タスクを「最上位の特権で実行」に設定する
PATH が通っておらず認識されない スクリプトが初回実行時に PATH を自動追加。再起動で反映
32bit 用が必要 $DriverArch = 'win32' に変更すれば32bitドライバも取得可能
プロキシ環境で失敗する Invoke-WebRequest 前に DefaultWebProxy.Credentials を指定すると対応可能

まとめ

msedgedriver.exe のバージョン管理は Selenium ユーザーにとって避けて通れない課題だ。
手動で更新していた手間を自動化することで、テストや自動化処理の安定性が飛躍的に向上する。

本記事で紹介したスクリプトとタスクスケジューラ設定を活用すれば、Edge のバージョンに応じて WebDriver を自動で最新化する仕組みを簡単に構築できる。
特に複数台での運用やCI環境でも役立つ内容となっているため、ぜひ実践に取り入れてほしい。

Selenium 自動化をさらに強化したい方は、ブラウザ自動更新の仕組みと組み合わせて、完全にメンテナンスフリーな環境構築を目指すとよい。

コメント