puppeteer:如何检查浏览器是否仍在打开并正常工作 [英] puppeteer : how check if browser is still open and working

查看:439
本文介绍了puppeteer:如何检查浏览器是否仍在打开并正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试在一个浏览器实例中打开多个选项卡,完成后我关闭这些选项卡,然后每隔x秒重新打开这些选项卡...但是我想保持浏览器本身处于打开状态,所以我没有登录每个循环的每个选项卡

因此浏览器保持打开状态,标签页会打开和关闭

这是我的简化代码,请忽略语法错误

  var global_browser = false;异步函数init_puppeteer(settings){如果(global_browser === false)global_browser =等待puppeteer.launch({headless:false,args:['-no-sandbox']});;for(var i = 0; i< settings.length; i ++){var setting = settings [i];open_tab($ setting);}}异步函数open_tab(设置){const page =等待global_browser.newPage();//做东西page.close();}setInterval(function(){init_puppeteer(设置)},50000); 

这是问题所在,有时浏览器崩溃或由于某种原因而关闭,但 global_browser 仍然是伪造对象的对象/实例...诅咒当我尝试打开带有该实例,我得到类似

 (节点:5720)UnhandledPromiseRejectionWarning:错误:WebSocket未打开:readyState 3(关闭) 

这是我的问题,如何检查并确保我在 global_browser 中有伪造的工作/打开实例?这样我就可以创建一个新实例,如果上一个实例已关闭,则可以替换它

解决方案

使用 browser.on('disconnected').

您可以使用 browser.on('disconnected') 来监听关闭或崩溃的浏览器,或者 解决方案

Use browser.on('disconnected').

You can use browser.on('disconnected') to listen for when the browser is closed or crashed, or if the browser.disconnect() method was called.

Then, you can automatically relaunch the browser, and continue with your program.

The following class will launch the browser, and automatically relaunch the browser whenever the 'disconnected' event is fired:

class BrowserHandler {
  constructor() {
    const launch_browser = async () => {
      this.browser = false;
      this.browser = await puppeteer.launch();
      this.browser.on('disconnected', launch_browser);
    };
    
    (async () => {
      await launch_browser();
    })();
  }
}

BrowserHandler.browser will return false when disconnected.

Additionally, the following function will give you the ability to force your program to wait for the browser to finish launching before continuing any further:

const wait_for_browser = browser_handler => new Promise((resolve, reject) => {
  const browser_check = setInterval(() => {
    if (browser_handler.browser !== false) {
      clearInterval(browser_check);
      resolve(true);
    }
  }, 100);
});


Complete Example:

'use strict';

const puppeteer = require('puppeteer');

/**
 * Class: BrowserHandler
 *     Relaunch Browser when Closed
 *     Return false when Browser is Disconnected
 */

class BrowserHandler {
  constructor() {
    const launch_browser = async () => {
      this.browser = false;
      this.browser = await puppeteer.launch();
      this.browser.on('disconnected', launch_browser);
    };
    
    (async () => {
      await launch_browser();
    })();
  }
}

/**
 * Function: wait_for_browser
 *     Wait for Browser to Finish Launching
 */

const wait_for_browser = browser_handler => new Promise((resolve, reject) => {
  const browser_check = setInterval(() => {
    if (browser_handler.browser !== false) {
      clearInterval(browser_check);
      resolve(true);
    }
  }, 100 );
});

// Main Program

(async () => {
  // Open Browser
  
  const browser_handler = new BrowserHandler;
  
  await wait_for_browser(browser_handler);
  
  // Open New Page
  
  let page = await browser_handler.browser.newPage();
  
  await page.goto('https://www.example.com/');
  
  // Disconnect and Automatically Reconnect Browser
  
  browser_handler.browser.disconnect();
  
  if (browser_handler.browser === false) {
    console.log('The browser has been disconnected.');
    
    await wait_for_browser(browser_handler);
  }
  
  console.log('The browser has been reconnected.');
  
  // Close and Automatically Reopen Browser
  
  await browser_handler.browser.close();
  
  if (browser_handler.browser === false) {
    console.log('The browser has been closed.');
    
    await wait_for_browser(browser_handler);
  }
  
  console.log('The browser has been reopened.');
  
  // Force Close Puppeteer
  
  process.exit();
})();

Result:

The browser has been disconnected.

The browser has been reconnected.

The browser has been closed.

The browser has been reopened.

这篇关于puppeteer:如何检查浏览器是否仍在打开并正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