web-dev-qa-db-fra.com

Le marionnettiste ne ferme pas le navigateur

J'utilise marionnettiste sur express/node/ubuntu comme suit:

var puppeteer = require('puppeteer');
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
    (async () => {
        headless = true;
        const browser = await puppeteer.launch({headless: true, args:['--no-sandbox']});
        const page = await browser.newPage();
        url = req.query.url;
        await page.goto(url);
        let bodyHTML = await page.evaluate(() => document.body.innerHTML);
        res.send(bodyHTML)
        await browser.close();
    })();
});

exécuter ce script plusieurs fois laisse des centaines de zombies:

$ pgrep chrome | wc -l
133

Qui obstrue le srv,

Comment puis-je réparer ça?

L'exécution de kill à partir d'un script Express JS pourrait le résoudre?

Existe-t-il une meilleure façon d'obtenir le même résultat que le marionnettiste et le chrome sans tête?

5
Elia Weiss

Je le résous avec https://www.npmjs.com/package/shelljs

var Shell = require('shelljs');
Shell.exec('pkill chrome')
1
Elia Weiss

essayez de fermer le navigateur avant d'envoyer la réponse

var puppeteer = require('puppeteer');
var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    (async () => {
        headless = true;
        const browser = await puppeteer.launch({headless: true});
        const page = await browser.newPage();
        url = req.query.url;
        await page.goto(url);
        let bodyHTML = await page.evaluate(() => document.body.innerHTML);
        await browser.close();
        res.send(bodyHTML);
    })();
});
1
mayank Chandel

J'ai rencontré le même problème et bien que votre solution shelljs ait fonctionné, elle tue tous les processus chrome, ce qui pourrait interrompre celui qui traite toujours une demande. Voici une meilleure solution qui devrait fonctionner.

var puppeteer = require('puppeteer');
var express = require('express');
var router = express.Router();

router.get('/', function (req, res, next) {
    (async () => {
        await puppeteer.launch({ headless: true }).then(async browser => {
            const page = await browser.newPage();
            url = req.query.url;
            await page.goto(url);
            let bodyHTML = await page.evaluate(() => document.body.innerHTML);
            await browser.close();
            res.send(bodyHTML);
        });
    })();
});
1
voidmind