この記事はSelenium/Appium Advent Calendar 2015の2日目の記事です。
薄っすい記事も2日目です!こんにちは!
今度導入予定の社内システムが動作保証環境 Windows 10 って言われてちびりそうです!!
今年7月にリリースされた Windows 10 、Seleniumな人たちが気になっていたのは、新ブラウザー「Edge」ですよね!
Seleniumではいつ扱えるようになるんだろう? とやきもきして待つ間も無く、同じく今年7月リリースの2.47でEdgeDriverが追加されました。早い!
リリース直後くらいに、日本SeleniumユーザーコミュニティのフォーラムにEdgeDriverの概況を流したのですが、そのときの内容をフォローする形でこの記事を書きます。
日本Seleniumユーザーコミュニティに入ると、こういう最新情報の共有ができますよ!(急な宣伝)
Edgeってなに?
Edgeは、Microsoft製の最新ブラウザーです。Windows 10 の標準Webブラウザーになっています。
WebDriver APIに対応しています。これは後付けされた対応ではなく、当初から対応することを見込んで開発されたものです。
Microsoftは既にMSDNにもWebDriverのページを用意しています。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とPythonは既に対応してるっぽいファイルがありますよね…
実際は他の言語でも既に使えるのかどうか、この辺は私は未検証です。
EdgeDriverを利用するときのインスタンス生成コードは次のような感じです。
-
Java
WebDriver driver = new EdgeDriver();
-
C#
IWebDriver driver = new EdgeDriver();
RemoteWebDriver経由で利用することもできます。Capabilitiesに設定するブラウザー名称はMicrosoftEdge
です。
Selenium Gridにも対応しています。リリース当初はWebコンソールでIEのアイコンが代わりに表示されてしまうというなんだか過渡期な感じでしたが、その後 改善したはずです。
EdgeDriverの良いところ
すげー速い
試しに動かしてみると、どうも体感的に他のブラウザーより軽快に動く気がします。
「PhantomJSより速い!」なんて言ってる人もTwitter上で見かけたので、試しにJavaバインディングでベンチマークを取ってみました。
日本Seleniumユーザーコミュニティの提供するサンプルページ上で基本的な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の操作が異常に速い。(実はここは非同期処理でしたーとかだとだいぶ笑えませんが)
体感を裏付ける結果になったと思います。
問題点・微妙な点
未だにマルチバイト文字列のsendKeysが通らない(2016年に解消)
MicrosoftWebDriver.exe
を2016年(8月?)のRelease 14393に更新した後 検証した結果、マルチバイト文字列のsendKeysが動くようになっていることが確認できました。よかったね!!
Selenium IDEのWebDriver-Backedでほとんど動かない
ブラウザー名をMicrosoftEdge
に設定すればopen
とclose
くらいはできるようになるのですが、
今のところ他のコマンドが全然動かないので実用になりません。
デバッグのやり方がよくわかっていなくて、いまいち追いかけ切れていません。次のようなエラーログしか出ないんですよね…
[error] com.google.common.collect.Maps$TransformedEntriesMap cannot be cast to org.openqa.selenium.WebElement
もうクロスブラウザーチェックでSelenium IDE使うのやめよう!(ニコニコ)
薄っすい話なので以上です。
次回も薄っすいの書きます!
Selenium/Appium Advent Calendar 2015はまだまだ薄っすいのも濃ゆいのも募集中です!