SeleniumでMacのEdge(Chromium版)を動かす


## はじめに

2020/06 ついにChromium版のEdgeがWindowsアップデートでできるようになりましたね。
最近、E2E自動テストにおいて、IEを含める依頼はめっきり減ってきました。
一日でも早く
**「自動テストをやりたい（E2Eね）」 → 「InternetExplorerで 」**
という流れが世の中からなくなれば良いと思っています。
代わり増えてきたのが、**Edge**です。

ではChromium版のEdgeをMacOSで動かします


## 開発環境とか
#### OS

```
% sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.5
BuildVersion:	19F101
```

#### java
```
% java -version
openjdk version "11.0.7" 2020-04-14 LTS
OpenJDK Runtime Environment Corretto-11.0.7.10.1 (build 11.0.7+10-LTS)
OpenJDK 64-Bit Server VM Corretto-11.0.7.10.1 (build 11.0.7+10-LTS, mixed mode)
```
#### Edge
<img width="767" alt="スクリーンショット 2020-07-08 2.53.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665079/9aeb8ca2-3a72-17a6-ab28-4a40b5b6ff12.png">



**build.gradle**

```
// https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.141.59'
// https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager
compile group: 'io.github.bonigarcia', name: 'webdrivermanager', version: '4.0.0'
```

## コード

### ローカル環境

```java
public class SeleniumTestEnv {

    private WebDriver driver;

    @BeforeClass
    public static void beforeClass() throws Exception {
        WebDriverManager.edgedriver().setup();
    }

    @Before
    public void setUp() throws Exception {
        driver = new EdgeDriver();
    }

    @After
    public void teardown() {
        if (driver != null) {
            driver.quit();
        }
    }

    @Test
    public void test001() {
        driver.get("https://www.humancrest.co.jp");
        //Test Code
    }

}

```
よく目にするソースですがなにも考えず、これで動きます。楽勝ですね。
Windowsでも当然動きます

### Selenium Grid
```java
public class SeleniumTestEnvRemote {

    private RemoteWebDriver driver;

    @Before
    public void setUp() throws Exception {
//        Capabilities capabilities = DesiredCapabilities.edge();
        MutableCapabilities option = new EdgeOptions();
        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), option);
    }

    @After
    public void teardown() {
        if (driver != null) {
            driver.quit();
        }
    }

    @Test
    public void test001() {
        driver.get("https://www.humancrest.co.jp");
        String title = driver.getTitle();
        String browserName = driver.getCapabilities().getBrowserName();
        assertThat(title,is( "ヒューマンクレストグループ"));
        assertThat(browserName,is("msedge"));
    }
}
```

## 解説
ソース上で言えば、Chromium版になったからと言って、特別に書き換える必要はありません。
今までEdge用に書いたソースは動きますし、`MacOS`にインストールしたEdgeでも同様に動きます。

 注意点を以下に。。

### 注意点1
RemoteWebDriverで、Edgeを指定する時、

```java
DesiredCapabilities capabilities = DesiredCapabilities.edge();
```
と書いた場合、Windows用になります。
MacOSに立てた`Selenium  Grid/hub`のLogには、
>Error forwarding the new session cannot find : Capabilities {browserName: MicrosoftEdge, platform: WINDOWS, version: }

というエラーを吐きます
どうやら無条件で、`platform: WINDOWS`と設定されるようです。
ですので、Mac側のEdgeでテストする場合は、

```java
DesiredCapabilities capabilities = DesiredCapabilities.edge();
capabilities.setPlatform(Platform.MAC);
```
と書き足しましょう。

### 注意点2
```java
driver.getCapabilities().getBrowserName();
```
の戻り値は  `msedge` です。

```java
DesiredCapabilities.edge().getBrowserName()
```
の戻り値は、`MicrosoftEdge`です。

そう、<font color="Red">違う!</font>のです
それ必要？？という情報かもしれませんが、、
いままでブラウザ毎の特殊処理を入れてる箇所の判定で、

```java

if (ブラウザ名) then
```

などど書いてませんか？？ 
私の場合、少なからずそういう過去の遺産があり、どうしても動かない理由が、、これでした。


## 補足
当たり前の事なのですが、Selenium Grid のノードを立ち上げる際、必ずwebdriverの指定が必要です。つまりこんな感じ

```bash:forMacOS
java -jar -Dwebdriver.edge.driver="msedgedriver" selenium-server-standalone-3.141.59.jar -role node -nodeConfig node_config.json
```
私の場合、横着してselenium-server-standalone-xxx.jarと同じフォルダ内に各ブラウザのwebdriverを配置。
そうすればwebdriver指定しなくても問題なくNodeは役割を果たしてくれました。
しかし、Chromium版Edgeは、webdriverの指定は必須です。
（おそらく、MicrosoftWebDriver.exe をデフォルトで参照しに行くような動きをしています。ブラウザだけ起動して、URLが入らず止まってしまう）


## 最後に
これで、MacOSにインストールしたEdgeもテスト可能になるはずです。
（大したこと書いてませんがww）

Windowsの話になりますが、
Microsoft Edge Legacyは、IEまでとはいいませんが、やはり少し癖があり、100%同じソースで動かすことはできませんでした。
しかし、Chromium版は、Chromeとほぼ同じソースで動いています。

E2Eのテスト自動化エンジニアにとって、Chrome・Firefox・EdgeがOS問わず動かせる環境ができるということは素晴らしいですね。