javascript - Puppeteer : Timeout or sleep or wait inside Page.Evaluate() - Stack Overflow

I need a way to add some delay between clicking elements inside a page.evaluate functionbelow is what i

I need a way to add some delay between clicking elements inside a page.evaluate function

below is what ive tried and it does not work

const result = await page.evaluate(async () => {
        let variants = document.querySelectorAll(".item-sku-image a");


        variants.forEach(async variant => {   
           await new Promise(function(resolve) { 
           setTimeout(resolve, 1000)
           });         
            await variant.click()
        });
        return data
    });

Update:

the for loop below works fine for one element when i try to use another for loop inside it - it goes crazy

const variants = [...document.querySelectorAll(".item-sku-image a")]; // Turn nodelist into an array
const sizes = [...document.querySelectorAll(".item-sku-size a")]; // Turn nodelist into an array

for (let variant of variants){
  // wait one second
  await new Promise(function(resolve) {setTimeout(resolve, 1000)});
  await variant.click()
  for (let size of sizes){
   // wait one second
   await new Promise(function(resolve) {setTimeout(resolve, 1000)});
   await size.click()
 }
}

I need a way to add some delay between clicking elements inside a page.evaluate function

below is what ive tried and it does not work

const result = await page.evaluate(async () => {
        let variants = document.querySelectorAll(".item-sku-image a");


        variants.forEach(async variant => {   
           await new Promise(function(resolve) { 
           setTimeout(resolve, 1000)
           });         
            await variant.click()
        });
        return data
    });

Update:

the for loop below works fine for one element when i try to use another for loop inside it - it goes crazy

const variants = [...document.querySelectorAll(".item-sku-image a")]; // Turn nodelist into an array
const sizes = [...document.querySelectorAll(".item-sku-size a")]; // Turn nodelist into an array

for (let variant of variants){
  // wait one second
  await new Promise(function(resolve) {setTimeout(resolve, 1000)});
  await variant.click()
  for (let size of sizes){
   // wait one second
   await new Promise(function(resolve) {setTimeout(resolve, 1000)});
   await size.click()
 }
}
Share Improve this question edited May 14, 2019 at 15:01 Limpfro asked May 13, 2019 at 21:09 LimpfroLimpfro 1776 silver badges12 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 5

.forEach will not work with the promises or async...await the way you want.

Use for..of instead.

const variants = [...document.querySelectorAll(".item-sku-image a")]; // Turn nodelist into an array
for (let variant of variants){
  // wait one second
  await new Promise(function(resolve) {setTimeout(resolve, 1000)});
  await variant.click()
}

It's easy to read, understand and implement.

Here are some references:

  • https://developer.mozilla/en-US/docs/Web/JavaScript/Reference/Statements/for...of
  • https://stackoverflow./a/37576787/6161265

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745666907a4639174.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信