【正式版】Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす（IEモードもできるよ♪）

# はじめに
以前こんな記事を書きました：
[【α版】Selenium4のEdgeDriverでChromium版MicrosoftEdgeを動かす](https://qiita.com/yk109/items/41bf80a309bf20d5f1e6)

が、ついに[Selenium4が正式リリースされた](https://www.selenium.dev/blog/2021/announcing-selenium-4/)ので改めて整理しなおしてみました！
※動かせた時の感動は省略
※実際、α版と比べるとコーディングはガラッと変わってます

# やったこと
## `Chromium版MicrosoftEdge`の取得
[こちら](https://www.microsoft.com/en-us/edge?icid=SMC-IA-4501095)からダウンロード＆インストール

## NuGet
`Selenium`系の参照
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/d3a21b17-69e2-c7e4-17ae-4d5ab3447afb.png)

### 注意
+ お手元の `Edge` のバージョンに対応した `driver` を取得する必要があります。
  - MsEdgeでこのURLを叩けばOK：[edge://settings/help](edge://settings/help)
  - より高いバージョンのEdge（β版など）を動かしたい場合は[こちら](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)から`msedgedriver`をダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/9dce3764-8248-66fd-572f-2e5799f81cfd.png)

## ソース
[以前書いた記事](https://qiita.com/yk109/items/41bf80a309bf20d5f1e6#%E3%82%BD%E3%83%BC%E3%82%B9)と比較すると、より自然な実装ができるようになりました。嬉しい！
ヘッドレスモードも画面ショットも問題ないですよ！

```csharp
// Headlessモードはこんな感じ：
// var options = new EdgeOptions();
// options.AddArgument("--headless");
// using (var driver = new EdgeDriver(options))

using (var driver = new EdgeDriver())
{
    var wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));

    driver.Navigate().GoToUrl("https://www.google.com");

    var q = driver.FindElement(By.Name("q"));
    q.SendKeys("Chromium");
    q.Submit();

    wait.Until(ExpectedConditions.TitleIs("Chromium - Google 検索"));
    ((ITakesScreenshot)driver).GetScreenshot().SaveAsFile($"{DateTime.Now:yyyyMMddHHmmss}.png");
}

```

本来`EdgeDriver`クラスはレガシーEdge用で、
α版時点では`EdgeOptions.UseChromium`を指定する必要があったのですが、

```cs
namespace OpenQA.Selenium.Edge
{
    public class EdgeDriver : ChromiumDriver
}
```
てな具合で`EdgeDriver`はChromium版Edge専用クラスと生まれ変わったようです。

# IEモード
IEモードについては以下の通りです。
## NuGet
`IEDriver`が必要なんですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/d41ed5fd-f1e1-4459-949a-1cf41285003a.png)

## ソース
```cs
var options = new InternetExplorerOptions
{
    AttachToEdgeChrome = true,
    EdgeExecutablePath = @"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
};

using (var driver = new InternetExplorerDriver(options))
{
    // 略
}
```

こんな感じでアドレスバーにIEマークが表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/a994af30-6c72-6e9a-bfe8-97dc1678f0c1.png)

## 注意点
+ IEの事前設定が必要です（Seleniumあるある）
  - 拡大率を100%にしましょう
  - インターネットオプション → セキュリティですべてのゾーンで「☑保護モードを有効にする」をしましょう
+ ~~`msedge` のプロセスが既に動作しているときに実行するとIEモードで動いてくれません~~
  - ~~実行時は`msedge`のプロセスをKILLしましょう~~
__<font color='red'>`IEDriverServer.exe` のバージョン `4.0.0` で現象が改善されることを確認しました。</font>__
※もともと、`msedge` のプロセスが存在する状態で実行すると「This is the initial start page for the WebDriver server.」と表示されたまま動かず、タイムアウトしてしまう現象が発生していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/432322/9a0ff743-073b-2ef9-90f2-559bcb782a5f.png)


## 以前までは…
こちらの記事の通りにコーディングすると動きましたが、正式版では実行時エラーとなります：
[Seleniumを使ってChromium版EdgeのIEモードを動かしてみた](https://qiita.com/satata/items/47e8b2422e9238f1a7ef)

# 気づいたこと
こんな変更があったりするので、バージョン上げるときは要注意です。

```cs
// Before ビルドエラー
var q = driver.FindElementByName("q");
// After
var q = driver.FindElement(By.Name("q"));
```
詳細はこちら：[How to upgrade to Selenium 4](https://www.selenium.dev/documentation/getting_started/how_to_upgrade_to_selenium_4/?utm_source=pocket_mylist)

# おわりに
Seleniumさん、引き続きよろしくな！