はじめに
- テストがある日急にコケ始めていてなんでだろうと調べていると、javascriptのコードが取得できていないことが原因だと判明しました
- Jenkinsを使って複数のスレーブマシンでテストを実行していて現象はどのマシンも同じでした
- ブラウザを立ち上げて目視で見てみると、確かにscript部分が効いていない模様
- そこで、キャッシュを全消去してみると、期待通りにscript部分が効いてテストも通るようになりました
- Seleniumに関わらず、古いキャッシュが残っていて最新のfaviconやcssが取得できていないためページが期待通りに表示されないということはたまにあるでしょう
- まさに今回のケースはそれでした
やること
- せっかくSeleniumを使っているのに再発する度に手動でキャッシュクリアなんてのは嫌なので対策を!
- ドライバーの設定を書いているところに以下のようにキャッシュを使わない設定を書く
- この設定を入れたかといってテストの実行速度が著しく遅くなるということはなかったです
features/support/capybara_drivers.rb
...
CAPYBARA_DRIVERS.each do |driver|
Capybara.register_driver driver[:key] do |app|
client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 100
opts = {browser: driver[:browser], http_client: client}
opts[:profile] = Selenium::WebDriver::Firefox::Profile.new
# キャッシュを使わない設定
opts[:profile]['browser.cache.disk.enable'] = false
opts[:profile]['browser.cache.memory.enable'] = false
opts[:profile]['browser.cache.offline.enable'] = false
opts[:profile]['network.http.use-cache'] = false
...
効果確認
- 自前のアプリケーションに対して、簡単なアクセスをするテストを書いてみてサーバログを確認してみた
- キャッシュを無効にした場合は「200 OK」なのに対して、有効にした場合は「304 Not Modified」が所々で出ていることを確認
HTTPステータスコード304について
- ブラウザ側では304を受け取ると、ブラウザ内のキャッシュに残っているコンテンツを使ってWebページを表示する
参考
- https://code.google.com/p/selenium/issues/detail?id=40
- http://stackoverflow.com/questions/16895606/firefox-selenium-webdriver-does-not-load-jquery-from-google-api
~ただの宣伝~
- 全国のSeleniumer必読
- Selenium, SauceLabs, Travis, Jenkinsに関するノウハウ書いているのでよかったら参考にしてみてください