He usado titiritero para uno de mis proyectos para abrir páginas web en cromo sin cabeza, realizar algunas acciones y luego cerrar la página. Estas acciones, sin embargo, dependen del usuario. Quiero adjuntar una vida a la página, donde se cierra automáticamente después de, digamos, 30 minutos de apertura, independientemente de si se realiza alguna acción o no.
Probé la funcionalidad setTimeout() de Node JS pero no funcionó (o simplemente no pude entender cómo hacerlo funcionar). He probado lo siguiente:
const puppeteer = require('puppeteer-core'); const browser = await puppeteer.connect({browserURL: browser_url}); const page = await browser.newPage(); // timer starts ticking here upon creation of new page (maybe in a subroutine and not block the main thread) /** .. Do something .. */ // timer ends and closePage() is triggered. const closePage = (page) => { if (!page.isClosed()) { page.close(); } } Pero esto me da el siguiente error: Error: Protocol error: Connection closed. Most likely the page has been closed.
Su código provisto debería funcionar como excepción. ¿Está seguro de que la página aún está abierta después del tiempo de espera y de hecho es la misma página?
Puede probar este envoltorio para abrir páginas y cerrarlas correctamente.
// since it is async it won't block the eventloop. // using `await` will allow other functions to execute. async function openNewPage(browser, timeoutMs) { const page = await browser.newPage() setTimeout(async () => { // you want to use try/catch for omitting unhandled promise rejections. try { if(page.isClosed()) { await page.close() } } catch(err) { console.error('unexpected error occured when closing page.', err) } }, timeoutMs) } // use it like so. const browser = await puppeteer.connect({browserURL: browser_url}); const min30Ms = 30 * 60 * 1000 const page = await openNewPage(browser, min30Ms); // ... Lo anterior solo cierra las Tabs en su navegador. Para cerrar la instancia del titiritero, tendría que llamar a browser.close() , que podría ser lo que desea.
page.close devuelve una promesa, por lo que debe definir closePage como una función asíncrona y usar await page.close() . Creo que la respuesta de @silvan debería abordar el problema, solo asegúrese de reemplazar si la condición
if(page.isClosed())con
if(!page.isClosed())