Puppeteer page.waitForNavigation() 超时错误处理

新手上路,请多包涵

使用 puppeteer,我在输入值时打开一个页面 - 它输出结果。

 await page.click('button[class="button form-button rs-gcbalance-btn"]')

await page.waitForSelector('div[class="small-4 large-4 rs-gcbalance-result-num-col').catch(err => console.log(err))

await page.evaluate((card) => {
    console.log(card + " - " + document.querySelectorAll('div[class="small-4 large-4 rs-gcbalance-result-num-col"]')[1].querySelector('span').innerHTML)
}, card)

但只有当输入的值有效时,它才能正常工作。如果不是,它会抛出一个错误,但没有任何网络活动或加载事件。

这意味着,如果值不正确,我正在等待的元素将不会出现并将抛出错误,关闭程序。

 Navigation Timeout Exceeded: 30000ms exceeded

问题是:如何处理错误,所以如果它抛出超时错误,我可以捕获它并调用另一个函数?

原文由 almarc 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

只需将其包装在 try catch 块中:

 try {
  await page.waitForSelector('#element', { timeout: 1000 });
  // do what you have to do here
} catch (e) {
    console.log('element probably not exists');
}

这是一个完整的示例:

 const puppeteer = require('puppeteer');

const html = `
<html>
    <body>
        <div id="element">element inner html</div>
    </body>
</html>`;

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(`data:text/html,${html}`);

  try {
    await page.waitForSelector('#element-not-exists', { timeout: 1000 });
    const element = await page.$('#element-not-exists');
    console.log(await (await element.getProperty('innerHTML')).jsonValue());
  } catch (e) {
    console.log('element probably not exists');
  }
  await browser.close();
})();

原文由 Everettss 发布,翻译遵循 CC BY-SA 4.0 许可协议

try catch 块是一个解决方案。

但是,在接受的答案中 ,所有错误都被静音了

您应该只捕获 Puppeteer TimeOut 错误。

 try {
  await page.waitForSelector('.foo');
} catch (e) {
  if (e instanceof puppeteer.errors.TimeoutError) {
    // Do something if this is a timeout.
  }
}

参考资料:https: //devdocs.io/puppeteer/

原文由 Victor 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