この記事は Selenium/Appium Advent Calendar 2018 の6日目の記事です。
こんにちは!
速いのが良いですか!!
速い方が都合が良いんですか!!!
遅いのは...私たちなのかもしれません...
Seleniumが遅いならJSDOMを使えばいいじゃない。
JSDOM
https://github.com/jsdom/jsdom
ガシャーン ガシャーン
DOM描画をしないヘッドレスブラウザーだよ
JavaScriptをV8エンジンでこなしてくれるクソ速いやつだよ
Seleniumじゃないじゃん!
はい。
Seleniumの話をします。
JSDOMにWebDriver APIを提供するラッパー「taxi-rank」
https://github.com/ForbesLindesay/taxi-rank
JSDOMをSeleniumから使えるようになります。これでクソ速くなるよ。
Awesome Selenium にも載ってない知る人ぞ知るやつだよ。
アッアッ 何か「意味無ぇー」とか言ってる声が一部JSerから聞こえてくるようなッ気がッ
そんなことはッたぶんないッ
taxi-rankのうれしいところ
JS以外の言語からJSDOMを使える
JSからJSDOMを直接扱うよりは当然オーバーヘッドが生じますが、他のPythonなどのクライアントライブラリーからJSDOMの高速処理の恩恵にあずかれるようになります。
画面描画のあるブラウザーとの使い分け運用が容易になる
まずJSDOMで試して、だめな場合だけChromeを使って...みたいな使い分けを、ブラウザー自動化コードとしては同じAPIで実現できるようになります。
うまくはまれば、WebDriverベースでも実行時間をかなり短くできるでしょう。
taxi-rankやってみよう
npmでさくっとインストールしましょう。
$ sudo npm install taxi-rank -g
コマンド taxi-rank
を実行すると、WebDriverのコマンドを待ち受けるサーバーが起動します。
既定の待ち受けポートは 9516/tcp です。
$ taxi-rank
listening on http://localhost:9516
この辺をよきにはからってくれるTaxiRankDriverみたいな感じのクライアントライブラリーは、現時点ではtaxi-rankの開発者が別に作っている Cabbie というラッパー以外にありません。今回はかんたんな検証のため、RemoteWebDriverで直接接続して操作します。
driver = webdriver.Remote(command_executor='http://localhost:9516')
driver.get('http://example.selenium.jp/reserveApp/')
# ... ... ...
driver.quit()
ベンチマーク
日本Seleniumユーザーコミュニティの提供するサンプルページ上で基本的なAPIを100回実行して、1回あたりの平均値を取得するだけの簡易ベンチマークをやりました。
https://github.com/hiroshitoda/WebDriverBenchmark.py
実行環境は手元のMacBook Pro実機で、スペックは次の通りです。
CPU | Intel Core i5 2.3GHz |
メモリー | 16Gbytes |
OS | macOS Mojave 10.14.1 |
Python | 3.7.0 |
結果は次の通りでした。
超速い、そらそうよとしか言いようがないですが...
ChromeDriver | FirefoxDriver | taxi-rank | |
webdriver.get | 65ms | 160ms | 15ms |
find_element_by_id | 7ms | 7ms | 2ms |
find_element_by_css_selector | 5ms | 4ms | 2ms |
clear | 47ms | 78ms | 2ms |
send_keys | 47ms | 68ms | 2ms |
click | 31ms | 212ms | 4ms |
taxi-rankのはまりどころ
実戦投入と評価はこれからですが、大事なことをひとつだけ書いておきます。
スクリーンショットを取得できません
そらそうよ。
今回はここまで
次回は...誰かー! 誰か来てくれーーー!!!
Selenium/Appium Advent Calendar 2018はまだまだ君の挑戦を待っているぜ!