web-dev-qa-db-fra.com

Marionnettiste: attendez N secondes avant de continuer la ligne suivante

in puppeteer Je voudrais attendre un temps défini avant de passer à la ligne de code suivante.

J'ai essayé de mettre setTimeout dans une fonction d'évaluation, mais cela semble tout simplement ignoré

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

Ce code n'attend pas et écrit juste avant d'attendre et après avoir attend

Sais-tu comment faire cela?

23
Vivien Pipo

Vous pouvez utiliser une petite fonction de promesse,

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

Ensuite, appelez-le chaque fois que vous voulez un délai.

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

Si vous devez utiliser marionnettiste, utilisez la fonction waitFor intégrée.

await page.waitFor(4000)

Si vous souhaitez toujours utiliser page.evaluate, résolvez-le après 4 secondes. Vous ne résolvez rien.

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

Mais je suppose que vous pouvez simplement utiliser les deux premiers exemples.

57
Md. Abu Taher

Vous pouvez utiliser l’une des options suivantes pour attendre une seconde:

await page.waitFor(1000);
await frame.waitFor(1000);
await new Promise(r => setTimeout(r, 1000));

Alternativement, de nombreuses fonctions de Puppeteer incluent une option intégrée delay, qui peut s'avérer utile pour attendre entre certains événements:

// 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});
10
Grant Miller

J'ai utilisé:

await page.waitFor(3000);

Où 3000 est Millisecondes Et cela semble fonctionner pour moi.

5
Huckleberry Carignan

Essayez cette fonction.

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

pour l'utiliser

  async function demo() {
    console.log('Waiting...');
    await sleep(3000);
    console.log('ok');
  }

  demo();
1
Yordan
await new Promise(_func=> setTimeout(_func, 5000));
0
Xin