使用相同的浏览器实例

时间:2017-10-10 16:36:49

标签: node.js google-chrome puppeteer

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

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

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

我该怎么办?

1 个答案:

答案 0 :(得分:0)

问题:

  

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

专业提示:开始使用letconst代替var

有一篇很棒的文章,here