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

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'

コード

ローカル環境

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

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を指定する時、

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でテストする場合は、

DesiredCapabilities capabilities = DesiredCapabilities.edge();
capabilities.setPlatform(Platform.MAC);

と書き足しましょう。

注意点2

driver.getCapabilities().getBrowserName();

の戻り値は msedge です。

DesiredCapabilities.edge().getBrowserName()

の戻り値は、MicrosoftEdgeです。

そう、違う!のです
それ必要??という情報かもしれませんが、、
いままでブラウザ毎の特殊処理を入れてる箇所の判定で、


if (ブラウザ名) then

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

補足

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

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問わず動かせる環境ができるということは素晴らしいですね。