IEモードの自動テスト よくある質問・トラブルシューティング集

## はじめに
普段、Seleniumを使って自動テストを作成しています。
Seleniumを使ってIEモードで自動テストを行った際のトラブルシューティングやFAQが日本語で無いので書いてみました。

なお、IEモードの自動テストコードや手順そのものは本記事の対象外です。マイクロソフトが公開している[Edgeのテスト自動化ドキュメント](https://docs.microsoft.com/ja-jp/microsoft-edge/webdriver-chromium/ie-mode)をご参考にして下さい。
マイクロソフトのページに書いていない自動テスト実行時の前提条件は[別の記事](https://qiita.com/satata/items/47e8b2422e9238f1a7ef)に少し記載しているので、良ければ参考にしてください。

また、IEモードそのものの非互換や制限を知りたい場合は、日本マイクロソフトの IE/Edge サポートチームが提供している[IEモードのよくあるご質問](https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/ie-mode-faq/)が個人的に一番オススメです。

## FAQ・トラブルシューティング集
ココから本編です。よくある質問やトラブルを書いていきます。
なお、断りなく「テスト」と記載があった場合は基本的に「自動テスト」を指しています。


### ~~IEモードの自動テストを実行したけど、EdgeがIEモードで起動しないのは何故ですか？~~
~~これは自動テストの開始前にEdgeのプロセスを全部終了していないために発生しています。
SeleniuｍでIEモードを起動する場合は、`msedge.exe`に引数を渡して、強制的にEdgeをIEモードで起動しています。
そのため事前にすべてのmsedge.exeを終了する必要があります。
　コマンド例 : `taskkill /im msedge.exe /f`~~
(2022/04/15追記)
いつからかは不明ですが、終了しなくても大丈夫になったようです。


### IEモードでEdgeが起動したけど、画面の操作が出来ない or Exceptionが出てしまうのは何故ですか？
おそらくSelenium＋IEで自動テストするための端末設定が出来ていないのだと思います。
まずは通常のIEで自動テストが動かせることを確認しましょう。
ちなみにSeleniumを使用してIEで自動テストをする場合、以下の設定が必要です。
- ブラウザの画面倍率が100%
- OSの画面・文字サイズ設定が100%
- インターネットオプション」→セキュリティ タブ→全てゾーンについて、保護モードの有効・無効が同じ設定になっていること（全てのゾーンで無効 or 全てのゾーンで有効）
- インターネットオプション→セキュリティ タブで「拡張保護モード」が無効になっていること


### IEモードの自動テストが失敗しました。どのように切り分ければ良いですか？
まずは通常のIEで、その自動テストが通るか確認してみてください。
通常のIEで実行可能な自動テストでないと、IEモードではまず動作しないと思います。


### WebDriverは何を使えば良いですか？
Edge IEモードでテストを行う場合は、`IEDriverServer`の`4.2.0.0`以上を使用してください。
また、OSが64bitであっても32bit版の方を使用してください。


### 新しく画面やタブを開く操作のあと、ウィンドウやタブを切り替える操作が上手くいきません。
まずは`IEDriverServer`のバージョンが古く無いか確認してください。
`4.2.0.0`より古い場合は、`IEDriverServer`不具合のため複数ウィンドウを切り替えることが出来ません。
もし`4.2.0.0`を使用している場合は、`IEDriverServer`の既知の制限に引っかかっている可能性があります。
MSのドキュメントにある[既知の制限](https://docs.microsoft.com/ja-jp/microsoft-edge/webdriver-chromium/ie-mode?tabs=c-sharp#known-limitations)を参考に待機処理を追加してください。
(2022/06/01追記)
`IEDriverServer`のバージョンを`4.0.0.0`⇒`4.2.0.0`に変更しました。
`4.0.0.0`でも、WindowHandleを正しく取得できないことがありました。

### EdgeでのレンダリングとIEモードでのレンダリングを跨ぐようなシナリオをテスト出来ますか？
出来ません。
Seleniumで自動テストを行うと、全てのタブが強制的にIEモードとなるようなモードでEdgeが起動されます。
そのためEdgeでのレンダリングを挟むシナリオは自動テスト出来ません。


### 実行速度が遅いのですが、どうにかなりませんか？
私の知っている範囲では、どうにもなりません。
これまで遅い遅いと思っていたIEの自動テストより、さらに遅いです。
何か良い方法が無いものでしょうか・・・


### テスト操作の中で`window.open`が実行されるような場合、自動テストの結果が通常のIEと異なってしまいます。
純粋に通常のIEとIEモードの非互換事項である可能性があります。
これはSeleniumのせいではなく、Edge側の仕様に起因するものです。
IEモードで表示中のWebサイトで`window.open`がコールされると、標準のEdge上で`window.open`が実行されます。（詳細は[IE モードのよくあるご質問](https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/ie-mode-faq/#window-open-%E3%81%AB%E3%82%88%E3%82%8B%E5%AD%90%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E6%89%B1%E3%81%84)をご参照ください）
そのため、`window.open`へ指定できるウィンドウスタイルは、Edgeに対して有効なもののみ指定可能です。


### 信頼済みサイトなどの設定は、どのように設定すればよいですか？
Seleniumを使用した自動テストであっても、IEのインターネットオプションに行った設定が採用されます。
ただしポップアップブロックの設定のみEdge側に行う必要があります。
これは先述のようにEdge上で`window.open`が実行されるためです。


### ポップアップブロックが動作して自動テストが失敗してしまいます。
これはEdgeのバグらしいです。（2022/2/9時点）
[Edgeチームが対応する](https://github.com/MicrosoftDocs/edge-developer/issues/1674)そうです。
`--disable-popup-blocking`というオプションがSeleniumのテスト時に効かないのが問題だそうで。
現段階で自動テストを行う場合は、まずEdge側に対象URLでのポップアップの許可設定を行います。
その後、端末・ブラウザ側の設定を行い、自動テスト時においても先ほど許可設定を行ったユーザープロファイル（OSではなく、ブラウザの方）を使用するようにします。
（2022/04/15追記）
インターネットオプションから以下の2点を設定しても大丈夫になるようです。
- 「プライバシー」タブの「ポップアップブロックを有効にする」のチェックを外す
- 「セキュリティ」タブの「レベルのカスタマイズ」から、「ポップアップブロックの使用」を「無効にする」に設定する


## おわりに
ポップアップブロックの件もあるように、まだ多少IEモードの自動テストには不具合がありそうですね。
それでもChromium版Edgeのリリース直後である2020年1月に比べると、ようやく自動テスト出来るようになってきたかぁって感じです。
（個人の感想です）

また何か気づくことがあったら、追加しようと思います。