我试图在单个浏览器实例中打开多个选项卡,完成后我关闭选项卡,然后每隔 x 秒重新打开这些选项卡……但我想让浏览器本身保持打开状态,所以我不必登录每个循环中的每个选项卡
所以浏览器保持打开状态,选项卡打开和关闭
这是我的简化代码,请忽略语法错误
var global_browser = false ;
async function init_puppeteer( settings ) {
if(global_browser === false )
global_browser = await puppeteer.launch({headless: false , args:['--no-sandbox']});
for(var i = 0 ; i < settings.length ; i++ )
{
var setting = settings[i];
open_tab($setting);
}
}
async function open_tab( setting ){
const page = await global_browser.newPage();
// do stuff
page.close();
}
setInterval(function (){
init_puppeteer(settings)
}, 50000 );
这是问题所在,有时浏览器崩溃或由于某种原因而关闭,但 global_browser
仍然是一个对象/木偶操纵者的实例……当我尝试打开带有该实例的选项卡时,诅咒它不会工作,并且我得到类似的东西
(node:5720) UnhandledPromiseRejectionWarning: Error: WebSocket is not open: readyState 3 (CLOSED)
这是我的问题,我如何检查并确保我在 global_browser
中有一个工作/打开的 puppeteer 实例?所以我可以创建一个新实例并在前一个关闭时替换它
原文由 hretic 发布,翻译遵循 CC BY-SA 4.0 许可协议
使用
browser.on('disconnected')
。您可以使用
browser.on('disconnected')
来监听浏览器何时关闭或崩溃,或者是否调用了browser.disconnect()
方法。然后,您可以自动重新启动浏览器,并继续您的程序。
以下类将启动浏览器,并在触发
'disconnected'
事件时自动重新启动浏览器:BrowserHandler.browser
断开连接时将返回false
。此外,以下函数将使您能够强制您的程序等待浏览器完成启动,然后再继续:
完整示例:
结果: