Webアプリケーションの自動テストをSeleniumで実施する際、ブラウザのキャッシュ機能が原因でテスト結果が不安定になることがあります。
最新のUI変更が反映されなかったり、過去の認証情報が残っていたりすることで、正しく動作確認ができないケースは少なくありません。
特に開発頻度が高いプロジェクトでは、古い静的ファイルがブラウザに保持されることで、バグの検出が遅れるリスクも存在します。
本記事では、PythonとSeleniumを組み合わせてブラウザのキャッシュを完全に無効化し、クリーンな状態でテストを実行するための具体的な手法を詳しく解説します。
2026年現在のブラウザ仕様に基づいた最適な設定方法をマスターし、信頼性の高い自動テスト環境を構築しましょう。
Seleniumでキャッシュを無効化すべき理由
Webブラウザのキャッシュ機能は、本来ユーザーの利便性を向上させ、ページの読み込み速度を高速化するための優れた仕組みです。
しかし、自動テストのコンテキストにおいては、このキャッシュ機能がテストの再現性を損なう大きな要因となります。
例えば、CSSやJavaScriptファイルがキャッシュされていると、サーバー側でコードを更新した直後でも、ブラウザが古いファイルを使用し続けてしまいます。
これにより、本来修正されているはずの表示崩れが再現したり、新しい機能が動作しなかったりする問題が発生します。
また、セッション情報やCookieのキャッシュが残っていると、ログイン状態が引き継がれてしまい、ログアウト状態からのテストケースが正常に実行できません。
「特定の環境でのみテストが失敗する」という事象の多くは、このキャッシュ管理の不備に起因しています。
テストの品質を担保するためには、常にブラウザを初期状態で起動し、キャッシュの影響を排除する設定が不可欠です。
ChromeOptionsを使用したキャッシュ無効化の基本
Google Chromeをテストに使用する場合、ChromeOptionsクラスを利用して起動引数を指定するのが最も手軽な方法です。
SeleniumのWebDriverを初期化する際に、特定のフラグを渡すことでキャッシュの挙動を制御できます。
起動引数によるキャッシュ制限
Chromeにはキャッシュを無効化するためのコマンドラインスイッチがいくつか用意されています。
代表的なものとして、--disable-cacheがあります。
このオプションを指定することで、ページ読み込み時のディスクキャッシュを抑制する効果が期待できます。
以下のコードは、Pythonでこのオプションを設定する最小構成の例です。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
# ChromeOptionsのインスタンスを作成
options = Options()
# キャッシュを無効化する引数を追加
options.add_argument("--disable-cache")
# ディスクキャッシュのサイズを最小に制限する設定
options.add_argument("--disk-cache-size=1")
options.add_argument("--media-cache-size=1")
# WebDriverの起動
driver = webdriver.Chrome(options=options)
# テスト対象のサイトへアクセス
driver.get("https://example.com")
# ブラウザを閉じる
driver.quit()
シークレットモード(Incognito)の活用
キャッシュの影響を最も確実に排除する方法の一つが、シークレットモードでの実行です。
シークレットモードでは、ブラウザを閉じるたびに閲覧履歴やCookie、キャッシュデータが破棄されます。
テスト開始ごとに新しいセッションが作成されるため、クリーンな環境を維持するのに非常に適しています。
シークレットモードを有効にするには、--incognito引数を使用します。
options = Options()
# シークレットモードを有効化
options.add_argument("--incognito")
driver = webdriver.Chrome(options=options)
Chrome DevTools Protocol (CDP) を活用した高度な制御
起動引数だけでは、一部の動的なキャッシュやService Workerによるキャッシュを完全に防げない場合があります。
そこで、Selenium 4からより強化されたChrome DevTools Protocol (CDP)の直接操作を利用します。
CDPを使用すると、ブラウザのネットワークスタックに対して、キャッシュを無視するように直接命令を下すことが可能です。
Network.setCacheDisabled を実行する
CDPの「Network」ドメインにあるsetCacheDisabledコマンドを使用すると、開発者ツールの「Disable cache」チェックボックスをオンにしたのと同じ状態になります。
これにより、ページ内のすべてのリソースリクエストでキャッシュがバイパスされます。
以下にその実装方法を示します。
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
driver = webdriver.Chrome(options=options)
# CDPコマンドを実行してネットワークキャッシュを無効化
driver.execute_cdp_cmd("Network.setCacheDisabled", {"cacheDisabled": True})
# ページへのアクセス(この後のすべてのリクエストでキャッシュが無効になる)
driver.get("https://example.com")
CDPを利用するメリット
CDPを利用する最大のメリットは、テストの実行途中でキャッシュの有効・無効を切り替えられる点にあります。
例えば、「最初はキャッシュありで読み込み速度を確認し、その後キャッシュなしで整合性を確認する」といった高度なテストシナリオにも対応可能です。
また、特定のURLパターンのみキャッシュを無効化するといった柔軟な運用も、CDPのネットワークインターセプト機能を併用することで実現できます。
Firefoxにおけるキャッシュ無効化の設定
Chromeだけでなく、Firefoxを用いたマルチブラウザテストにおいてもキャッシュ管理は重要です。
Firefoxの場合は、FirefoxOptionsを通じて「プロファイルの設定(prefs)」を書き換える手法が一般的です。
Firefoxの内部設定(about:config)の変更
Firefoxにはbrowser.cache.disk.enableやbrowser.cache.memory.enableといった、キャッシュの挙動を司る内部パラメータが存在します。
これらを「False」に設定することで、物理メモリやディスクへのキャッシュ保存を停止できます。
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
firefox_options = Options()
# ディスクキャッシュの無効化
firefox_options.set_preference("browser.cache.disk.enable", False)
# メモリキャッシュの無効化
firefox_options.set_preference("browser.cache.memory.enable", False)
# オフラインキャッシュの無効化
firefox_options.set_preference("browser.cache.offline.enable", False)
# HTTPキャッシュの無効化
firefox_options.set_preference("network.http.use-cache", False)
driver = webdriver.Firefox(options=firefox_options)
Firefoxのテストにおいて動作が不安定な場合は、これらの設定を一つずつ確認し、不要なデータ保持を極限まで減らしてみてください。
ブラウザ操作中にキャッシュをクリアするテクニック
ブラウザの起動設定だけでなく、テストスクリプトの実行中に明示的にデータを削除したい場面もあります。
例えば、大量のテストケースを一つのセッションで連続実行する場合、定期的にクリーニングを行わないとメモリ使用量が増大し、ブラウザがクラッシュする原因になります。
Cookieとストレージの削除
キャッシュとは厳密には異なりますが、Cookie、LocalStorage、SessionStorageも「過去のデータ」としてテストに影響を与えます。
Seleniumの標準機能でCookieは簡単に削除できますが、WebStorage系はJavaScriptを実行してクリアする必要があります。
# 全てのCookieを削除
driver.delete_all_cookies()
# LocalStorageのクリア
driver.execute_script("window.localStorage.clear();")
# SessionStorageのクリア
driver.execute_script("window.sessionStorage.clear();")
DevToolsを利用した全データ消去
さらに強力な方法として、CDPのStorage.clearDataForOriginコマンドを使用し、特定のドメインに関連するすべてのデータを一括消去することも可能です。
これにはキャッシュ、Service Worker、IndexedDBなどが含まれます。
# カレントドメインの全データを消去
driver.execute_cdp_cmd("Storage.clearDataForOrigin", {
"origin": "https://example.com",
"storageTypes": "all"
})
キャッシュ設定とテストパフォーマンスの比較
キャッシュを完全に無効化すると、当然ながらページの読み込み時間は増加します。
テストの「正確性」と「実行速度」はトレードオフの関係にあることを理解しておく必要があります。
| 設定項目 | 正確性・再現性 | 実行速度 | 推奨される用途 |
|---|---|---|---|
| キャッシュ有効(デフォルト) | △ (古いデータが残る) | ◎ (高速) | 本番環境のUX確認 |
| –disable-cache (引数) | ○ (基本的無効) | ○ (標準的) | 一般的なUI回帰テスト |
| CDP Network無効化 | ◎ (完全無効化) | △ (通信量増) | フロントエンド変更直後のテスト |
| シークレットモード | ◎ (環境分離) | ○ (安定) | 認証・認可周りのテスト |
プロジェクトの規模やCI/CDの実行時間に余裕があるかどうかに応じて、適切な設定レベルを選択してください。
基本的には「シークレットモード」と「CDPによるキャッシュ無効化」を組み合わせるのが、2026年現在のベストプラクティスです。
キャッシュが原因でテストが失敗する場合のチェックリスト
キャッシュ無効化設定を入れているにもかかわらず、古いデータが表示される場合は以下の点を確認してください。
- プロキシサーバーのキャッシュ: ブラウザではなく、社内LANのプロキシやCDN(Cloudflareなど)が古いファイルをキャッシュしている可能性があります。
- Service Worker: Service Workerが強力なキャッシュ戦略(Cache-Firstなど)を採用している場合、通常のキャッシュ無効化フラグを無視することがあります。
- ブラウザプロファイルの不完全な破棄: Seleniumの終了時に
driver.quit()が正常に呼ばれず、以前のプロファイルが残っていないか確認してください。 - Headlessモードの差異: Headlessモードを使用している場合、通常のモードとは異なるキャッシュ挙動を示すことがあります(特に古い引数
--headlessを使用している場合)。
Headlessモードについては、2026年現在では --headless=new (または単に --headless の最新仕様)を使用することが推奨されています。
新しいHeadlessモードは通常のブラウザとほぼ同等の挙動を示すため、キャッシュ制御もより正確に反映されます。
まとめ
Seleniumを使用したブラウザ操作のテストにおいて、キャッシュの制御はテストの信頼性を左右する極めて重要な要素です。
本記事では、Pythonを用いた複数のアプローチを紹介しました。
まず、手軽に導入できるChromeOptionsの引数指定(–disable-cache, –incognito)から始めましょう。
より厳密な制御が必要な場合は、Chrome DevTools Protocol (CDP)を利用して、通信レイヤーでのキャッシュ無効化を実装するのが効果的です。
また、FirefoxやEdgeなど他のブラウザを使用する場合も、それぞれのオプション設定を通じて同様の環境を構築できます。
「常にクリーンな状態からテストを開始する」という原則を徹底することで、不安定なテスト(Flaky Tests)を減らし、開発サイクルを円滑に進めることができます。
今回解説したテクニックを駆使して、メンテナンス性の高い堅牢な自動テストスイートを構築してください。
