selenium

[Python] seleniumで複数のウィンドウを切り替える方法

Seleniumで複数のウィンドウを切り替えるには、driver.window_handlesを使用してすべてのウィンドウのハンドルを取得し、driver.switch_to.window(handle)で特定のウィンドウに切り替えます。

window_handlesはリスト形式で、最初のウィンドウはwindow_handles[0]、新しいウィンドウはwindow_handles[-1]でアクセスできます。

ウィンドウを閉じる場合はdriver.close()を使用し、元のウィンドウに戻る際は再度switch_to.window()を使います。

Seleniumでのウィンドウ操作の基本

ウィンドウハンドルとは?

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

これを使用することで、特定のウィンドウに対して操作を行うことができます。

ウィンドウハンドルは、各ウィンドウが開かれるたびに生成され、window_handlesを使って取得することができます。

window_handlesの使い方

window_handlesは、現在開いているすべてのウィンドウのハンドルをリスト形式で取得します。

これにより、複数のウィンドウを管理することが可能になります。

from selenium import webdriver
# ブラウザを起動
driver = webdriver.Chrome()
# ウィンドウを開く
driver.get("https://example.com")
driver.execute_script("window.open('https://example.org');")
# ウィンドウハンドルを取得
handles = driver.window_handles
print(handles)
['5898588923C73420B40D9C53C48C6B4D', 'C29075DAA532E117B55BBDAFA2D58A4C']

このコードでは、最初にexample.comを開き、その後example.orgを新しいウィンドウで開いています。

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

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

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

ウィンドウハンドルを引数として渡すことで、操作対象のウィンドウを指定します。

from selenium import webdriver
# ブラウザを起動
driver = webdriver.Chrome()
# ウィンドウを開く
driver.get("https://example.com")
driver.execute_script("window.open('https://example.org');")
# ウィンドウハンドルを取得
handles = driver.window_handles
# 2つ目のウィンドウに切り替え
driver.switch_to.window(handles[1])
print(driver.title)  # example.orgのタイトルを表示
Example Domain

このコードでは、最初のウィンドウから2つ目のウィンドウに切り替え、そのウィンドウのタイトルを表示しています。

ウィンドウを閉じる方法:driver.close()とdriver.quit()の違い

driver.close()は、現在アクティブなウィンドウを閉じるメソッドです。

一方、driver.quit()は、すべてのウィンドウを閉じ、WebDriverのセッションを終了します。

これらの違いを理解して、適切に使い分けることが重要です。

メソッド説明
driver.close()現在のウィンドウを閉じる
driver.quit()すべてのウィンドウを閉じ、セッションを終了

例えば、特定のウィンドウだけを閉じたい場合はdriver.close()を使用し、すべてのウィンドウを閉じたい場合はdriver.quit()を使用します。

複数ウィンドウの切り替え手順

新しいウィンドウを開く方法

新しいウィンドウを開くには、JavaScriptのwindow.open()メソッドを使用します。

Seleniumのexecute_script()メソッドを使って、ブラウザ内でJavaScriptを実行することで新しいウィンドウを開くことができます。

from selenium import webdriver
# ブラウザを起動
driver = webdriver.Chrome()
# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")

このコードでは、最初にexample.comを開き、その後example.orgを新しいウィンドウで開いています。

すべてのウィンドウハンドルを取得する

開いているすべてのウィンドウのハンドルを取得するには、window_handlesを使用します。

これにより、現在開いているウィンドウのリストを取得できます。

# ウィンドウハンドルを取得
handles = driver.window_handles
print(handles)
['5898588923C73420B40D9C53C48C6B4D', 'C29075DAA532E117B55BBDAFA2D58A4C']

このコードを実行すると、開いているウィンドウのハンドルがリスト形式で表示されます。

特定のウィンドウに切り替える方法

特定のウィンドウに切り替えるには、switch_to.window()メソッドを使用します。

ウィンドウハンドルを引数として渡すことで、指定したウィンドウに切り替えることができます。

# 2つ目のウィンドウに切り替え
driver.switch_to.window(handles[1])
print(driver.title)  # example.orgのタイトルを表示
Example Domain

このコードでは、2つ目のウィンドウに切り替え、そのウィンドウのタイトルを表示しています。

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

元のウィンドウに戻るには、最初に取得したウィンドウハンドルを使用して再度switch_to.window()を呼び出します。

# 元のウィンドウに戻る
driver.switch_to.window(handles[0])
print(driver.title)  # example.comのタイトルを表示
Example Domain

このコードでは、最初のウィンドウに戻り、そのウィンドウのタイトルを表示しています。

ウィンドウを閉じた後の切り替え

ウィンドウを閉じた後に切り替える場合、閉じたウィンドウのハンドルは無効になります。

したがって、ウィンドウを閉じた後は、残っているウィンドウのハンドルを再度取得する必要があります。

# 現在のウィンドウを閉じる
driver.close()
# 残っているウィンドウハンドルを再取得
handles = driver.window_handles
# 残っているウィンドウに切り替え
driver.switch_to.window(handles[0])
print(driver.title)  # 残っているウィンドウのタイトルを表示

このコードでは、現在のウィンドウを閉じた後、残っているウィンドウに切り替え、そのタイトルを表示しています。

ウィンドウを閉じた後は、必ず新しいハンドルリストを取得することが重要です。

実践例:複数ウィンドウを使った操作

新しいタブでリンクを開く

新しいタブでリンクを開くには、window.open()を使用します。

これにより、現在のウィンドウとは別のタブで指定したURLを開くことができます。

