我们可以明确地捕获 Puppeteer (Chrome/Chromium) 错误 net::ERR_ABORTED 吗?

Can we explicitly catch Puppeteer (Chrome/Chromium) Error net::ERR_ABORTED?

提问人:anthumchris 提问时间:11/2/2020 最后编辑:Josh Correiaanthumchris 更新时间:7/16/2023 访问量:4676

问:

我们可以明确和具体地捕获 Puppeteer (Chrome/Chromium) 错误吗?还是字符串匹配是目前唯一的选择?net::ERR_ABORTED

page.goto(oneClickAuthPage).catch(e => {
  if (e.message.includes('net::ERR_ABORTED')) {}
})

/*  "net::ERROR_ABORTED" occurs for sub-resources on a page if we navigate
 *  away too quickly. I'm specifically awaiting a 302 response for successful
 *  login and then immediately navigating to the auth-protected page.
 */
await page.waitForResponse(res => res.url() === href && res.status() === 302)
page.goto(originalRequestPage)

理想情况下,这类似于我们可以捕捉到的潜在事件page.on('requestaborted')

JavaScript Google-chrome 傀儡师 Chromium

评论

1赞 Stéphane Klein 6/13/2021
另请参阅此 GitHub 问题:github.com/puppeteer/puppeteer/issues/7327

答:

-1赞 Ruben Verster 3/29/2022 #1

我建议将您的 api 调用等放在 trycatch 块中 如果失败,您将捕获错误,就像您当前所做的那样。但它看起来更好一点

try {
 await page.goto(PAGE)
} catch(error) {
  console.log(error) or console.error(error)
  //do specific functionality based on error codes
  if(error.status === 300) {
    //I don't know what app you are building this in
    //But if it's in React, here you could do 
    //setState to display error messages and so forth
    setError('Action aborted')
    
    //if it's in an express app, you can respond with your own data
    res.send({error: 'Action aborted'})
  }
}

如果 Puppeteer 中止时的错误响应中没有特定的错误代码,则意味着 Puppeteer 的 API 没有被编码为返回这样的数据,不幸的是:')

像您在问题中所做的那样进行错误消息检查的情况并不少见。不幸的是,这是我们唯一能做到这一点的方法,因为这是我们被赋予的工作:'P

-1赞 Logic 4/21/2023 #2

对于其他人

如果您在 https:ERR_ABORTED....
然后主要是由于互联网问题,快速导航或网站问题
,请尝试以下代码:

var count = 0;
const page = await browser.newPage()
page.setDefaultNavigationTimeout(0)
function loop() {
  page.goto('Your URL').catch(err => {
    // If any Error occurs then run the goto 3 or 4 times which worked for me
    if (err && count < 4) {
      console.log(count) 
      count++
      if (count > 3) {
        console.log("Internet/Website Problem")
        page.close();  
      }
      // Use Selector to wait for your element or thing to appear
      page.waitForSelector(
        "Your Element",
        { visible: true, timeout: ((count * 1000) + 1000)}).catch(() => { loop() }
      )
    }
  })
}

await loop()

对于给定的问题

如果你想抓住Puppeteer (Chromme/Chromium)错误,如net::ERR_ABORTED?
然后你必须使用字符串格式的错误,根据我的研究,到目前为止我没有找到任何错误状态代码。

-1赞 Josh Correia 7/16/2023 #3

由于没有其他人直接回答您的问题,字符串匹配似乎仍然是唯一的选择。

以下是我在特别容易出现ERR_ABORTED错误的区域使用的一些示例代码:

try {
    await page.goto(oneClickAuthPage)
} catch (err) {
    if (err instanceof Error && err.message.startsWith('net::ERR_ABORTED')) {
        console.log("Caught ERR_ABORTED")
        // handle the error however you want
    }
    else {
        throw err
    }
}

这是我最初得到这个解决方案的地方,减去我为匹配您的问题而编辑的部分。