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
を使用する。