Seleniumを使ってChromium版EdgeのIEモードを動かしてみた

## 更新（2022年2月9日）
SeleniumでIEモードの自動テストを実装する際に、よくある質問やトラブルについてまとめた記事を書きました。
何かお困りのことがあり、このページにたどり着いたようでしたら、こちらの記事をご覧になってみてください。

https://qiita.com/satata/items/30d66a023879bb959538


## 更新（2021年11月25日、2022年5月11日 微修正）
Microsoftから公式のIEモードテスト手順が公開されました。
C#, Java, Python, JavaScriptのコードサンプルと既知の制限事項が記載されています。
https://docs.microsoft.com/ja-jp/microsoft-edge/webdriver-chromium/ie-mode

ただMSのページには記載がありませんが、テストにあたっては以下が前提条件となります。
IEモードでSeleniumの自動テストが出来ない方がいらっしゃいましたら試してみてください。

- 前提条件
 - 通常のIEでSeleniumからテスト出来る状態になっていること
     - 後述している「IEの設定」を事前に済ませる必要あり
     - IEモードでの自動テスト前に、純粋なIEでコードが動くことを確認した方が良い
 - ~~IEモードのテスト前に全てのEdgeのプロセスを終了させること~~
 （2022年5月11日追記）いつからかは不明ですが、終了しなくても大丈夫になったようです。
      - ~~コマンドプロンプトから `taskkill /im msedge.exe /f` などをテスト実行前に行う~~

- IEの設定
    - ブラウザの倍率が100%
    - OSの画面サイズ設定が100%
    - インターネットオプション→セキュリティ タブ→全てゾーンについて、保護モードの有効・無効が同じ設定になっていること
    - インターネットオプション→セキュリティ タブで「拡張保護モード」が無効になっていること

以下の記事はChromiumベースのEdgeがリリースされ、SeleniumからIEモードが操作できるようになった直後に書いたものです。
現在はSelenium 4がリリースされ、IEDriverserverも4.0.0.0まで上がっています。
参考程度と思っていただければ幸いです。

