Seleniumでパフォーマンステスト
Seleniumを使ったパフォーマンステストについて書きます。
何をテストするのか
一番重要なのがこれですね。結局何をテスト(計測)したいのかが重要です。プロジェクトによって様々だと思いますが、今回は
- ページのロード時間(表示、もっと言うとonloadまでに何秒かかてるのか)
- コンテンツの個数(HTTPリクエストの数は少なければ少ないほどいいというスタンスで計測)
- 各コンテンツがキャッシュされているか
- CloudFrontからの配信か
- Expiresヘッダがついているか
どうやってやるのか
harファイルを生成して、各種コンテンツごとのtimingを図る
seleniumをつかってharファイルを生成するにはいくつかの手法があるみたいでした。(参考リンク参照) 今回はBroserMob Proxyを使う方法にしました。 理由としては。。。 - 一番実装が楽そうだった - プロキシなので、ドライバに依存しない実装ができる
ということで、以下の様な構成でやってみました。 - Scala - Selenium - BroserMob Proxy
実装コード
そのうち書くかも
BroserMob Proxyがデフォルトでキャプチャするもの
println(proxy.getHarCaptureTypes()) # -> [REQUEST_COOKIES, RESPONSE_COOKIES]
ということで、デフォルトだと上記2つのものしかキャプチャしてくれないので、とりあえず必要なものを追加します。追加する場合はjava.Set
型で定義した変数をproxyのインスタンスに渡してあげます。
val captureTypes = Set(CaptureType.REQUEST_HEADERS, CaptureType.REQUEST_COOKIES, CaptureType.REQUEST_CONTENT,
CaptureType.RESPONSE_HEADERS, CaptureType.RESPONSE_COOKIES).asJava
proxy.setHarCaptureTypes(captureTypes)
println(proxy.getHarCaptureTypes())
# -> [REQUEST_HEADERS, REQUEST_COOKIES, REQUEST_CONTENT, RESPONSE_HEADERS, RESPONSE_COOKIES]
DomContentLoadedとLoadの時間をJSで取る
Load(onLoad)
の時間はBrowserMob Proxyがとってくれますが、DomContentLoaded(onContentLoad)
の時間はBrowserMob Proxyではとってくれないようです(
https://github.com/webmetrics/browsermob-proxy/issues/30:参考)。リンク先の回答にあるように、BrowserMob Proxyを使っている場合はJSでNavigation Timing APIを使ってonContentLoad
を取得する必要がありそうです。
それぞれの取得の計算式は
var onContentLoad = window.performance.timing.domContentLoadedEventEnd - window.performance.timing.navigationStart var onLoad = window.performance.timing.domComplete - window.performance.timing.navigationStart
onLoad
も記載してありますが、自分でセットするのはonContentLoad
のほうのみです。
上記をChromeのDeveloper ConsoleのNetworkタブで表示された値と、Javascript Consoleに打ち込んでみた時に、onLoad
は同じ値が出ますが、onContentLoad
はNetworkタブに表示されているDomContentLoaded
とは微妙に違う値が表示されます。なので上記で取得できるonContentLoad
は正確ではありませんが、試した中では一番近い値でした。あくまで1つの参考数値として考えるのがよいでしょう。
参考URL
Selenium WebDriver — Selenium Documentation
Creating and running a simple Selenium WebDriver test | Wunder