Seleniumの薄っすい話2:俺とEdgeDriver

この記事は[Selenium/Appium Advent Calendar 2015](http://qiita.com/advent-calendar/2015/selenium)の2日目の記事です。

薄っすい記事も2日目です！こんにちは！
今度導入予定の社内システムが動作保証環境 Windows 10 って言われてちびりそうです！！

今年7月にリリースされた Windows 10 、Seleniumな人たちが気になっていたのは、新ブラウザー「Edge」ですよね！
Seleniumではいつ扱えるようになるんだろう？ とやきもきして待つ間も無く、同じく[今年7月リリースの2.47でEdgeDriverが追加されました](https://github.com/SeleniumHQ/selenium/commit/0e4837e94b1fad0db93e88cd972ed3e235a22892)。早い！

リリース直後くらいに、[日本SeleniumユーザーコミュニティのフォーラムにEdgeDriverの概況を流した](https://groups.google.com/forum/#!topic/seleniumjp/hPV3WxP0wDc)のですが、そのときの内容をフォローする形でこの記事を書きます。
日本Seleniumユーザーコミュニティに入ると、こういう最新情報の共有ができますよ！（急な宣伝）

# Edgeってなに？

Edgeは、Microsoft製の最新ブラウザーです。Windows 10 の標準Webブラウザーになっています。
WebDriver APIに対応しています。これは後付けされた対応ではなく、当初から対応することを見込んで開発されたものです。

Microsoftは既に[MSDNにもWebDriverのページを用意しています](https://msdn.microsoft.com/ja-jp/library/mt188085(v=vs.85).aspx)。WebDriver APIに対応したプロプライエタリなブラウザーの良い事例として、うまく育ってほしいと思います。

# EdgeDriverやってみよう

SeleniumでGoogle Chrome/Chromiumを操作するときに、ChromeDriverサーバーを仲介役として併用しますね。
Edgeを操作するときも同様に、MicrosoftWebDriverサーバーを仲介役として併用する必要があります。

MicrosoftWebDriverサーバーは、MicrosoftのWebDriver紹介ページ経由で入手しましょう。歴代のバージョンへのリンクが掲載されています。
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
古いリリースバージョンもダウンロード可能ですが、もはや役には立たないので、Release 14393以降の最新の `MicrosoftWebDriver.exe` をダウンロードして、適当な場所に配置しましょう。EdgeDriverを利用するときは、配置した場所にPATHを通すか、ファイルパスをシステムプロパティ `webdriver.edge.driver` に設定する必要があります。

EdgeDriverの公式バインディングは現状JavaとC#とJavaScriptのみ対応、と書かれていることが多いのですが、[Ruby](https://github.com/SeleniumHQ/selenium/tree/master/rb/lib/selenium/webdriver/edge)と[Python](https://github.com/SeleniumHQ/selenium/tree/master/py/selenium/webdriver/edge)は既に対応してるっぽいファイルがありますよね…
実際は他の言語でも既に使えるのかどうか、この辺は私は未検証です。
EdgeDriverを利用するときのインスタンス生成コードは次のような感じです。

* Java

    ```java
    WebDriver driver = new EdgeDriver();
    ```

* C#

    ```csharp
    IWebDriver driver = new EdgeDriver();
    ```

RemoteWebDriver経由で利用することもできます。Capabilitiesに設定するブラウザー名称は`MicrosoftEdge`です。

Selenium Gridにも対応しています。リリース当初はWebコンソールでIEのアイコンが代わりに表示されてしまうというなんだか過渡期な感じでしたが、その後 改善したはずです。

# EdgeDriverの良いところ

## すげー速い

試しに動かしてみると、どうも体感的に他のブラウザーより軽快に動く気がします。
「PhantomJSより速い！」なんて言ってる人もTwitter上で見かけたので、試しにJavaバインディングでベンチマークを取ってみました。
[日本Seleniumユーザーコミュニティの提供するサンプルページ](http://example.selenium.jp/reserveApp/)上で基本的なAPIを100回実行して、1回あたりの平均値を取得するだけの簡易ベンチマークです。
https://github.com/hiroshitoda/WebDriverBenchmark

実行環境のスペックは次の通りで、クラウドではなく手元の実機を使いました。

|||
|:--|:--|
|CPU|Intel Xeon E3-1220 3.10GHz|
|メモリー|16Gbytes|
|OS|Windows 10 Pro 64bit|
|JDK|1.8.0_66-b18|

結果は次の通りでした。

||ChromeDriver|FirefoxDriver via GeckoDriver|PhantomJSDriver|EdgeDriver|
|:--|--:|--:|--:|--:|
|WebDriver.get|253ms|（検証中）|43ms|85ms|
|WebDriver.findElement(By.Id)|8ms|（検証中）|5ms|2ms|
|WebDriver.findElement(By.cssSelector)|7ms|（検証中）|5ms|14ms|
|WebElement.clear|21ms|（検証中）|21ms|2ms|
|WebElement.sendKeys|33ms|（検証中）|31ms|9ms|
|WebElement.click|30ms|（検証中）|39ms|2ms|
|TakeScreenshot.getScreenshotAs|110ms|（検証中）|41ms|46ms|

「PhantomJSより速い！」というのはあながち間違いでもない感じですね。
特にWebElementの操作が異常に速い。（実はここは非同期処理でしたーとかだとだいぶ笑えませんが）
体感を裏付ける結果になったと思います。

# 問題点・微妙な点

## <strike>未だにマルチバイト文字列のsendKeysが通らない</strike>（2016年に解消）

<strike>
リリース後の検証時、真っ先に気になったところだったのですが、本記事の記載時点でも解決していません。
sendKeysで、Unicodeのマルチバイト領域の文字を引数に渡すと死にます。
和文がダメならまだ話は分かりますが、ウムラウトとか非ASCIIのラテン文字も通らないので世界的にどうにもなってない人の方が多いはずです。みんなもっと怒って！！
</strike>

`MicrosoftWebDriver.exe` を2016年（8月？）のRelease 14393に更新した後 検証した結果、マルチバイト文字列のsendKeysが動くようになっていることが確認できました。よかったね！！


## Selenium IDEのWebDriver-Backedでほとんど動かない

ブラウザー名を`MicrosoftEdge`に設定すれば`open`と`close`くらいはできるようになるのですが、

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/33963/2e8598af-ebe6-31d9-a854-2c5da2c14e6b.png)

今のところ他のコマンドが全然動かないので実用になりません。
デバッグのやり方がよくわかっていなくて、いまいち追いかけ切れていません。次のようなエラーログしか出ないんですよね…

```
[error] com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement
```

もうクロスブラウザーチェックでSelenium IDE使うのやめよう！（ニコニコ）

# 薄っすい話なので以上です。

次回も薄っすいの書きます！
[Selenium/Appium Advent Calendar 2015](http://qiita.com/advent-calendar/2015/selenium)はまだまだ薄っすいのも濃ゆいのも募集中です！