selenium

[Python] seleniumで操作するアクティブウィンドウを切り替える方法

Seleniumで操作するアクティブウィンドウを切り替えるには、driver.window_handlesで全てのウィンドウのハンドルを取得し、driver.switch_to.window(window_handle)を使って特定のウィンドウに切り替えます。

window_handlesはリスト形式で、最初のウィンドウはリストの最初の要素に対応します。

新しいウィンドウが開かれた場合、リストの最後の要素がそのウィンドウのハンドルになります。

ウィンドウハンドルの取得方法

Webブラウザを操作する際、Seleniumではウィンドウやタブを切り替えるために「ウィンドウハンドル」を使用します。

ウィンドウハンドルは、各ウィンドウやタブを一意に識別するための識別子です。

ここでは、ウィンドウハンドルの取得方法について詳しく解説します。

window_handlesの使い方

window_handlesは、現在開いているすべてのウィンドウのハンドルをリスト形式で取得するためのプロパティです。

このプロパティを使用することで、複数のウィンドウを管理することができます。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 任意のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# 現在開いているウィンドウのハンドルを取得
window_handles = driver.window_handles
print(window_handles)
['CDwindow-1234567890', 'CDwindow-0987654321']

window_handlesを使用することで、開いているウィンドウのハンドルをリストとして取得できます。

このリストを使って、特定のウィンドウに切り替えることが可能です。

現在のウィンドウハンドルを取得する方法

現在アクティブなウィンドウのハンドルを取得するには、current_window_handleプロパティを使用します。

このプロパティは、現在のウィンドウのハンドルを返します。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 任意のURLを開く
driver.get("https://example.com")
# 現在のウィンドウハンドルを取得
current_handle = driver.current_window_handle
print(current_handle)
616F88AAB5B27D301CBAAE735F19EF80

このように、current_window_handleを使うことで、現在のウィンドウのハンドルを簡単に取得できます。

複数ウィンドウが開かれた場合のハンドルの順序

複数のウィンドウが開かれた場合、window_handlesで取得したハンドルの順序は、ウィンドウが開かれた順番に依存します。

新しいウィンドウが開かれると、そのハンドルはリストの最後に追加されます。

例えば、以下のようにウィンドウを開いた場合のハンドルの順序を確認できます。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
driver.execute_script("window.open('https://yahoo.com');")
# 現在開いているウィンドウのハンドルを取得
window_handles = driver.window_handles
print(window_handles)
['8803011131686ECFACC6B7089F3FAE33', '989BDD81FA83BA95ED886950726E8C9A', 'F35D807C9C6FB612BAFD65AF22617ACC']

このように、ウィンドウが開かれた順番にハンドルがリストに追加されるため、特定のウィンドウに切り替える際には、リストのインデックスを考慮する必要があります。

アクティブウィンドウの切り替え方法

Seleniumを使用して複数のウィンドウを操作する際、アクティブなウィンドウを切り替えることが重要です。

ここでは、ウィンドウの切り替え方法について詳しく解説します。

switch_to.window()の基本的な使い方

switch_to.window()メソッドを使用することで、指定したウィンドウに切り替えることができます。

このメソッドには、切り替えたいウィンドウのハンドルを引数として渡します。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 2番目のウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# 現在のURLを表示
print(driver.current_url)
https://google.com

このように、switch_to.window()を使うことで、指定したウィンドウに切り替えることができます。

特定のウィンドウに切り替える手順

特定のウィンドウに切り替える手順は以下の通りです。

  1. window_handlesを使用して、すべてのウィンドウのハンドルを取得します。
  2. 切り替えたいウィンドウのハンドルを指定して、switch_to.window()を呼び出します。

