小林ノエルのエンジニア的忘備録

フリーランス兼会社員エンジニアが技術とかリモートワークのこととかをツラツラ書いていきます

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

Performance Metrics in a Day with Selenium

java - Selenium get .har file - Stack Overflow