puppeteerを使う時のTips
Headless chrome apiのpuppeteerを触ってみたので躓いたところ等のメモ。
GitHub - puppeteer/puppeteer: Headless Chrome Node.js API
Node is either not visible or not an HTMLElement
Error: Node is either not visible or not an HTMLElement
指定されたDOMはないのにそこへアクセスする時に出る。セレクタの指定がだいたい間違っている。
Protocol error (Runtime.callFunctionOn): Target closed.
(node:75130) UnhandledPromiseRejectionWarning: Error: Protocol error (Runtime.callFunctionOn): Target closed.
これもたまに出た。DOMへのアクセスより前にブラウザを閉じてたりすると起こる。
自分の場合は処理の最後で browser.close(); とawaitせずにブラウザを閉じる処理を書いていた。await browser.close()に変更することで解決。
classで要素を指定して押下したいとき
page.click('#id');
Idを指定する時などはこういった指定で問題ないが、classで要素を指定したい時はclick処理が動かない時があった。
const loginButton = await page.$('.login');
await loginButton.click();
一度要素を取得してからclickするように変更すると期待通りに動く。
ref:
PDFでページを出力
await page.pdf({
path: 'output.pdf',
});
Error: Protocol error (Page.printToPDF): PrintToPDF is not implemented
上記のエラーが出た場合は headless を有効にすると期待通りに動く。
const browser = await puppeteer.launch({
headless: true,
});
ref:
PuppeteerのちょっとしたTipsいろいろ - ゆるふわ技術日誌
TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded
await page.goto('https://hoge.com');
goto() を利用してTimeoutErrorが出る場合は、waitUntil オプションを付与することで解決する。
await page.goto('https://hoge.com', {waitUntil: 'networkidle2'});
ref: MEMO: PuppeteerでSPA(Single Page Application)を操作する時の留意点 - Qiita
参照記事のようにnetworkidle を使用すると v1.20.0 では Error: ERROR: "networkidle" option is no longer supported. Use "networkidle2" instead のエラーが出るのでnetworkidle2 を使用する。