Help us understand the problem. What is going on with this article?

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

スクリーンショット 2020-07-08 2.53.58.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'

コード

ローカル環境

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

hctasagi
I am おーとめいたー
https://www.humancrest.co.jp
humancrest
「テスト」「開発」に関する情報を発信します!
https://www.humancrest.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away