ナビゲーション
概要
Playwright は URL にナビゲートし、ページインタラクションによって引き起こされるナビゲーションを処理できます。
基本的なナビゲーション
最もシンプルなナビゲーションの形は、URL を開くことです。
- 同期
- 非同期
# Navigate the page
page.goto("https://example.com")
# Navigate the page
await page.goto("https://example.com")
上記のコードはページをロードし、ウェブページがloadイベントを発行するのを待ちます。load イベントは、スタイルシート、スクリプト、iframe、画像など、すべての依存リソースを含め、ページ全体がロードされたときに発行されます。
ページがload
の前にクライアントサイドリダイレクトを行う場合、page.goto()はリダイレクトされたページがload
イベントを発行するのを待ちます。
ページはいつロードされるのか?
最近のページは、load
イベントが発行された後も多数のアクティビティを実行します。データは遅延ロードされ、UI が設定され、高負荷なリソース、スクリプト、スタイルがload
イベント後にロードされます。ページがloaded
であるかどうかを判断する方法はありません。それはページ、フレームワークなどに依存します。では、いつインタラクションを開始できるのでしょうか?
Playwright では、いつでもページとインタラクションできます。ターゲット要素が操作可能になるまで自動的に待機します。
- 同期
- 非同期
# Navigate and click element
# Click will auto-wait for the element
page.goto("https://example.com")
page.get_by_text("example domain").click()
# Navigate and click element
# Click will auto-wait for the element
await page.goto("https://example.com")
await page.get_by_text("example domain").click()
上記のシナリオでは、Playwright はテキストが可視になるのを待ち、その要素に対する残りの操作可能性チェックがパスするのを待ち、クリックします。
Playwright は非常に高速なユーザーとして動作します。ボタンが見えた瞬間にクリックします。一般的に、すべてのリソースがロードされたかどうかなどを気にする必要はありません。
ハイドレーション
ある時点で、Playwright がアクションを実行しても、何も起こらないように見えるユースケースに遭遇するでしょう。または、入力フィールドにテキストを入力しても消えてしまうことがあります。その背後にある最も可能性の高い理由は、ページのハイドレーションが不十分であることです。
ページがハイドレーションされると、最初にページの静的バージョンがブラウザに送信されます。次に、動的な部分が送信され、ページが「ライブ」になります。非常に高速なユーザーとして、Playwright はページを見た瞬間にインタラクションを開始します。そして、ページのボタンが有効になっているにもかかわらず、リスナーがまだ追加されていない場合、Playwright はそのジョブを実行しますが、クリックは効果がありません。
ページがハイドレーション不足に悩まされているかどうかを確認する簡単な方法は、Chrome DevTools を開き、Network パネルで「Slow 3G」ネットワークエミュレーションを選択してページをリロードすることです。目的の要素が表示されたら、それを操作します。ボタンのクリックが無視され、入力したテキストが後続のページロードコードによってリセットされることがわかります。この問題の正しい修正方法は、ページが完全に機能するハイドレーション後まで、すべてのインタラクティブコントロールが無効になっていることを確認することです。
ナビゲーションの待機
要素をクリックすると、複数のナビゲーションがトリガーされる可能性があります。このような場合、特定の URL へのpage.wait_for_url()を明示的に行うことをお勧めします。
- 同期
- 非同期
page.get_by_text("Click me").click()
page.wait_for_url("**/login")
await page.get_by_text("Click me").click()
await page.wait_for_url("**/login")
ナビゲーションイベント
Playwright は、ページに新しいドキュメントを表示するプロセスを、ナビゲーションとロードに分割します。
ナビゲーションの開始は、ページ URL を変更するか、ページとインタラクションすること(リンクをクリックするなど)によって行われます。ナビゲーションの意図は、たとえば、解決されていない DNS アドレスにヒットした場合や、ファイルのダウンロードに変換された場合にキャンセルされる可能性があります。
ナビゲーションのコミットは、レスポンスヘッダーが解析され、セッション履歴が更新されたときに行われます。ナビゲーションが成功(コミット)した後でのみ、ページはドキュメントのロードを開始します。
ロードは、ネットワーク経由で残りのレスポンスボディを取得し、解析し、スクリプトを実行し、ロードイベントを発行することをカバーします。
- page.url が新しい URL に設定されます
- ドキュメントコンテンツがネットワーク経由でロードおよび解析されます
- page.on("domcontentloaded") イベントが発行されます
- ページはいくつかのスクリプトを実行し、スタイルシートや画像などのリソースをロードします
- page.on("load") イベントが発行されます
- ページは動的にロードされたスクリプトを実行します