【问题标题】:PUPPETER - Random timeout inside loop not workingPUPPETEER - 循环内的随机设置超时不起作用
【发布时间】:2021-01-11 22:09:40
【问题描述】:

所以,我有这样的代码(只有这部分不能正常工作)

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    // slowMo: 250 // slow down by 250ms
  });
  const page = await browser.newPage();
//some code

// CODE ABOVE WORKS, here is what is not working inside of it:

await page.evaluate(() => {
    function delay(timeout) {
      return new Promise((resolve) => {
        setTimeout(resolve, timeout);
      });
    }
    function randomInteger(min, max) {
      return Math.floor(Math.random() * (max - min + 1)) + min;
    }
    const farms = document.querySelectorAll(".startButton");
    for (let i = 0; i < 3; i++) {
      for (const farm of farms) {
        farm.click();
      }
      delay(randomInteger(820000, 920000));
    }
  });
})();

我想要的是,选择这个类的所有按钮,单击它们,然后等待一段时间,然后再次单击它们,但看起来延迟功能在这里不起作用 - 或者没有执行(但在其他部分代码,它可以正常工作,所以我知道哪里有问题,我请求你的帮助!:D

#EDIT

代码(如@Sheun Aluko 所说,添加了异步和等待)很好,由于网站安全系统,它无法正常工作,所以我需要应用刷新/转到同一页面的新修复程序,并更改循环顺序,也许它效率不高,但它可以 100% 工作。 这是一个例子:

(async () => {
  const browser = await puppeteer.launch({
    headless: false,
    // slowMo: 250 // slow down by 250ms
  });

//SOME CODE THAT WORKS
//OUR PART BELOW

  for (let i = 0; i < 150; i++) {
    await page.goto("SOME_URL", {
      waitUntil: "networkidle2",
    });
    await page.evaluate(async (page) => {
      function delay(timeout) {
        return new Promise((resolve) => {
          setTimeout(resolve, timeout);
        });
      }
      function randomInteger(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
      }

      const farms = document.querySelectorAll('SOME_SELECTOR');

      for (const farm of farms) {
        farm.click();
      }
      await delay(randomInteger(840000, 960000));
    });
  }
})

【问题讨论】:

    标签: javascript loops timeout puppeteer


    【解决方案1】:

    我可以看到delay 函数返回了一个承诺。在最后一行中,我认为您应该改为调用 await delay(randomInteger(820000, 920000)),以便循环在下一次迭代之前真正等待。

    针对您提到的错误,这是因为您传递给 page.evaluate 的函数未标记为异步。我对 Puppeteer 并不完全熟悉,但您可以尝试将提供的功能标记为异步......即:

    await page.evaluate( async () => { 
       ....
    })
    

    【讨论】:

    • 当我像你说的那样使用 await 时,我收到: SyntaxError: await is only valid in async function
    • 请查看我上面编辑的答案来解决这个问题
    • 是的,谢谢,我们将在 15 分钟后看到。如果它有效,谢谢! :D
    • 嗯.. 很抱歉,也许其他更熟悉 Puppeteer 框架的人现在可以介入并提供帮助...
    • 是的,无论如何感谢您的帮助!新的一年万事如意! :D
    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 2017-08-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多