PythonでWeb操作を自動化する際に便利なライブラリが Playwright です。
その中でも .wait_for_selector()
は、特定の要素が表示されるまで処理を一時停止するための重要なメソッドです。
ボタンやフォームなどが動的に表示されるWebページにおいて、安定した自動化を行うためには欠かせません。
この記事では .wait_for_selector()
の基本的な使い方から、似たメソッド .wait_for_timeout()
との違い、注意点までをわかりやすく丁寧に解説します。
.wait_for_selector() とは?
.wait_for_selector()
は、指定したCSSセレクターに一致する要素がDOMに現れるまで待機する Playwrightのメソッドです。
- ページの読み込みが終わっていなくても、対象の要素が表示されるまで処理を一時停止
- JavaScriptによって動的に描画される要素の待機に最適
- デフォルトでは「表示されるまで(visibleになるまで)」待ってくれる
たとえば、「読み込み完了後に表示されるボタンが出てくるまで待ってからクリックしたい」といった場面でよく使います。
具体例①:要素が表示されるのを待ってからクリックする
1 2 3 4 5 6 7 8 9 10 11 12 |
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.goto("https://example.com") page.wait_for_selector("button#start") # ボタンが出てくるのを待つ page.click("button#start") # 出てきたボタンをクリック browser.close() |
- ページ遷移後、"button#start" というIDのボタンが表示されるまで待機
- ボタンが表示されたらクリック処理を実行
これにより、ボタンが読み込み中だったり非表示のままクリックしようとしてエラーになるのを防げます。
具体例②:フォーム入力欄が表示されるまで待ってから操作
1 2 3 4 5 |
page.goto("https://example.com/login") page.wait_for_selector("input[name='username']") page.fill("input[name='username']", "user123") page.fill("input[name='password']", "pass123") |
このコードでは:
- ページ遷移後、
input[name='username']
という名前属性を持つ入力欄が表示されるまで待機 - 入力欄が表示されたことを確認してから、ユーザー名とパスワードを順に入力
これにより、フォームの読み込みが遅れていても、それを待たずに入力を始めてエラーになるといった問題を防ぐことができます。
.wait_for_selector() のオプション
.wait_for_selector()
は、ただ待機するだけではなく、どういう状態になるまで待つかやどれくらいの時間待つかといった細かい条件を指定することができます。
これらの条件を「オプション引数」として渡すことで、より柔軟で安定した動作が可能になります。
よく使うオプションは以下の通りです。
-
timeout=5000
→ 最大5秒間待機します。単位はミリ秒で、デフォルトは 30,000(30秒)です。 -
state="attached"
→ 要素がDOMに追加されたら待機終了します。まだ表示されていない(非表示)の場合でもOKです。 -
state="visible"
(デフォルト)
→ 要素が表示状態になったときに待機を終了します。 -
state="hidden"
→ 要素が非表示(display: none や visibility: hidden など)になるまで待ちます。 -
state="detached"
→ 要素が完全にDOMツリーから削除されるまで待機します。
.wait_for_selector() との違い
Playwright では「待ち処理」がとても重要ですが、その中でも .wait_for_selector()
と .wait_for_timeout()
はよく使われるメソッドです。
どちらも「何かを待つ」ためのものですが、その性質と使いどころは大きく異なります。
以下に、両者の違いを表でまとめてみましょう。
メソッド名 | 意味 | 特徴 |
---|---|---|
.wait_for_selector() |
指定した要素が表示されるまで待機 | 状態を監視して処理を自動で進める(推奨) |
.wait_for_timeout() |
指定した時間だけ機械的に停止(ミリ秒単位) | 状態を見ないので処理が早すぎる可能性がある |
.wait_for_timeout()
はただ時間で待つだけなので、動的な要素には不向きです。
一方 .wait_for_selector()
は、対象の要素が実際に表示されるまでちゃんと見張ってくれるため、Web自動化ではこちらを優先的に使うのがベストです。
注意点とコツ
.wait_for_selector()
はとても便利なメソッドですが、正しく使うためには下記ポイントを押さえておく必要があります。
- セレクターはCSS形式で記述(
#id
,.class
,tag[attribute=value]
など) - ページによっては非表示→表示になるまでに数秒かかることがあるので、適切な
timeout
を設定する - 要素が非同期的に追加される場合は
state="attached"
や"visible"
を使い分ける
まとめ
今回は .wait_for_selector()
の使い方と .wait_for_timeout()
との違いについて詳しく解説しました。
.wait_for_selector()
は、指定したセレクターの要素が表示されるまで処理を一時停止する- JavaScriptによって遅れて表示される要素の操作にとても有効
.wait_for_timeout()
よりも安全で信頼性が高いstate
やtimeout
をうまく使い分けることで、より柔軟な待機ができる
動的なWebページの操作では、.wait_for_selector()
をしっかり使えるかどうかが成功のカギになります。
タイミングによるエラーを防ぎ、安定した自動化スクリプトを作るために、ぜひ積極的に活用していきましょう。