Puppeteerでエラーでないのに処理が途中停止はdialog.dismiss不足

headless: trueでalertだと停止する

Puppeteerを使用していると「エラーでないのに処理が途中停止する」という問題が起きるケースがある。

原因はalertなどをheadless: true (ブラウザ非表示) で実行して処理が進まなくなっているケースが多い。

alertを使用すると停止する理由

headless: false (ブラウザ表示) で考えれば理由は明白だ。alertを使用するということはダイアログが表示されるということなのでOKを押さなければ処理が先に進まない。

これはalertだけでなくconfirmやpromptなどでも同様である。

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({
    headless: true
  })
  const page = await browser.newPage()
  await page.goto('https://www.google.com/')
  await page.evaluate(() => alert('処理終了'))
  await browser.close()
})()

alertを使用しても停止させない方法

alertを使用しても停止させないようにするにはpage.on('dialog'〜を追加してawait dialog.dismiss()を記述すれば処理が停止せず継続する。

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({
    headless: true
  })
  const page = await browser.newPage()
  await page.goto('https://www.google.com/')
  page.on('dialog', async dialog => {
    console.log(dialog.message())
    await dialog.dismiss()
  })
  await page.evaluate(() => alert('処理終了'))
  await browser.close()
})()