以下は、特定のウィンドウに切り替える例です。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
driver.execute_script("window.open('https://yahoo.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 3番目のウィンドウに切り替え
driver.switch_to.window(window_handles[2])
# 現在のURLを表示
print(driver.current_url)
https://yahoo.com

このように、ウィンドウのインデックスを指定することで、特定のウィンドウに切り替えることができます。

新しいウィンドウに切り替える方法

新しいウィンドウを開いた後、そのウィンドウに切り替える方法は、基本的に上記の手順と同じです。

新しいウィンドウを開いた後、window_handlesを使ってハンドルを取得し、switch_to.window()で切り替えます。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 新しく開いたウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# 現在のURLを表示
print(driver.current_url)
https://google.com

このように、新しいウィンドウを開いた後にそのウィンドウに切り替えることができます。

元のウィンドウに戻る方法

元のウィンドウに戻るには、再度switch_to.window()を使用して、元のウィンドウのハンドルを指定します。

元のウィンドウのハンドルは、最初に取得したcurrent_window_handleを使うことができます。

from selenium import webdriver
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 元のウィンドウのハンドルを保存
original_handle = driver.current_window_handle
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# 新しいウィンドウに切り替え
driver.switch_to.window(driver.window_handles[1])
# 現在のURLを表示
print(driver.current_url)
# 元のウィンドウに戻る
driver.switch_to.window(original_handle)
# 現在のURLを表示
print(driver.current_url)
https://google.com
https://example.com

このように、元のウィンドウに戻ることができます。

ウィンドウの切り替えを適切に行うことで、複数のウィンドウを効率的に操作することが可能です。

ウィンドウ切り替えの実践例

Seleniumを使用してウィンドウを切り替える際の実践的な例をいくつか紹介します。

これにより、実際のシナリオでのウィンドウ操作がどのように行われるかを理解できます。

新しいタブを開いて操作する例

新しいタブを開いて、そのタブで操作を行う方法を示します。

タブを開いた後、切り替えて操作を行います。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいタブを開く
driver.execute_script("window.open('https://google.com', '_blank');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 新しいタブに切り替え
driver.switch_to.window(window_handles[1])
# 現在のURLを表示
print(driver.current_url)
# タイトルを表示
print(driver.title)
# タブを閉じる
driver.close()
# 元のタブに戻る
driver.switch_to.window(window_handles[0])
# 元のタブのURLを表示
print(driver.current_url)
# WebDriverを終了
driver.quit()
https://google.com
Google
https://example.com

この例では、新しいタブを開いてそのタブで操作を行い、最後に元のタブに戻っています。

ポップアップウィンドウを操作する例

ポップアップウィンドウを開いて操作する方法を示します。

ポップアップウィンドウは通常、特定のアクションによって開かれます。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# ポップアップウィンドウを開くためのボタンをクリック(仮想的な例)
driver.execute_script("window.open('https://yahoo.com', 'popup');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# ポップアップウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# 現在のURLを表示
print(driver.current_url)
# タイトルを表示
print(driver.title)
# ポップアップウィンドウを閉じる
driver.close()
# 元のウィンドウに戻る
driver.switch_to.window(window_handles[0])
# 元のウィンドウのURLを表示
print(driver.current_url)
# WebDriverを終了
driver.quit()
https://yahoo.com
Yahoo
https://example.com

この例では、ポップアップウィンドウを開いてその内容を確認し、元のウィンドウに戻っています。

複数のウィンドウを順番に操作する例

複数のウィンドウを順番に開いて操作する方法を示します。

これにより、複数のウィンドウを効率的に管理できます。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
driver.execute_script("window.open('https://yahoo.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 各ウィンドウを順番に操作
for handle in window_handles:
    driver.switch_to.window(handle)
    print(f"現在のURL: {driver.current_url}")
    print(f"タイトル: {driver.title}")
    time.sleep(1)  # 各ウィンドウを1秒間表示
# 最後にすべてのウィンドウを閉じる
driver.quit()
現在のURL: https://example.com
タイトル: Example Domain
現在のURL: https://google.com
タイトル: Google
現在のURL: https://yahoo.com
タイトル: Yahoo

この例では、複数のウィンドウを順番に切り替え、それぞれのURLとタイトルを表示しています。

最後にすべてのウィンドウを閉じています。

これにより、複数のウィンドウを効率的に操作する方法が理解できます。

ウィンドウ切り替え時のエラーハンドリング

Seleniumを使用してウィンドウを切り替える際には、さまざまなエラーが発生する可能性があります。

ここでは、ウィンドウ切り替え時のエラーハンドリングについて解説します。

NoSuchWindowExceptionの対処法

NoSuchWindowExceptionは、指定したウィンドウハンドルが存在しない場合に発生します。

このエラーを回避するためには、ウィンドウハンドルが有効であることを確認する必要があります。

from selenium import webdriver
from selenium.common.exceptions import NoSuchWindowException
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# ウィンドウを閉じる
driver.close()
# ウィンドウ切り替えを試みる
try:
    driver.switch_to.window(window_handles[1])
except NoSuchWindowException:
    print("指定したウィンドウは存在しません。")
finally:
    driver.quit()
指定したウィンドウは存在しません。

このように、NoSuchWindowExceptionをキャッチして適切に対処することで、エラーを回避できます。

ウィンドウが閉じられた場合の対処法

ウィンドウが閉じられた後に切り替えを試みると、NoSuchWindowExceptionが発生します。

この場合も、エラーハンドリングを行うことで対処できます。

from selenium import webdriver
from selenium.common.exceptions import NoSuchWindowException
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 新しいウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# ウィンドウを閉じる
driver.close()
# 元のウィンドウに戻ることを試みる
try:
    driver.switch_to.window(window_handles[1])
except NoSuchWindowException:
    print("ウィンドウが閉じられたため、切り替えに失敗しました。")
finally:
    driver.quit()
ウィンドウが閉じられたため、切り替えに失敗しました。

このように、ウィンドウが閉じられた場合にもエラーハンドリングを行うことで、プログラムの安定性を保つことができます。

ウィンドウ切り替えが失敗する原因と解決策

ウィンドウ切り替えが失敗する原因はいくつかあります。

以下に主な原因とその解決策を示します。

原因解決策
ウィンドウハンドルが無効window_handlesを再取得して確認する。
ウィンドウが既に閉じられている切り替え前にウィンドウの状態を確認する。
別のウィンドウに切り替えようとしている正しいウィンドウハンドルを指定する。

例えば、ウィンドウハンドルが無効な場合、再度window_handlesを取得してから切り替えを試みることが重要です。

from selenium import webdriver
from selenium.common.exceptions import NoSuchWindowException
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウを閉じる
driver.close()
# ウィンドウハンドルを再取得
window_handles = driver.window_handles
# 切り替えを試みる
try:
    driver.switch_to.window(window_handles[0])
    print("ウィンドウ切り替え成功")
except NoSuchWindowException:
    print("ウィンドウ切り替えに失敗しました。")
finally:
    driver.quit()
ウィンドウ切り替え成功

このように、ウィンドウ切り替えが失敗する原因を理解し、適切な対策を講じることで、エラーを未然に防ぐことができます。

応用例:ウィンドウ切り替えを活用した自動化

Seleniumを使用してウィンドウ切り替えを行うことで、さまざまな自動化タスクを効率的に実行できます。

ここでは、ウィンドウ切り替えを活用した具体的な応用例を紹介します。

複数のウィンドウでのデータ収集

複数のウィンドウを使用して、異なるサイトからデータを収集する方法を示します。

この例では、2つの異なるサイトから情報を取得します。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# 最初のURLを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://google.com');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# 最初のウィンドウでデータを収集
driver.switch_to.window(window_handles[0])
print("Example.comのタイトル:", driver.title)
# 2番目のウィンドウでデータを収集
driver.switch_to.window(window_handles[1])
print("Googleのタイトル:", driver.title)
# WebDriverを終了
driver.quit()
Example.comのタイトル: Example Domain
Googleのタイトル: Google

このように、複数のウィンドウを使って異なるサイトからデータを収集することができます。

ウィンドウ切り替えを使ったログイン処理

ウィンドウ切り替えを利用して、ログイン処理を自動化する方法を示します。

この例では、ログインページを新しいウィンドウで開き、ログイン情報を入力します。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# メインページを開く
driver.get("https://example.com")
# ログインページを新しいウィンドウで開く
driver.execute_script("window.open('https://example.com/login');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# ログインウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# ログイン情報を入力
driver.find_element("name", "username").send_keys("your_username")
driver.find_element("name", "password").send_keys("your_password")
driver.find_element("name", "submit").click()
# ログイン後のページタイトルを表示
print("ログイン後のタイトル:", driver.title)
# ウィンドウを閉じて元のウィンドウに戻る
driver.close()
driver.switch_to.window(window_handles[0])
# WebDriverを終了
driver.quit()
ログイン後のタイトル: ログイン成功ページのタイトル

このように、ウィンドウ切り替えを使ってログイン処理を自動化することができます。

ウィンドウ切り替えを使ったファイルダウンロード

ウィンドウ切り替えを利用して、ファイルをダウンロードするプロセスを自動化する方法を示します。

この例では、ダウンロードリンクを新しいウィンドウで開きます。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# ダウンロードページを開く
driver.get("https://example.com/download")
# ダウンロードリンクを新しいウィンドウで開く
driver.execute_script("window.open('https://example.com/file.zip');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# ダウンロードウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# ダウンロード処理を実行(例: リンクをクリック)
driver.find_element("link text", "Download").click()
# ダウンロードが完了するまで待機
time.sleep(5)
# ウィンドウを閉じて元のウィンドウに戻る
driver.close()
driver.switch_to.window(window_handles[0])
# WebDriverを終了
driver.quit()
ファイルダウンロードが開始されました。

このように、ウィンドウ切り替えを使ってファイルダウンロードを自動化することができます。

ウィンドウ切り替えを使ったフォーム送信

ウィンドウ切り替えを利用して、フォームを送信するプロセスを自動化する方法を示します。

この例では、フォームを新しいウィンドウで開き、情報を入力して送信します。

from selenium import webdriver
import time
# WebDriverのインスタンスを作成
driver = webdriver.Chrome()
# フォームページを開く
driver.get("https://example.com/form")
# フォームを新しいウィンドウで開く
driver.execute_script("window.open('https://example.com/form/new');")
# ウィンドウハンドルを取得
window_handles = driver.window_handles
# フォームウィンドウに切り替え
driver.switch_to.window(window_handles[1])
# フォームに情報を入力
driver.find_element("name", "name").send_keys("John Doe")
driver.find_element("name", "email").send_keys("john@example.com")
driver.find_element("name", "submit").click()
# フォーム送信後のページタイトルを表示
print("フォーム送信後のタイトル:", driver.title)
# ウィンドウを閉じて元のウィンドウに戻る
driver.close()
driver.switch_to.window(window_handles[0])
# WebDriverを終了
driver.quit()
フォーム送信後のタイトル: 送信完了ページのタイトル

このように、ウィンドウ切り替えを使ってフォーム送信を自動化することができます。

これらの応用例を参考にすることで、Seleniumを活用したさまざまな自動化タスクを実行できるようになります。

まとめ

この記事では、Seleniumを使用したウィンドウ切り替えの基本から応用まで、さまざまな操作方法について詳しく解説しました。

ウィンドウハンドルの取得や切り替え方法、エラーハンドリングのテクニック、さらには実践的な自動化の例を通じて、ウィンドウ操作の重要性とその活用方法を紹介しました。

これを機に、実際のプロジェクトにおいてウィンドウ切り替えを積極的に活用し、より効率的な自動化を実現してみてください。

関連記事

Back to top button