web-dev-qa-db-ja.com

puppeteer:ブラウザがまだ開いていて動作しているかどうかを確認する方法

単一のブラウザインスタンスで複数のタブを開こうとしています。完了したら、タブを閉じてから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に操り人形の動作中/開いているインスタンスがあることを確認および確認するにはどうすればよいですか?新しいインスタンスを作成し、前のインスタンスが閉じている場合はそれを置き換えることができます

7
hretic

browser.on('disconnected')を使用します。

browser.on('disconnected') を使用して、ブラウザが閉じられたかクラッシュしたとき、または browser.disconnect() メソッドが呼び出されたかどうかをリッスンできます。

その後、ブラウザを自動的に再起動して、プログラムを続行できます。

次のクラスはブラウザを起動し、'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();
    })();
  }
}

BrowserHandler.browserは、接続を解除するとfalseを返します。

さらに、次の関数を使用すると、プログラムがブラウザの起動が完了するのを待ってから続行することができます。

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);
});

完全な例:

'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();
})();

結果:

ブラウザが切断されました。

ブラウザが再接続されました。

ブラウザが閉じられました。

ブラウザが再度開かれました。

5
Grant Miller

非常に単純な関数を作成して、ブラウザープロセスが強制終了されたかどうかを確認できます。

_async function wasBrowserKilled(browser){
  const procInfo = await browser.process();
  return !!procInfo.signalCode; // null if browser is still running
}
_

ここで使用できます

_const browserKilled = await wasBrowserKilled(global_browser);
if(global_browser === false || browserKilled)
_

ブラウザが強制終了されたかどうかをチェックし、それ以外の場合はブラウザを置き換えます。

これは、APIが提供する多くの方法の1つにすぎません。

これは、これをテストするために使用したコードです。browser.close()セクションをコメント化すると、出力がどのように変化するかを確認してください。

_const puppeteer = require('puppeteer');

puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  // comment out to keep browser open
  await browser.close();
  console.log({browserKilled: await wasBrowserKilled(browser)});
});

async function wasBrowserKilled(browser){
  const procInfo = await browser.process();
  return !!procInfo.signalCode;
}
_

ここにログイン、

_➜  puppeteer-xvfb git:(direct-script) ✗ node temp/interval_tab.js
{ browserKilled: true }
➜  puppeteer-xvfb git:(direct-script) ✗ node temp/interval_tab.js
{ browserKilled: false }
_
_

これはイベントとは異なります。私はこのスニペットを特別に作成して、この特定の質問のプロセスをチェックし、必要に応じてチェックして実行します。

これは、ブラウザーが何らかの理由でクラッシュ/クローズされた場合にのみ結果を生成することに注意してください。

1
Md. Abu Taher