selenium

[Python] seleniumで要素を取得するfind_elementを使用する方法

Seleniumで要素を取得するために、find_elementメソッドを使用します。

まず、Seleniumをインポートし、WebDriverを使ってブラウザを操作します。

find_elementは、指定した条件に基づいて最初に見つかった要素を返します。

条件には、By.IDBy.NAMEBy.CLASS_NAMEBy.XPATHなどが使用できます。

例えば、driver.find_element(By.ID, "element_id")のように記述します。

要素が見つからない場合、NoSuchElementExceptionが発生します。

find_elementの基本的な使い方

find_elementとは

find_elementは、Seleniumライブラリにおいて、指定した条件に基づいてWebページ上の要素を取得するためのメソッドです。

このメソッドを使用することで、ボタンやテキストフィールド、リンクなど、さまざまなHTML要素にアクセスし、操作を行うことができます。

find_elementとfind_elementsの違い

find_elementfind_elementsは、どちらも要素を取得するためのメソッドですが、以下のような違いがあります。

メソッド名説明戻り値の型
find_element条件に合致する最初の要素を1つ取得するWebElement
find_elements条件に合致するすべての要素をリストで取得するList[WebElement]

Byクラスの役割

Byクラスは、要素を検索するためのセレクタを指定するために使用されます。

以下のようなセレクタが用意されています。

セレクタ名説明
By.IDID属性で要素を取得
By.NAMEname属性で要素を取得
By.CLASS_NAMEclass属性で要素を取得
By.XPATHXPATHで要素を取得
By.CSS_SELECTORCSSセレクタで要素を取得
By.LINK_TEXTリンクテキストで要素を取得
By.PARTIAL_LINK_TEXT部分的なリンクテキストで要素を取得

要素を取得するための基本的な流れ

要素を取得するための基本的な流れは以下の通りです。

  1. WebDriverを初期化する
  2. 対象のWebページを開く
  3. find_elementメソッドを使用して要素を取得する
  4. 取得した要素に対して操作を行う

以下は、基本的な流れを示すサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# IDで要素を取得
element = driver.find_element(By.ID, "exampleId")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したテキスト

この流れを理解することで、Seleniumを使ったWebページの操作がスムーズに行えるようになります。

要素を取得するためのセレクタの種類

By.IDを使用した要素の取得

By.IDは、HTML要素のid属性を使用して要素を取得するためのセレクタです。

idはページ内で一意であるため、特定の要素を簡単に取得できます。

以下は、By.IDを使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# IDで要素を取得
element = driver.find_element(By.ID, "uniqueId")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したテキスト

By.NAMEを使用した要素の取得

By.NAMEは、HTML要素のname属性を使用して要素を取得するためのセレクタです。

フォーム要素などでよく使用されます。

以下は、By.NAMEを使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# name属性で要素を取得
element = driver.find_element(By.NAME, "exampleName")
# 取得した要素のテキストを表示
print(element.get_attribute("value"))
# WebDriverを終了
driver.quit()
取得した値

By.CLASS_NAMEを使用した要素の取得

By.CLASS_NAMEは、HTML要素のclass属性を使用して要素を取得するためのセレクタです。

複数の要素が同じクラス名を持つ場合、最初の要素が取得されます。

以下は、By.CLASS_NAMEを使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# class属性で要素を取得
element = driver.find_element(By.CLASS_NAME, "exampleClass")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したテキスト

By.XPATHを使用した要素の取得

By.XPATHは、XMLパス言語を使用して要素を取得するためのセレクタです。

複雑な条件で要素を取得することができ、非常に柔軟です。

以下は、By.XPATHを使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# XPATHで要素を取得
element = driver.find_element(By.XPATH, "//div[@class='exampleClass']/span")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したテキスト

By.CSS_SELECTORを使用した要素の取得

By.CSS_SELECTORは、CSSセレクタを使用して要素を取得するためのセレクタです。

CSSの知識があれば、直感的に要素を指定できます。

以下は、By.CSS_SELECTORを使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# CSSセレクタで要素を取得
element = driver.find_element(By.CSS_SELECTOR, ".exampleClass > span")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したテキスト

By.LINK_TEXTとBy.PARTIAL_LINK_TEXTの使い方

By.LINK_TEXTは、リンクテキストを使用して要素を取得するためのセレクタです。

完全なリンクテキストを指定する必要があります。

一方、By.PARTIAL_LINK_TEXTは、部分的なリンクテキストを使用して要素を取得するためのセレクタです。

