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