2017-10-10 92 views
0

嗨,我試圖讓一個屏幕截圖服務使用相同的瀏覽器實例?

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 

我不想爲每個屏幕截圖打開一個新的瀏覽器啓動瀏覽器需要時間並需要更多內存?

我該怎麼辦?

+0

我解決了 變種瀏覽器= NULL; puppeteer.launch()。then(tempBrowser => browser = tempBrowser); –

回答

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