1. ページ上の要素を検索する基本
要素検索メソッドの使用
Seleniumを実際のプロジェクトで使い始めると、最初のタスクの一つがページ上の要素を検索することになるよ。これはホテルでエレベーターのボタンを探すようなもので、どこにあるかを知って押して目的の階に行くためだね。
Seleniumは要素を検索するいくつかの方法を提供しているんだ。好みに応じて、find_element_by_id、find_element_by_name、find_element_by_xpath、find_element_by_css_selectorなどが使えるよ。これまで学んだことを思い出しながら、簡単な例を書いてみよう:
from selenium import webdriver
# ブラウザのインスタンスを作成 (ここではChromeを使用)
driver = webdriver.Chrome()
# ページを開く
driver.get('http://example.com')
# IDで要素を検索
element_by_id = driver.find_element_by_id('main')
# 名前で要素を検索
element_by_name = driver.find_element_by_name('username')
# XPathで要素を検索
element_by_xpath = driver.find_element_by_xpath('//div[@class="content"]')
# CSSセレクターで要素を検索
element_by_css = driver.find_element_by_css_selector('div.content')
find_elementとfind_elementsの違い
複数の要素を取得したい時 (例えば、すべての btn クラスのボタン)、find_elements メソッドが必要だよ。find_elementとfind_elementsの違いは、前者は1つの要素を返し、後者は要素リストを返すことだね。
# 1つの要素を検索
single_element = driver.find_element_by_class_name('btn')
# 複数の要素を検索
multiple_elements = driver.find_elements_by_class_name('btn')
# 見つかった要素をループ処理
for element in multiple_elements:
print(element.text)
見ての通り、find_elementsはページ上に複数存在する可能性のある要素のコレクションを扱うのに最適だね。find_element_xxxメソッドにはそれぞれ対応するfind_elements_xxxがあり、それが要素リストを返すよ。
2. 要素とのインタラクション
ボタン、リンク、入力フィールドとのやりとり
要素の検索を思い出したところで、次はそれらとどうやってやりとりするかだね!これはLEGOで遊ぶみたいなもので、正しくパーツを組み合わせて期待通りの動きを実現する感じかな。
Seleniumが提供するメソッドを使って要素とのインタラクションができるんだ。さっそく例を見てみよう:
# ボタンのクリック
button = driver.find_element_by_id('submit')
button.click()
# テキストを入力フィールドに入力
input_field = driver.find_element_by_name('q')
input_field.send_keys('Python selenium tutorial')
# 要素のテキストを取得
header = driver.find_element_by_tag_name('h1')
print(header.text)
動的な要素とイベントの処理
動的な要素 (特定の操作後にのみ表示されるボタンなど) と作業するときは、遅延や待機を考慮することが重要だよ。Seleniumはそういった要素の読み込みを待つ手段を提供していて、その1つがWebDriverWaitとexpected_conditionsの組み合わせだ。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ボタンが表示されるのを10秒間待つ
button = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, 'submit'))
)
button.click()
備考。 毎回expected_conditionsを書くのは面倒だから、インポート時にECとして名前を変えたよ。
待機を使うことでスクリプトがより信頼性を持ち、ページの読み込みが遅いせいで壊れることがなくなるんだ。実際、こうした問題は頻繁に発生するからね。
3. 何がうまくいかない可能性があるの?
何もかも。何もかもうまくいかないかもしれない。 要素とのやりとりを始めようとしたのに、突然何かがうまくいかないことがあるよ。ここでは、その道で待ち受けている典型的なエラーについて話そう。
まず、NoSuchElementException — これは要素がページ上に存在しない場合によく見るエラーメッセージだね。このエラーは、存在しない要素を探そうとしたときに発生するよ。こうした状況を防ぐために、try-exceptを使って例外を処理することができるんだ。
from selenium.common.exceptions import NoSuchElementException
try:
element = driver.find_element_by_id('non_existent_id')
except NoSuchElementException:
print("おっと、要素が見つからなかったみたい!")
また、動的な要素や読み込み時間の問題も発生する可能性があるよ。この場合、先ほど話したWebDriverWaitを使って要素読み込みを待つといいね。
GO TO FULL VERSION