web-dev-qa-db-fra.com

marionnettiste: comment vérifier si le navigateur est toujours ouvert et fonctionne

j'essaie d'ouvrir plusieurs onglets dans une seule instance de navigateur. Une fois qu'ils ont terminé, je ferme les onglets, puis je les rouvre toutes les x secondes ... mais je veux que le navigateur reste ouvert afin de ne pas avoir à me connecter. chaque onglet sur chaque boucle

afin que le navigateur reste ouvert, les onglets s'ouvrent et se ferment 

voici mon code simplifié, veuillez ignorer la syntaxe 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 );

voici le problème, parfois le navigateur plante ou il se ferme pour une raison quelconque, mais le global_browser reste un objet/une instance de marionnettiste ... de maudire ça ne marchera pas si j'essaie d'ouvrir un onglet avec cette instance,

(node:5720) UnhandledPromiseRejectionWarning: Error: WebSocket is not open: readyState 3 (CLOSED)

voici ma question, comment puis-je vérifier et m'assurer que j'ai une instance de marionnettiste active/ouverte dans global_browser? afin que je puisse créer une nouvelle instance et la remplacer si la précédente est fermée

4
hretic

Utilisez browser.on('disconnected').

Vous pouvez utiliser browser.on('disconnected') pour écouter lorsque le navigateur est fermé ou en panne, ou si la méthode browser.disconnect() a été appelée.

Ensuite, vous pouvez relancer automatiquement le navigateur et poursuivre votre programme.

La classe suivante lancera le navigateur et le relancera automatiquement à chaque déclenchement de l'événement '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 renverra false lorsqu'il sera déconnecté.

De plus, la fonction suivante vous permettra de forcer votre programme à attendre que le navigateur ait fini de se lancer avant de continuer:

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

Exemple complet:

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

Résultat:

Le navigateur a été déconnecté.

Le navigateur a été reconnecté.

Le navigateur a été fermé.

Le navigateur a été rouvert.

3
Grant Miller

Vous pouvez créer une fonction très simple pour savoir si le processus du navigateur a été tué.

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

On peut utiliser ça ici,

const browserKilled = await wasBrowserKilled(global_browser);
if(global_browser === false || browserKilled)

Il vérifiera si le navigateur a été tué, sinon il le remplacera.

Ceci est juste un moyen de sortir de beaucoup fourni par l'API. 

C'est le code que j'ai utilisé pour tester cela, voyez comment la sortie change si je commente la section 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;
}

Connectez-vous ici,

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

Ceci est différent de l'événement. J'ai spécialement conçu cet extrait pour vérifier le processus de cette question spécifique et l'exécuter si vous le souhaitez.

Notez que cela ne produira un résultat que si le navigateur est bloqué/fermé d'une manière ou d'une autre. 

1
Md. Abu Taher