【问题标题】:async for loop with puppeteer与 puppeteer 的异步 for 循环
【发布时间】:2020-06-14 00:52:15
【问题描述】:

我正在尝试使用 puppeteer.js 使浏览器自动化,并且我正在单击模式和滚动中的一长串 div 中的一个 div。我循环遍历要单击的 div 并按顺序单击它们。似乎如果我给浏览器足够的时间,它会滚动到正确的位置,然后单击 div。

这个例子有效:

users_names[14].click().catch(function(error){console.log("some error ", "position", error)});
await delay(2000);
users_names[45].click().catch(function(error){console.log("some error ", "position", error)});
await delay(2000);
users_names[54].click().catch(function(error){console.log("some error ", "position", error)});
await delay(2000);
users_names[0].click().catch(function(error){console.log("some error ", "position", error)});
await delay(2000);
users_names[29].click().catch(function(error){console.log("some error ", "position", error)});

但很明显,如果我想点击不同的元素,我不能对它们进行硬编码。我试过这样做,但是滚动和单击元素的速度太快了。

_.forEach(namesToSend, function(n) {
    var position = memberOrder.indexOf(n)
    console.log('position: ', position)
    if(position != -1)
    users_names[position].click().catch(function(error){console.log("some error ", position, error)});
});

我怎样才能让这个循环变慢,让它在继续之前等待点击事件?

【问题讨论】:

  • 我提供的答案是否解决了您的问题?

标签: javascript node.js asynchronous puppeteer


【解决方案1】:

click 方法返回一个承诺,因此在 ForEach 内它不会工作。你需要像这样使用for..of循环

for (const name of namesToSend) {
  try {
    var position = memberOrder.indexOf(name);
    if (position != -1) await users_names[position].click();
  } catch (error) {
    console.log("some error ", position, error);
  }
}

【讨论】:

    猜你喜欢
    • 2012-12-20
    • 2017-05-19
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 2019-03-22
    • 2019-02-15
    相关资源
    最近更新 更多