输入一个值时,我会使用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)

但这仅在enter值有效时才有效。如果不是,它将抛出一个错误,但是没有任何网络事件或负载事件。
这意味着,如果值不正确,我正在等待的元素将不会出现,并且将引发错误,从而关闭程序。
Navigation Timeout Exceeded: 30000ms exceeded

问题是:如何处理该错误,因此,如果引发超时错误,我可以捕获该错误并调用另一个函数?

最佳答案

只需将其包装在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();
})();

09-10 11:56
查看更多