以下は、両方を使用したサンプルコードです。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# 完全なリンクテキストで要素を取得
full_link = driver.find_element(By.LINK_TEXT, "完全なリンクテキスト")
print(full_link.get_attribute("href"))
# 部分的なリンクテキストで要素を取得
partial_link = driver.find_element(By.PARTIAL_LINK_TEXT, "部分的な")
print(partial_link.get_attribute("href"))
# WebDriverを終了
driver.quit()
完全なリンクのURL
部分的なリンクのURL

これらのセレクタを使いこなすことで、さまざまな要素を効率的に取得し、操作することが可能になります。

find_elementを使った具体例

IDでボタンをクリックする例

find_elementを使用して、特定のIDを持つボタンをクリックする方法を示します。

以下のサンプルコードでは、IDがsubmitButtonのボタンをクリックします。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# IDでボタンを取得し、クリック
button = driver.find_element(By.ID, "submitButton")
button.click()
# WebDriverを終了
driver.quit()
(特に出力はありませんが、ボタンがクリックされます)

クラス名でテキストを取得する例

次に、特定のクラス名を持つ要素からテキストを取得する方法を示します。

以下のサンプルコードでは、クラス名がmessageの要素からテキストを取得します。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# クラス名で要素を取得
element = driver.find_element(By.CLASS_NAME, "message")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したメッセージ

XPATHで複雑な要素を取得する例

XPATHを使用して、複雑な条件で要素を取得する方法を示します。

以下のサンプルコードでは、特定のクラス名を持つdiv内のspan要素を取得します。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# XPATHで要素を取得
element = driver.find_element(By.XPATH, "//div[@class='container']/span[@class='highlight']")
# 取得した要素のテキストを表示
print(element.text)
# WebDriverを終了
driver.quit()
取得したハイライトテキスト

CSSセレクタでフォームに入力する例

CSSセレクタを使用して、フォームに値を入力する方法を示します。

以下のサンプルコードでは、クラス名がinputFieldのテキストフィールドに値を入力します。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# CSSセレクタでテキストフィールドを取得
input_field = driver.find_element(By.CSS_SELECTOR, ".inputField")
# テキストフィールドに値を入力
input_field.send_keys("入力するテキスト")
# WebDriverを終了
driver.quit()
(特に出力はありませんが、テキストフィールドに値が入力されます)

これらの具体例を通じて、find_elementメソッドを使った要素の取得と操作がどのように行われるかを理解できるでしょう。

エラーハンドリング

NoSuchElementExceptionの対処法

NoSuchElementExceptionは、指定した条件に合致する要素が見つからない場合に発生する例外です。

このエラーを適切に処理するためには、以下の方法があります。

  1. 例外処理を使用する: try-exceptブロックを使用して、エラーが発生した場合の処理を記述します。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
try:
    # IDで要素を取得
    element = driver.find_element(By.ID, "nonExistentId")
    print(element.text)
except NoSuchElementException:
    print("要素が見つかりませんでした。")
# WebDriverを終了
driver.quit()
要素が見つかりませんでした。

要素が見つからない場合のリトライ方法

要素が見つからない場合にリトライする方法として、ループを使用して一定回数試行することができます。

以下のサンプルコードでは、最大3回リトライします。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import time
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
max_retries = 3
for attempt in range(max_retries):
    try:
        # IDで要素を取得
        element = driver.find_element(By.ID, "nonExistentId")
        print(element.text)
        break  # 成功したらループを抜ける
    except NoSuchElementException:
        print(f"試行 {attempt + 1} 回目: 要素が見つかりませんでした。")
        time.sleep(1)  # 1秒待機
# WebDriverを終了
driver.quit()
試行 1 回目: 要素が見つかりませんでした。
試行 2 回目: 要素が見つかりませんでした。
試行 3 回目: 要素が見つかりませんでした。

明示的な待機(WebDriverWait)の使い方

明示的な待機を使用することで、特定の条件が満たされるまで待機することができます。

WebDriverWaitを使用して、要素が表示されるまで待機する例を示します。

from selenium import webdriver
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 = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# 明示的な待機を使用して要素が表示されるまで待機
try:
    element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "dynamicElementId"))
    )
    print(element.text)
except Exception as e:
    print(f"エラーが発生しました: {e}")
# WebDriverを終了
driver.quit()
取得したテキスト

暗黙的な待機(implicitly_wait)の使い方

