如何解决PUPPETER - 循环内的随机超时不起作用
所以,我有这样的代码(只有这部分工作不正常)
(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));
});
}
})
解决方法
我可以看到 delay
函数返回一个承诺。在最后一行中,我认为您应该改为调用 await delay(randomInteger(820000,920000))
,以便循环在下一次迭代之前实际等待。
针对您提到的错误,发生这种情况是因为您传递给 page.evaluate 的函数未标记为异步。我对 Puppeteer 并不完全熟悉,但是您可以尝试将提供的函数标记为异步...即:
await page.evaluate( async () => {
....
})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。