Windows 11で Microsoft Edge の IE モードを自動化するために Selenium を使用する

# はじめに

現在、Windows OS の最新安定版（本稿執筆時点では Windows 11）は、スタンドアロンアプリケーションとしての Internet Explorer をサポートしていません。

しかし、Internet Explorer はまだ死んでいません。

Microsoft Edge ブラウザーの中で Internet Explorer は「IEモード」としてまだ生きています。

ですから、Microsoft Edge の IE モードを Internet Explorer Driver を使って「Selenium」による E2E テストのために自動化する価値はまだ残っています。

Microsoft Edge の IE モードを自動化する方法については、Microsoftの公式ドキュメントもあります。

https://docs.microsoft.com/en-us/microsoft-edge/webdriver-chromium/ie-mode

# 公式ドキュメントだけでは不十分な場合もある...

しかし、公式ドキュメントの手順を確実に実行しても、Selenium で Microsoft Edge ブラウザの IE モードを自動化する際にランタイムエラーが発生する場合があるようです。

私の場合、Windows 11 で C# による Selenium .NET バインディングを使用していますが、以下の2つのステップを追加することで正常に動作させることができました。

- `InternetExplorerOptions` オブジェクトの `IgnoreZoomLevel` プロパティを `true` に設定する。
- すべてのゾーンのローカルグループポリシー `Turn on Protected Mode` を `Enable` に設定する。

以上の詳細について、この記事の次のセクションで説明します。


## ズームレベルを無視する

最初、私が書いた C# のコードは以下のようなものでした。

```csharp
var driver = new InternetExplorerDriver(new InternetExplorerOptions {
  AttachToEdgeChrome = true,
  EdgeExecutablePath = "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe"
});
...
```

上記の C# のコードは、公式ドキュメントのコードと同等です。

しかし、残念ながらエラーに遭遇してしまいました。

前述の通り Selenium .NET バインディングを使用していることから、アプリケーションのコンソールに以下のように未処理の例外メッセージが表示されたのです。

```
Started InternetExplorerDriver server (32-bit)
4.0.0.0
Listening on port 54479
Only local connections are allowed

Unhandled exception. 
System.InvalidOperationException: 
Unexpected error launching Internet Explorer. 
Browser zoom level was set to 175%. It should be set to 100% (SessionNotCreated)
```

例外メッセージには、「ブラウザのズームレベルは100%でなければならないが、そうなっていなかった」と書かれていました。

しかし、ズームレベルを変更したことはなく、その時の Edge ブラウザーのズームレベルはメニューに 100% と表示されていました。

そこで、最終的に、Selenium に強制的にズームレベルを無視させることにしました。

そのためには、`InternetExplorerOptions` オブジェクトの `IgnoreZoomLevel` プロパティを `true` に設定すればよいです。

```csharp
var driver = new InternetExplorerDriver(new InternetExplorerOptions {
  AttachToEdgeChrome = true,
  EdgeExecutablePath = "C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe",
  IgnoreZoomLevel = true // 👈 この行を追加しました。
});
...
```

## IE の "保護モード "をオンにする... Windows11 で!?

残念ながら、上記の1番目のエラーは回避できたものの、2番目のエラーに遭遇してしまいました。

コンソールに以下のようなエラーメッセージが表示されました。

```
Started InternetExplorerDriver server (32-bit)
4.0.0.0
Listening on port 56568
Only local connections are allowed

Unhandled exception. 
OpenQA.Selenium.WebDriverException: 
The HTTP request to the remote WebDriver server for URL http://localhost:56568/session/c81cd23a-2f60-45ae-9636-ebd27fea9c22/url timed out after 60 seconds.
 ---> System.Threading.Tasks.TaskCanceledException: 
 The request was canceled due to the configured HttpClient.Timeout of 60 seconds elapsing.
 ---> System.TimeoutException: The operation was canceled.
```

エラーメッセージは、ブラウザの操作がタイムアウトしたというものでした。
そして、そのエラーメッセージを見てすぐに、このエラーは IE の「保護モード」の設定に関係しているのではないかと、思い至りました。

つまり、IE を自動化する前に、すべてのゾーンで IE の「保護モード」設定を「有効」にしなければならないのです。

その要件は、Selenium の公式ドキュメントにも記載されています。

https://www.selenium.dev/documentation/ie_driver_server/#required-configuration

> 各ゾーンの保護モード設定を同じ値にする必要があります。

そこで、IEの「保護モード」を有効にするために、急ぎ、コントロールパネルから「インターネットのプロパティ」ダイアログを開きました。
しかし、そのダイアログには「保護モードを有効にする」のチェックボックスは存在しませんでした...
なぜなら **Windows 11だからです!**。

<img width="400" src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7nhxc5o7yf8sen1072uw.png"/>

しばらく困惑していましたが、気を取り直して、この問題を解決するためにインターネットで検索を開始しました。

そのうちに、幸いなことに、下記の2016年に書かれた記事に答えが見つかりました。

https://www.urtech.ca/2016/01/solved-how-to-disable-protected-mode-in-internet-explorer-using-gpo/

実は、IE の「保護モード」は、ローカルのグループポリシーで制御することができたのです。

そこで、グループポリシーエディター (`gpedit.msc`) を開き、すべてのゾーンの「保護モード」ポリシーを「有効」に設定し、`gpupdate /force` コマンドを実行して即適用したところ、「保護モード」が「有効」になりました。

![Group Policy Editor](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0z4g86b87f5vc41a5abx.png)

これらをすべて実行したところ、Microsoft Edge の IE モードを自動化している私の C# コードが正常に動作するようになりました。🎉

## おわりに

この記事が、Selenium と IE Driver を使って Microsoft Edge の IE モードを自動化しなければならない開発者の方々の時間短縮になれば幸いです。

_Learn, Practice, Share._ 😊