暗黙的な待機を設定することで、要素が見つかるまでの待機時間を指定できます。

以下のサンプルコードでは、暗黙的な待機を5秒に設定しています。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 暗黙的な待機を設定
driver.implicitly_wait(5)
# 対象のWebページを開く
driver.get("https://example.com")
# IDで要素を取得
try:
    element = driver.find_element(By.ID, "dynamicElementId")
    print(element.text)
except NoSuchElementException:
    print("要素が見つかりませんでした。")
# WebDriverを終了
driver.quit()
取得したテキスト

これらのエラーハンドリングの方法を活用することで、Seleniumを使用したWeb操作の信頼性を向上させることができます。

find_elementの応用例

動的に生成される要素を取得する方法

動的に生成される要素は、ページが読み込まれた後にJavaScriptによって追加されることがあります。

このような要素を取得するためには、明示的な待機を使用することが効果的です。

以下のサンプルコードでは、動的に生成される要素を取得する方法を示します。

from selenium import webdriver
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 = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# ボタンをクリックして動的に要素を生成
driver.find_element(By.ID, "loadButton").click()
# 明示的な待機を使用して動的に生成された要素を取得
try:
    dynamic_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "dynamicElementId"))
    )
    print(dynamic_element.text)
except Exception as e:
    print(f"エラーが発生しました: {e}")
# WebDriverを終了
driver.quit()
取得した動的要素のテキスト

複数の要素をループで処理する方法

複数の要素を取得し、ループで処理する方法を示します。

以下のサンプルコードでは、特定のクラス名を持つすべての要素を取得し、それぞれのテキストを表示します。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# クラス名で複数の要素を取得
elements = driver.find_elements(By.CLASS_NAME, "itemClass")
# 取得した要素をループで処理
for element in elements:
    print(element.text)
# WebDriverを終了
driver.quit()
要素1のテキスト
要素2のテキスト
要素3のテキスト

iframe内の要素を取得する方法

iframe内の要素を取得するためには、まずiframeに切り替える必要があります。

以下のサンプルコードでは、iframe内の要素を取得する方法を示します。

from selenium import webdriver
from selenium.webdriver.common.by import By
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# iframeに切り替え
driver.switch_to.frame("iframeName")
# iframe内の要素を取得
try:
    iframe_element = driver.find_element(By.ID, "iframeElementId")
    print(iframe_element.text)
except NoSuchElementException:
    print("iframe内の要素が見つかりませんでした。")
# 元のコンテンツに戻る
driver.switch_to.default_content()
# WebDriverを終了
driver.quit()
取得したiframe内の要素のテキスト

ポップアップウィンドウ内の要素を取得する方法

ポップアップウィンドウ内の要素を取得するためには、まずポップアップウィンドウに切り替える必要があります。

以下のサンプルコードでは、ポップアップウィンドウ内の要素を取得する方法を示します。

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# WebDriverを初期化
driver = webdriver.Chrome()
# 対象のWebページを開く
driver.get("https://example.com")
# ポップアップウィンドウを開くボタンをクリック
driver.find_element(By.ID, "popupButton").click()
# ウィンドウハンドルを取得
main_window = driver.current_window_handle
popup_window = [window for window in driver.window_handles if window != main_window][0]
# ポップアップウィンドウに切り替え
driver.switch_to.window(popup_window)
# ポップアップ内の要素を取得
try:
    popup_element = driver.find_element(By.ID, "popupElementId")
    print(popup_element.text)
except NoSuchElementException:
    print("ポップアップ内の要素が見つかりませんでした。")
# 元のウィンドウに戻る
driver.close()  # ポップアップを閉じる
driver.switch_to.window(main_window)
# WebDriverを終了
driver.quit()
取得したポップアップ内の要素のテキスト

これらの応用例を通じて、find_elementメソッドを使ったさまざまなシナリオでの要素の取得方法を理解できるでしょう。

まとめ

この記事では、Seleniumを使用してWebページ上の要素を取得するためのfind_elementメソッドの基本的な使い方や、さまざまなセレクタの種類、具体的な応用例、エラーハンドリングの方法について詳しく解説しました。

これにより、動的な要素や複数の要素を効率的に扱うためのテクニックを身につけることができるでしょう。

Seleniumを活用して、Web自動化やテストのスキルをさらに向上させるために、実際のプロジェクトでこれらの知識を積極的に活用してみてください。

関連記事

Back to top button
目次へ