PuppeteerのwaitForNavigationで正しくページ遷移を待つ
更新日:2020.07.16
作成日:2020.01.30
「Puppeteer入門 スクレイピング+Web操作自動処理プログラミング」
を読むまで、Puppeteer
のwaitForNavigation
の動きを誤って理解していました。
ここでは、Puppeteer
を利用して「ページ遷移を待つ」というよくある処理における誤った実装と正しい実装を紹介します。
誤った実装 やりがちなNGパターン
Puppeteer
で非同期処理を同期的に記述するawait
を用いて、click後にページ遷移を待つという処理を思い浮かべた場合、次のような書き方をしがちです。
await page.click('.some .a');
await page.waitForNavigation({ waitUntil: 'load'});
waitForNavigation
とは、「waitForNavigationを呼び出してから次の遷移を待つ」という意味の処理です。
上記の書き方だと、waitForNavigation
を呼び出した時には、すでにclickによるページ遷移処理は終わっています。よって、Navigation Timeout Exceeded
エラーになってしまいます。
私は、このwaitForNavigation
をずっと理解しないまま利用していて、しばしばエラーに悩まされていました。
正しくページ遷移を待つ処理
正しい実装としては、Promise.all
を利用して、waitForNavigation
とclick
を同時に呼び出すことで、クリックしてページ遷移を待つ処理となります。
await page.goto('http://example.com');
await Promise.all([
page.waitForNavigation({ waitUntil: 'load'}),
page.click('.some .a'),
]);
参考
Related contents
TECH
2020.07.04
puppeteerをAWS Lambdaで利用する
TECH
2020.04.20
Puppeteerを使ってQrunchへクロス投稿する
TECH
2017.08.22
PuppeteerでAmazonアフィリエイトのレポートを取得する
TECH
2016.02.01
Nightmare.jsでAmazonアフィリエイトのレポートを取得する
TECH
2011.11.15
Pythonでスクレイピングに挑戦。〜mixiの日記をEvernoteへ放り込みたい〜