Webブラウザを使用した業務効率化やスクレイピングにおいて、特定のページへ遷移した後に前のページへ戻ったり、再び元のページへ進んだりする操作は頻繁に発生します。
Seleniumを利用すれば、これらのブラウザ特有の挙動をPythonから簡単に制御することが可能です。
しかし、単にコマンドを実行するだけでは、要素の読み込みが完了する前に操作が行われ、エラーの原因になることも少なくありません。
本記事では、Seleniumを用いたブラウザの「戻る」「進む」の基本的な実装方法から、実務で不可欠な待機処理のテクニックまで、2026年現在の最新プラクティスを交えて詳しく解説します。
Seleniumによるブラウザ遷移操作の基本
Seleniumでブラウザの履歴を操作するためには、WebDriverオブジェクトが提供する専用のメソッドを使用します。
Webブラウザの左上にある「戻る」ボタンや「進む」ボタンをクリックする動作を、プログラム上で再現するイメージです。
主要な3つのナビゲーションメソッド
ブラウザの移動履歴に関連する操作には、主に以下の3つのメソッドが用意されています。
| メソッド名 | 役割 | 実行されるアクション |
|---|---|---|
back() | 戻る | ブラウザの履歴を1つ戻し、前のページを表示する。 |
forward() | 進む | ブラウザの履歴を1つ進め、次のページを表示する。 |
refresh() | 更新 | 現在表示しているページを再読み込みする。 |
これらのメソッドは、いずれも引数を必要とせず、呼び出すだけで即座に実行されます。
例えば、driver.back() を実行すると、現在のウィンドウの履歴スタックに基づいて1つ前のURLへと遷移します。
ナビゲーション操作が必要になるケース
自動化のシナリオにおいて、これらの操作が必要になる代表的な場面は以下の通りです。
- 検索結果一覧と詳細ページの往復:一覧画面から詳細画面へ遷移して情報を取得した後、再び一覧画面に戻って次の項目を確認する場合。
- 動的なページ遷移のテスト:会員登録フォームや決済フローなどで、戻るボタンを押した際の挙動 (フォーム内容の保持など) を検証する場合。
- シングルページアプリケーション (SPA) の操作:URLのハッシュや履歴APIによって画面が切り替わるサイトの巡回。
Pythonでの実装手順とサンプルコード
それでは、実際にPythonとSeleniumを使用して、ブラウザの「戻る」「進む」を制御する具体的なコードを見ていきましょう。
ここでは、Selenium 4以降の標準的な記述方法を採用しています。
基本的な遷移プログラムの例
以下のコードでは、Google検索から始めて、別のサイトへ遷移し、その後「戻る」と「進む」を繰り返す一連の流れを記述しています。
import time
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
# ブラウザのオプション設定
options = Options()
# options.add_argument("--headless") # GUIを表示させない場合は有効化
# WebDriverの起動
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
try:
# 1. 最初のページへアクセス
print("Step 1: Googleにアクセスします")
driver.get("https://www.google.com")
time.sleep(1) # 挙動を確認しやすくするための待機
# 2. 次のページ (Python公式サイト) へアクセス
print("Step 2: Python公式サイトへ移動します")
driver.get("https://www.python.org")
time.sleep(1)
# 3. 1つ前のページ (Google) に戻る
print("Step 3: ブラウザの『戻る』を操作します")
driver.back()
print(f"現在のURL: {driver.current_url}")
time.sleep(1)
# 4. 再び先のページ (Python公式サイト) に進む
print("Step 4: ブラウザの『進む』を操作します")
driver.forward()
print(f"現在のURL: {driver.current_url}")
time.sleep(1)
# 5. ページを更新する
print("Step 5: ページを更新します")
driver.refresh()
print("更新完了")
finally:
# ブラウザを閉じる
driver.quit()
上記のプログラムを実行すると、コンソールには以下のようなログが表示されます。
Step 1: Googleにアクセスします
Step 2: Python公式サイトへ移動します
Step 3: ブラウザの『戻る』を操作します
現在のURL: https://www.google.com/
Step 4: ブラウザの『進む』を操作します
現在のURL: https://www.python.org/
Step 5: ページを更新します
更新完了
このように、driver.back() や driver.forward() を呼び出すことで、ブラウザのアドレスバーにある履歴情報を直接制御できていることがわかります。
遷移操作における待機処理の注意点
ブラウザの戻る・進む操作を行う際、最も陥りやすいトラブルが「要素が見つからない (NoSuchElementException)」や「要素が古い (StaleElementReferenceException)」といったエラーです。
なぜ待機処理が必要なのか
ブラウザの「戻る」ボタンを押した際、ネットワーク環境やページの構造によっては、画面の描画が完了するまでにタイムラグが発生します。
Seleniumはメソッドを実行した直後、次の行のコードを処理しようとしますが、その時点でページ内のHTML要素がまだ読み込まれていない場合、プログラムは停止してしまいます。
特に現代のWebサイトはJavaScriptを多用しているため、ブラウザとしてのロード完了イベントが発火しても、特定のコンテンツが遅れて表示されることがよくあります。
明示的な待機 (Explicit Wait) の活用
単純な time.sleep() は、指定した秒数だけ無条件に処理を止めるため、効率が悪く、かつ不安定です。
これを解決するために、特定の条件が満たされるまで待機する「明示的な待機」を利用します。
以下の例では、ページが戻った後に、特定の要素 (検索ボックスなど) が表示されるまで最大10秒間待機するように記述しています。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# (中略: WebDriverの初期化など)
# 戻る操作を実行
driver.back()
# 明示的な待機の実行:特定のIDを持つ要素が表示されるまで待つ
wait = WebDriverWait(driver, 10)
search_input = wait.until(EC.presence_of_element_located((By.NAME, "q")))
print("要素が正常に読み込まれました")
ページタイトルやURLの変化を待機する
戻る・進む操作の後に、URLが期待通りのものに変わったかどうかを条件にすることも有効です。
EC.title_contains("キーワード"): タイトルに特定の文字列が含まれるまで待機EC.url_to_be("<a href="https://example.com/">https://example.com/</a>"): URLが完全に一致するまで待機
これらの条件を組み合わせることで、「前のページに戻ったこと」を確実に検知してから次の操作へ移る堅牢なスクリプトになります。
2026年現在のSelenium最新事情とベストプラクティス
2026年現在、Selenium 4系の普及と共に、ブラウザ操作の安定性は向上しています。
しかし、モダンなWebフロントエンド技術への対応には依然として工夫が必要です。
シングルページアプリケーション (SPA) での挙動
ReactやNext.jsなどで構築されたSPAでは、ブラウザの「戻る」を押しても、実際にはサーバーから新しいHTMLを読み込まず、JavaScriptでDOMを書き換えているだけのケースがあります。
この場合、通常の「ページロード完了」というイベントが正しく検知されないことがあります。
SPAにおいて戻る操作を行う際は、URLの変化を監視するだけでなく、特定のDOM要素が「一度消えて、新しいものが出現したこと」を確認するようなロジックを組むのがベストプラクティスです。
StaleElementReferenceException への対策
一度取得した要素のオブジェクトは、ページを移動して戻ってくると無効になります。
例えば、以下のコードはエラーになります。
# NGな例
btn = driver.find_element(By.ID, "submit")
driver.get("https://another-page.com")
driver.back()
btn.click() # ここでStaleElementReferenceExceptionが発生する
ブラウザを戻した後は、全ての要素を再取得する必要があることを忘れないでください。
ページ遷移が発生した時点で、以前の要素情報はメモリから破棄されていると考えるべきです。
遭遇しやすいトラブルと解決策
実装中によく直面する問題とその対処法をまとめました。
1. 戻る履歴が存在しない場合
ブラウザを起動した直後の最初のページで driver.back() を実行しても、何も起こりません (エラーにはなりませんが、遷移も行われません)。
現在のウィンドウに履歴が蓄積されているかを確認する術はSelenium標準にはありませんが、リストにURLを記録しておくなどの工夫で管理可能です。
2. ポップアップやアラートが表示されている場合
ページを離脱しようとした際に「入力内容が保存されませんがよろしいですか?」といったブラウザネイティブのアラートが表示されると、back() メソッドはブロッキングされるか、エラーを返します。
この場合は、事前にアラートを処理するロジックを組み込む必要があります。
from selenium.common.exceptions import NoAlertPresentException
try:
alert = driver.switch_to.alert
alert.accept() # アラートを承諾して次へ
except NoAlertPresentException:
pass
3. フレーム (iframe) 内での操作
iframe 内で操作を行っていた場合、そのまま back() を実行すると親フレームの履歴が戻ってしまうことがあります。
操作対象がフレーム内なのか、メインコンテンツなのかを常に意識し、必要に応じて driver.switch_to.default_content() でコンテキストをリセットしてください。
まとめ
Seleniumを利用したブラウザの「戻る」「進む」操作は、単純なメソッド呼び出しだけで実現可能です。
しかし、実用的な自動化スクリプトを作成するためには、単なる命令以上に「遷移後の状態をいかに正確に把握するか」という待機戦略が重要となります。
本記事で解説した以下のポイントを意識して実装を進めてください。
driver.back()とdriver.forward()で履歴を制御する。- 遷移後には必ず WebDriverWait を使用し、要素の出現を待つ。
- ページを跨ぐ際は、要素の再取得を徹底し
StaleElementReferenceExceptionを防ぐ。 - SPAのような複雑な挙動のサイトでは、URLの変化や特定のDOM変化をトリガーにする。
適切な待機処理を組み合わせることで、ネットワークの遅延やマシンスペックの差異に左右されない、安定したブラウザ自動操作を実現できるでしょう。
