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?
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 waitFor function.
await page.waitFor(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.
You can use one of the following options to wait for one second:
await page.waitFor(1000);
await frame.waitFor(1000);
await new Promise(r => setTimeout(r, 1000));
Alternatively, there are many Puppeteer functions that include a built-in delay
option, which may come in handy for waiting between certain events:
// Click Delay
// Time to wait between mousedown and mouseup in milliseconds. Defaults to 0.
await page.click('#example', {delay: 1000});
await frame.click('#example', {delay: 1000});
await elementHandle.click({delay: 1000});
await page.mouse.click(0, 0, {delay: 1000});
// Type Delay
// Time to wait between key presses in milliseconds. Defaults to 0.
await page.type('#example', 'Hello, world!', {delay: 1000});
await frame.type('#example', 'Hello, world!', {delay: 1000});
await elementHandle.type('Hello, world!', {delay: 1000});
await page.keyboard.type('Hello, world!', {delay: 1000});
// Press Delay
// Time to wait between keydown and keyup in milliseconds. Defaults to 0.
await elementHandle.press('Backspace', {delay: 1000});
await page.keyboard.press('Backspace', {delay: 1000});
I've been using:
await page.waitFor(3000);
Where 3000 is Milliseconds
And that seems to be working for me.
await new Promise(_func=> setTimeout(_func, 5000));
Try this function.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
to use it
async function demo() {
console.log('Waiting...');
await sleep(3000);
console.log('ok');
}
demo();
Your syntax is incomplete.
Try this...
await page.evaluate(async() => {
setTimeout(function(){
console.log('waiting');
}, 4000)
});