javascriptnode.jschromiumpuppeteerbrowser-testing

puppeteer: wait N seconds before continuing to the next line


In puppeteer I would like to wait a defined time before going to the next line of code.

I've tried to put a setTimeout in an evaluate function but it seems to be simply ignored

console.log('before waiting');
await page.evaluate(async() => {
  setTimeout(function(){
      console.log('waiting');
  }, 4000)
});
console.log('after waiting');

This code don't wait and just write before waiting and after waiting

Do you know how to do this?


Solution

  • You can use a little promise function,

    function delay(time) {
       return new Promise(function(resolve) { 
           setTimeout(resolve, time)
       });
    }
    

    Then, call it whenever you want a delay.

    console.log('before waiting');
    await delay(4000);
    console.log('after waiting');
    

    If you must use puppeteer use the builtin waitForTimeout function.

    await page.waitForTimeout(4000)
    

    If you still want to use page.evaluate, resolve it after 4 seconds. You are not resolving anything.

    await page.evaluate(async() => {
        await new Promise(function(resolve) { 
               setTimeout(resolve, 1000)
        });
    });
    

    But I guess you can simply use the first two examples.