titiritero: espere N segundos antes de continuar con la siguiente línea

Resuelto Pipo asked hace 6 años • 8 respuestas

En titiritero me gustaría esperar un tiempo definido antes de pasar a la siguiente línea de código.

Intenté poner setTimeoutuna función de evaluación pero parece que simplemente se ignora

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

Este código no espere y simplemente escriba antes de esperar y después de esperar.

Sabes como hacer esto?

Pipo avatar Oct 25 '17 02:10 Pipo
Aceptado

Puedes usar una pequeña función de promesa,

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

Luego, llámalo cuando quieras un retraso.

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

Si debe utilizar el titiritero, utilice la función incorporada waitForTimeout.

await page.waitForTimeout(4000)

Si aún desea utilizar page.evaluate, resuélvalo después de 4 segundos. No estás resolviendo nada.

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

Pero supongo que puedes simplemente usar los dos primeros ejemplos.

Md. Abu Taher avatar Oct 26 '2017 23:10 Md. Abu Taher

He estado usando:

await page.waitForTimeout(3000);

Donde 3000 son milisegundos y eso parece funcionar para mí.

Huckleberry Carignan avatar Feb 25 '2019 16:02 Huckleberry Carignan

Puede utilizar una de las siguientes opciones para esperar un segundo :

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

Alternativamente, hay muchas funciones de Puppeteer que incluyen una opción incorporada delay, que puede resultar útil para esperar entre ciertos eventos:

// 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});
Grant Miller avatar Oct 29 '2018 00:10 Grant Miller

page.waitFor ahora ha quedado obsoleto.

Ahora se recomienda a page.waitForTimeout pausar la ejecución del script durante el número determinado de milisegundos antes de continuar:

await page.waitForTimeout(1000)
MatthewThomas.dev avatar Sep 30 '2020 20:09 MatthewThomas.dev

Otras respuestas han mostrado cómo dormir, pero ahora que finalmente page.waitForTimeoutestá obsoleto , creo que agregaría la respuesta que quería agregar por un tiempo:

¡No duermas! Provoca una condición de carrera que altera la naturaleza impulsada por eventos de Puppeteer, introduciendo una fragilidad innecesaria. Casi siempre hay un mejor predicado al que esperar, ya sea explícitamente o usando la API del localizador :

  • ¿Estás esperando que aparezca un selector CSS, una etiqueta aria, texto o XPath? Pruebe waitForSelector(opcionalmente con el selector incorporado apropiado ).
  • ¿Estás esperando una navegación? Pruebe waitForNavigationo ajuste la waitUntilopción en goto.
  • ¿Estás esperando un evento o estado de la red? Pruebe waitForRequest, waitForResponseo waitForNetworkIdle.
  • ¿Estás esperando una ventana emergente? Intente prometerpage.on("dialog", ... .
  • ¿Está esperando que aparezca algún predicado arbitrario, como un número mínimo de elementos secundarios? Intentar waitForFunction.
  • ¿Algo más? Ejecute un evaluatebloque y agregue su propio código para esperar una mutación o encuesta DOM setIntervaly requestAnimationFramevuelva a implementarlo waitForFunctionde manera efectiva según sus necesidades.

waitForFunctionen particular está infrautilizado, pero añade una enorme cantidad de fiabilidad y precisión que waitForTimeoutno es así.

Si todo lo demás falla y tienes que bloquear el script, puedes retrasarlo, pero he escrito cientos de scripts de Puppeteer y nunca he tenido que usar ninguna variante de suspensión, así que estoy bastante convencido de que es básicamente innecesario.

Consulte la publicación de mi blog sobre Puppeteer Antipatterns para obtener más análisis de por qué debe evitar dormir de cualquier forma, excepto como último recurso.

Consulte también los documentos de Playwright parawaitForTimeout , que es esencialmente lo mismo que el método Puppeteer:

Desanimado

Nunca espere el tiempo de espera en producción. Las pruebas que esperan tiempo son inherentemente inestables. Utilice acciones de localizador y aserciones web que esperen automáticamente.

Una advertencia a lo anterior: dormir puede ser útil para la depuración temporal mientras se desarrolla un script.

ggorlen avatar Sep 11 '2022 03:09 ggorlen