----
普段、Seleniumを使って自動テストを作成しています。
Seleniumを使ってEdgeのIEモードで自動操作するための情報が、日本語であまりないので書いてみました。
なお、サンプルコードは[Microsoft Edge Blog](https://blogs.windows.com/msedgedev/2019/11/04/edge-chromium-release-candidate-get-ready/)を参考にしています。
また、IEモードやSeleniumについて知りたい方は、参考に記載したURLを確認してみてください。

## 環境
|名前 | バージョン等|
|--- | ---|
|OS | Windows 10 pro for Workstations|
|ブラウザ | Edge  84.0.522.20 (公式ビルド) beta (64 ビット)|
|言語 | C# (.NET Framework 4.6.1)|
|IDE | Visual Studio 2017|
|WebDriver | The Internet Explorer Driver Server 3.150.1|
|Selenium.Support | 3.141.0|
|Selenium.WebDriver | 3.141.0|
|Selenium.WebDriverBackedSelenium | 3.141.0|
Edgeのバージョン84からしか動作しませんでした。
個人的には、84でもまだ動作が怪しい気がします（感想）

## 手順
### 1. Chromium版Edgeのインストール
試してみたところ、Edgeのバージョン84以上でないとIEDriverが異常終了しました。
2020/6/24現在、Edgeバージョン84を使用する場合は、Betaチャンネルをインストールする必要があります。
ちなみに、チャンネルを選んでインストールする場合は、[こちら](https://www.microsoft.com/ja-jp/edge/business/download)からダウンロードできます。

### 2. IE用WebDriverのDL
IEDriverServer(The Internet Explorer Driver Server)の3.150.1をSelenium HQの[Downloads](https://www.selenium.dev/downloads/)ページから入手します。
OSが64bitであっても、32 bit Windows IEを選んでください。

### 3. コンソールアプリケーションの作成
今回は、コンソールアプリケーションを使用しました。
Visual Studio操作の詳細は割愛します。

### 4. SeleniumクライアントとWebDriver言語バインディングの設定
Visual StudioのNuGetを使用して、SeleniumクライアントとWebDriver言語バインディングを用意します。
`NuGetパッケージの管理`から以下のパッケージを取得します。
- Selenium.Support: 3.141.0
- Selenium.WebDriver: 3.141.0
- Selenium.WebDriverBackedSelenium: 3.141.0

### 5. 自動テスト操作の実装
コンソールアプリケーションを使って簡易的に動かしてみました。
**ただし自動テストの実行前にChromium版Edgeが実行中でないか、通知領域とタスクマネージャーを使用して必ず確認してください。**
- SeleniumのからIEモードで自動テストを実行する際には、Edge起動時に強制的にIEモードで動作させる引数を使用している模様。
- そのためIEモードでないEdgeが実行中だと、IEモードのテストが実行できない。
- もし実行中だった場合は、通知領域やタスクマネージャーから終了させる。

サンプルコードです。
WebDriverのフォルダパスやEdgeのインストールフォルダは、環境に合わせて適宜変更してください。

``` C#
// WebDriverの情報
var dir = "C:\\SeleniumTest\\WebDrivers";
var driver = "IEDriverServer.exe";
if (!Directory.Exists(dir) || !File.Exists(Path.Combine(dir, driver)))
{
    Console.WriteLine("Failed to find {0} in {1} folder.", dir, driver);
    Environment.Exit(1);
}

var ieService = InternetExplorerDriverService.CreateDefaultService(dir, driver);
var ieOptions = new InternetExplorerOptions { };
// EdgeのIEモードで起動するかIEを起動するか(true: EdgeのIEモード）
ieOptions.AddAdditionalCapability("ie.edgechromium", true);
// Edgeのインストールフォルダを記述する
ieOptions.AddAdditionalCapability("ie.edgepath", "C:/Program Files (x86)/Microsoft/Edge Beta/Application/msedge.exe");
// Seleniumの操作時にWindowsのフォーカスを奪うか（デフォルト:false。お好みで。）
ieOptions.RequireWindowFocus = true;

// WebDriverの起動
var webdriver = new InternetExplorerDriver(ieService, ieOptions, TimeSpan.FromSeconds(30));

// テスト対象のWebサイト
var testUrl = "http://localhost:6060/tutorial/samples/userRegister.html?_lang=ja";
// テスト対象URLへ遷移する
webdriver.Url = testUrl;
// テスト操作
webdriver.FindElementByCssSelector("#userId").SendKeys("test");
webdriver.FindElementByCssSelector("#email").SendKeys("test.shitaro@sample.com");
webdriver.FindElementByCssSelector("#password").SendKeys("PasswordDesu");
webdriver.FindElementByCssSelector("#register").Click();
            
webdriver.Close();
Environment.Exit(0);
```

実行するとこんな感じで動きます。
アドレスバー横に出ているIEロゴが、IEモードで動いている証拠です。
![IEMode_Test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652816/f5d02258-9266-ce39-a693-f6592a308672.gif)



## 感想
昨日、我が家のPCがChromium版Edgeに自動更新されたので記念にやってみました。
Chromium版Edgeの公開から何度かIEモードでの動作を試してみましたが、ようやくそれっぽい操作ができました。
ただ、Seleniumからの操作は、まだちゃんと動いていないのでは？と思う部分も見受けられました。
例えば、Seleniumから操作してサブウィンドウを開いたときに、開いたページの情報（WindowHandles）が取得できませんでした。（なんというかIEのテストで保護モードの設定が間違ってた場合に似てますね）

安心してテストに使えるのは、もしかしたら、もう少し先かもしれません。
（個人の感想です）

## 参考
- [IEモード概要](https://docs.microsoft.com/ja-jp/deployedge/edge-ie-mode)
- [Getting your sites ready for the new Microsoft Edge(Microsoft Edge Blog)](https://blogs.windows.com/msedgedev/2019/11/04/edge-chromium-release-candidate-get-ready/)
- [Selenium HQ](https://www.selenium.dev/)