【问题标题】:use same browser instance?使用相同的浏览器实例?
【发布时间】:2017-10-12 03:13:54
【问题描述】:

您好,我正在尝试制作截图服务

const puppeteer = require('puppeteer');
var resWidth = 1366;
var resHeight = 1000;
var browser;

(async () => {
browser = await puppeteer.launch({ignoreHTTPSErrors: true});
});

当我收到一份工作时,我会尝试做

data.forEach(function(d){
    try {
        console.log(d["url"]);
        (async () => {
            var page = await browser.newPage();
            await page.setViewport({width: resWidth, height: resHeight});
            await page.goto(d["url"], {timeout: 90000, waitUntil: 'networkidle'});
            await page.screenshot({path: './picdata/' + d['id'] + '.png' ,fullPage: true});
            await page.close();
        })();

    } catch(e) {}
});

但我不能...这是错误:

(node:40596) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 7): TypeError: Cannot read property 'newPage' of undefined

我不想为每个屏幕截图打开一个新浏览器,启动浏览器需要时间并且需要更多内存?

我该怎么办?

【问题讨论】:

  • 我解决了 var browser = null; puppeteer.launch().then(tempBrowser => browser = tempBrowser);

标签: node.js google-chrome puppeteer


【解决方案1】:

问题:

(async () => { browser = await puppeteer.launch({ignoreHTTPSErrors: true}); });

此代码永远不会被执行。为什么?因为它不是真正的闭包。

更多关于关闭的信息,here。

话虽如此,这对于您的给定场景不起作用,因为它们是异步任务。

我试试你的例子:

'use strict';
const puppeteer = require('puppeteer');
const resWidth = 1366;
const resHeight = 1000;
let browser;
let page;

async function launchBrowser() {
  browser = await puppeteer.launch({ headless: true }); //this "{ headless: true }" will ensure a browser window is not open a single time.
};

launchBrowser().then((x) => { // wait until browser has launched
  data.forEach(async (d) => {
    try {
      page = await browser.newPage(); // the document is not very clear about this method, so I am still unsure if I could move this in the above launchBrowser() method. 
      await page.setViewport({ width: resWidth, height: resHeight });
      await page.goto(d['url'], { timeout: 90000, waitUntil: 'networkidle' });
      await page.screenshot({ path: './picdata/' + d['id'] + '.png', fullPage: true });
    }
    catch (e) {
      console.log(e);
      await browser.close(); // close browser if there is an error
    }
  });
})
.then(() => {
  await browser.close(); // close browser finally.
});

专业提示:开始使用let、const 而不是var。

有一篇很棒的文章,here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2015-09-08
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多