titiritero: espere N segundos antes de continuar con la siguiente línea
En titiritero me gustaría esperar un tiempo definido antes de pasar a la siguiente línea de código.
Intenté poner setTimeout
una 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?
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.
He estado usando:
await page.waitForTimeout(3000);
Donde 3000 son milisegundos y eso parece funcionar para mí.
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});
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)
Otras respuestas han mostrado cómo dormir, pero ahora que finalmente page.waitForTimeout
está 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
waitForNavigation
o ajuste lawaitUntil
opción engoto
. - ¿Estás esperando un evento o estado de la red? Pruebe
waitForRequest
,waitForResponse
owaitForNetworkIdle
. - ¿Estás esperando una ventana emergente? Intente prometer
page.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
evaluate
bloque y agregue su propio código para esperar una mutación o encuesta DOMsetInterval
yrequestAnimationFrame
vuelva a implementarlowaitForFunction
de manera efectiva según sus necesidades.
waitForFunction
en particular está infrautilizado, pero añade una enorme cantidad de fiabilidad y precisión que waitForTimeout
no 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.