【问题标题】:Puppeteer / Nodejs , How to wait for event conditions to be metPuppeteer / Nodejs , 如何等待事件条件满足
【发布时间】:2018-10-10 05:13:10
【问题描述】:

我对 nodejs 还很陌生,我正在使用 puppeteer 来自动化一些浏览,但是我对某个场景的复杂性有点迷失了。

我单击一个按钮,它会搜索一些记录(使用 ajax)并将结果放在页面上。

Wait for Response / request 不太合适,因为我正在等待 2-3 个请求,具体取决于搜索类型 - 每个请求的响应 URL 完全相同。所以,我想我想等待这个特定 URL 的 3 个 url 响应完成。

也许我需要重新考虑这一点,或者我很接近?承诺总是超时,即使它似乎在增加 responseCount

async function intercepted(resp) {
  if (resp.url().includes('/ajaxpro/')) {
    return 1
  }
  return 0
}

let responseCount = 0
page.on('response', async resp => {
  responseCount += await intercepted(resp)
})
const getResponse = await new Promise((resolve, reject) => {
  setTimeout(() => resolve(responseCount > 3), 60000)
})

【问题讨论】:

    标签: node.js puppeteer


    【解决方案1】:

    在收到每个响应后尝试检查条件。

    async function intercepted(resp) {
      if (resp.url().includes('/ajaxpro/')) {
        return 1
      }
      return 0
    }
    
    let responseCount = 0
    page.on('response', async resp => {
      let isTargetSearch = await intercepted(resp);
      responseCount += isTargetSearch;
    
      // - The current response is what we are looking for
      // - and reached 3 times.
      if(isTargetSearch && responseCount == 3) {
        // Do what you need to do here
      }
    })
    

    【讨论】:

    • 对不起,这不能回答我的问题。我想你可能会错过我想要实现的目标。 page.on 是从页面对象接收到响应时发生的异步事件。我想“暂停”直到 responseCount > 3 ,但在该代码之外 - 因为该代码仅响应浏览器中的活动 - 与代码序列无关。
    • 如果我理解正确,您想等待页面加载完毕,然后然后执行点击和搜索,对吗?
    • 感谢@Neverever。没那么简单。页面已加载,我们正在使用 ajax 调用 - 所以我们正在使用等待响应。问题是,有多个响应,而且它们都是相同的,所以我们必须等待 3 个相同的响应完成才能继续。
    【解决方案2】:

    也许您不必等到一定数量的响应被拦截,而是等到这些 AJAX 调用的结果在页面上呈现某些东西(等待 visual 结果)。在这种情况下,您将执行page.waitForSelector(selector),其中选择器是调用结果在屏幕上呈现的信息。

    在与 Puppeteer 打交道时,我通常发现等待可见结果会更好......

    【讨论】:

    • 抱歉 @YorkeUtopy ,因为它是一个“过滤器”,所有 3 个动作的结果都非常相似 - 并且没有什么与另一个不同的特定事件。我真的得到了答案,很快就会在这里发布。
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2012-01-10
    • 1970-01-01
    相关资源
    最近更新 更多