はじめに
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の指定が必要です。つまりこんな感じ
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問わず動かせる環境ができるということは素晴らしいですね。