кукольник: как проверить, открыт ли браузер и работает ли - PullRequest
0 голосов
/ 27 августа 2018

я пытаюсь открыть несколько вкладок в одном экземпляре браузера, после того, как они сделаны, я закрываю вкладки и затем повторно открываю эти вкладки каждые x секунд ... но я хочу, чтобы сам браузер оставался открытым, поэтому у меня нет войти в каждую вкладку в каждом цикле

, чтобы браузер оставался открытым, вкладки открывались и закрывались

вот мой упрощенный код, прошу игнорировать синтаксис erros

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? так что я могу создать новый экземпляр и заменить его, если предыдущий закрыт

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Использование 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();
})();

Результат:

Браузер был отключен.

Браузер был переподключен.

Браузер был закрыт.

Браузер был вновь открыт.

0 голосов
/ 30 августа 2018

Вы можете сделать очень простую функцию, чтобы узнать, был ли завершен процесс браузера.

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.

Это код, который я использовал для проверки этого, посмотрите, как изменится вывод, если я закомментирую секцию 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 }
_

Это отличается от события. Я специально сделал этот фрагмент, чтобы проверить процесс для этого конкретного вопроса, где вы проверяете и запускаете его, если хотите.

Обратите внимание, что это даст только результат, если браузер каким-то образом потерпит крах / закроется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...