【问题标题】:Puppeteer - Handlin page.waitForSelector() failsPuppeteer - Handlin page.waitForSelector() 失败
【发布时间】:2019-01-03 14:24:47
【问题描述】:

如果page.waitForSelector() 失败,则会引发错误。因为这是在异步函数中运行的,如果直接导致代码的捕获部分。

如果page.waitForSelector() 失败,是否有可能在下面一行执行代码?

像这样(伪代码):

if ( (await page.waitForSelector('.test') == null) { //do X}

来自 API:

如果选择器在等待超时毫秒后没有出现,函数将抛出。

我如何管理在同一个代码块中的抛出,就好像函数会成功一样?

【问题讨论】:

    标签: node.js async-await puppeteer


    【解决方案1】:

    我如何检测选择器是否存在于这样的循环中:

    if (await page.$('.test')) {
      break
    }
    

    请记住,在那之后,您不需要waitForSelector 或任何waitFor,因为您已经知道此选择器存在,所以只需继续程序,如下所示:

    (仅用于演示目的,不要这样使用它......如果网站有任何“机器人保护”,它会在第二次重新加载后让你离开,可能你想为此添加一些超时,以模拟用户重新加载的时间:await new Promise(resolve => setTimeout(resolve, 5000)),在重新加载之前)

    while(true) {
        if (await page.$('.test')) {
          break
        }
        page.reload()
    }
    
    page.click('.test')
    

    【讨论】:

      【解决方案2】:

      你为什么不抓住page.waitForSelector 抛出的错误并在之后执行类似这样的操作 -

      (async() => {
      
           try {
              page.waitForSelector(selector);
           } catch(error) {
             // do as you wish with this error and then do your next actions
      
                 try {
                      page.goto('someUrl');
                 } catch(error) {
                     throw new Error(error);
                 }
           }
      
      })
      

      【讨论】:

      • 谢谢!我不知道我可以把它放在 try catch 块中。我的 page.waitForSelector() 在 while 循环内。如果 waitForSelector() 失败,我希望 while 循环中断;。只是。如果在 catch 块中声明了中断,while 循环的中断是否会起作用?
      • 是的,它会起作用的。请看这篇文章 - stackoverflow.com/questions/5910817/…
      • 优秀的回答。非常比你!
      猜你喜欢
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2021-04-13
      • 1970-01-01
      相关资源
      最近更新 更多