from selenium import webdriver
# ブラウザを起動
driver = webdriver.Chrome()
# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいタブでリンクを開く
driver.execute_script("window.open('https://example.org', '_blank');")
# ウィンドウハンドルを取得
handles = driver.window_handles
# 新しいタブに切り替え
driver.switch_to.window(handles[1])
print(driver.title)  # example.orgのタイトルを表示
Example Domain

このコードでは、最初にexample.comを開き、その後新しいタブでexample.orgを開いています。

ポップアップウィンドウの操作

ポップアップウィンドウを操作するには、通常のウィンドウと同様にwindow_handlesを使用してハンドルを取得し、切り替えます。

# ポップアップウィンドウを開く
driver.execute_script("window.open('https://example.org');")
# ウィンドウハンドルを取得
handles = driver.window_handles
# ポップアップウィンドウに切り替え
driver.switch_to.window(handles[1])
print(driver.title)  # example.orgのタイトルを表示
# ポップアップウィンドウを閉じる
driver.close()
# 元のウィンドウに戻る
driver.switch_to.window(handles[0])

このコードでは、ポップアップウィンドウを開いてそのタイトルを表示し、ウィンドウを閉じた後に元のウィンドウに戻っています。

ウィンドウ間でデータをやり取りする

複数のウィンドウ間でデータをやり取りするには、各ウィンドウの要素を取得し、必要なデータを保存して別のウィンドウで使用します。

# 最初のウィンドウでデータを取得
driver.get("https://example.com")
data = driver.find_element_by_tag_name("h1").text  # h1要素のテキストを取得
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
handles = driver.window_handles
driver.switch_to.window(handles[1])
# 取得したデータを表示
print(data)  # example.comから取得したデータを表示
Example Domain

このコードでは、最初のウィンドウからh1要素のテキストを取得し、新しいウィンドウでそのデータを表示しています。

ウィンドウを順番に操作する

複数のウィンドウを順番に操作する場合、各ウィンドウに切り替えながら必要な操作を行います。

# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
driver.execute_script("window.open('https://example.net');")
# ウィンドウハンドルを取得
handles = driver.window_handles
# 各ウィンドウを順番に操作
for handle in handles:
    driver.switch_to.window(handle)
    print(driver.title)  # 各ウィンドウのタイトルを表示
Example Domain
Example Domain
Example Domain

このコードでは、開いているすべてのウィンドウに順番に切り替え、それぞれのタイトルを表示しています。

ウィンドウを順番に操作することで、複数のページを効率的に管理できます。

応用例:複数ウィンドウを使った自動化

複数のウィンドウで異なるページを同時に操作する

複数のウィンドウを使って異なるページを同時に操作することで、効率的に情報を収集したり、比較したりすることができます。

以下の例では、2つのウィンドウを開いて、それぞれのページから情報を取得します。

from selenium import webdriver
# ブラウザを起動
driver = webdriver.Chrome()
# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
# ウィンドウハンドルを取得
handles = driver.window_handles
# 各ウィンドウで情報を取得
for handle in handles:
    driver.switch_to.window(handle)
    title = driver.title
    print(f"ウィンドウタイトル: {title}")
ウィンドウタイトル: Example Domain
ウィンドウタイトル: Example Domain

このコードでは、2つのウィンドウを開き、それぞれのタイトルを表示しています。

ウィンドウを自動で閉じながら操作を進める

操作が終わったウィンドウを自動で閉じることで、リソースを節約し、作業を効率化できます。

以下の例では、各ウィンドウを操作した後に自動で閉じます。

# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
handles = driver.window_handles
# 各ウィンドウを操作して閉じる
for handle in handles:
    driver.switch_to.window(handle)
    print(f"ウィンドウタイトル: {driver.title}")
    driver.close()  # ウィンドウを閉じる

このコードでは、各ウィンドウのタイトルを表示した後、すぐにそのウィンドウを閉じています。

特定のウィンドウを条件で選択する

特定の条件に基づいてウィンドウを選択することも可能です。

以下の例では、ウィンドウのタイトルに基づいて切り替えます。

# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
driver.execute_script("window.open('https://example.net');")
handles = driver.window_handles
# 特定のタイトルを持つウィンドウに切り替え
for handle in handles:
    driver.switch_to.window(handle)
    if "example.org" in driver.title:
        print(f"切り替えたウィンドウタイトル: {driver.title}")
        break
切り替えたウィンドウタイトル: Example Domain

このコードでは、ウィンドウのタイトルにexample.orgが含まれている場合に、そのウィンドウに切り替えています。

ウィンドウのタイトルを使って切り替える

ウィンドウのタイトルを使って切り替える方法は、特定のウィンドウを見つけるのに便利です。

以下の例では、ウィンドウのタイトルを確認しながら切り替えます。

# 最初のウィンドウを開く
driver.get("https://example.com")
# 新しいウィンドウを開く
driver.execute_script("window.open('https://example.org');")
driver.execute_script("window.open('https://example.net');")
handles = driver.window_handles
# 各ウィンドウのタイトルを確認しながら切り替え
for handle in handles:
    driver.switch_to.window(handle)
    if driver.title == "Example Domain":
        print(f"切り替えたウィンドウタイトル: {driver.title}")
        break
切り替えたウィンドウタイトル: Example Domain

このコードでは、ウィンドウのタイトルがExample Domainであるウィンドウに切り替え、そのタイトルを表示しています。

ウィンドウのタイトルを使うことで、特定のウィンドウを簡単に見つけることができます。

まとめ

この記事では、Seleniumを使用して複数のウィンドウを操作する方法について詳しく解説しました。

ウィンドウの切り替えやデータのやり取り、特定のウィンドウを選択する方法など、実践的なテクニックを紹介しました。

これらの知識を活用して、より効率的なWeb自動化を実現するために、ぜひ実際のプロジェクトで試してみてください。

関連記事

Back to top button
目次へ