diff --git a/package.json b/package.json index e00031f..2ad56f2 100755 --- a/package.json +++ b/package.json @@ -46,7 +46,7 @@ "crypto-js": "^3.1.8", "joi": "^11.1.1", "lodash": "^4.17.4", - "puppeteer": "^2.0.0" + "puppeteer": "^2.1.1" }, "devDependencies": { "gulp": "^3.9.1", diff --git a/src/app/feature/config/clazz/default.config.class.js b/src/app/feature/config/clazz/default.config.class.js index 465e6bc..8846bbd 100644 --- a/src/app/feature/config/clazz/default.config.class.js +++ b/src/app/feature/config/clazz/default.config.class.js @@ -10,6 +10,7 @@ export default class DefaultConfig { this.setPathConfig(); this.setEnvConfig(); this.setServerConfig(); + this.setBrowserConfig(); } setPathConfig() { @@ -35,6 +36,9 @@ export default class DefaultConfig { setServerConfig() { this.Port = this.objConfig.port; + } + + setBrowserConfig() { this.size = this.objConfig.size; this.ignore = this.objConfig.ignore; } diff --git a/src/app/shared/utils/render.utils.class.js b/src/app/shared/utils/render.utils.class.js index 6b4847b..37ebb20 100644 --- a/src/app/shared/utils/render.utils.class.js +++ b/src/app/shared/utils/render.utils.class.js @@ -1,6 +1,6 @@ -import puppeteer from 'puppeteer'; -import _ from 'lodash'; -import _C from '../../shared/term/criteria.term.class'; +import puppeteer from 'puppeteer'; +import _ from 'lodash'; +import _C from '../../shared/term/criteria.term.class'; export default class Render { @@ -8,6 +8,7 @@ export default class Render { const browser = await puppeteer.launch({ headless: config.debug, ignoreHTTPSErrors: config.ignore, + devtools: false, args: [ '--disable-gpu', '--disable-dev-shm-usage', @@ -41,7 +42,7 @@ export default class Render { height: 1200 }, goto: { - waitUntil: 'networkidle2' + waitUntil: 'networkidle0' }, output: _C.FOTMAT_TYPE_PDF, pdf: { @@ -52,7 +53,8 @@ export default class Render { type: 'png', fullPage: true }, - failEarly: false + failEarly: false, + waitFor: 6000 }, _opts); if (_.get(_opts, 'pdf.width') && _.get(_opts, 'pdf.height')) { @@ -60,22 +62,21 @@ export default class Render { opts.pdf.format = undefined; } - logger.trace('RENDER => ' + JSON.stringify({ - opts - })); + this.logOpts(opts); let browserWSEndpoint = browser[Math.floor(Math.random() * config.size)]; - const chrome = await puppeteer.connect({browserWSEndpoint}); + const chrome = await puppeteer.connect({browserWSEndpoint,ping_interval:'None',ping_timeout:'None'}); logger.trace('RENDER => browserWSEndpoint connect ...'+ Math.floor(Math.random() * config.size)); const page = await chrome.newPage(); + await page.setCacheEnabled(true); + page.on('error', (err) => { logger.error(`RENDER => Error event emitted: ${err}`); logger.error(err.stack); page.close(); }); - this.failedResponses = []; page.on('requestfailed', (request) => { this.failedResponses.push(request); @@ -96,7 +97,7 @@ export default class Render { let data; try { - logger.trace('RENDER => Set chrome viewport ..'); + logger.trace('RENDER => Set browser viewport ..'); await page.setViewport(opts.viewport); if (opts.emulateScreenMedia) { logger.trace('RENDER => Emulate @media screen ..'); @@ -112,7 +113,7 @@ export default class Render { await client.send('Network.setCookies', {cookies: opts.cookies}); } - if (opts.html) { + if (_.isString(opts.html)) { logger.trace('RENDER => Set HTML ..'); await page.setContent(opts.html, opts.goto); } else { @@ -124,7 +125,7 @@ export default class Render { if (_.isNumber(opts.waitFor) || _.isString(opts.waitFor)) { logger.trace(`RENDER => Wait for ${opts.waitFor} ..`); - await page.waitFor(parseInt(opts.waitFor)); + await page.waitFor(~~opts.waitFor); } if (opts.scrollPage) { @@ -157,6 +158,8 @@ export default class Render { if (opts.output === _C.FOTMAT_TYPE_PDF) { data = await page.pdf(opts.pdf); + }else if (opts.output === _C.FOTMAT_TYPE_HTML) { + data = await page.evaluate(() => document.body.innerHTML); } else { const screenshotOpts = _.cloneDeep(_.omit(opts.screenshot, ['clip'])); const clipContainsSomething = _.some(opts.screenshot.clip, val => !_.isUndefined(val)); @@ -165,7 +168,6 @@ export default class Render { } data = await page.screenshot(screenshotOpts); } - data.title = opts.attachmentName; } catch (err) { logger.trace(`RENDER <= Error when rendering page: ${err}`); logger.error(err.stack); @@ -177,11 +179,6 @@ export default class Render { return data; } - /** - * 滚动到页面末尾以触发延迟加载所有元素 - * - * @param {page} Page. - */ static async scrollPage(page) { await page.evaluate(() => { const scrollInterval = 100; @@ -220,6 +217,8 @@ export default class Render { static getMimeType(opts) { if (opts.output === _C.FOTMAT_TYPE_PDF) { return 'application/pdf'; + }else if (opts.output === _C.FOTMAT_TYPE_HTML) { + return 'text/html'; } const type = _.get(opts, 'screenshot.type'); switch (type) { @@ -232,6 +231,16 @@ export default class Render { } } + static logOpts(opts) { + const supressedOpts = _.cloneDeep(opts); + if (opts.html) { + supressedOpts.html = '...'; + } + logger.trace('RENDER => ' + JSON.stringify({ + opts + })); + } + /** * 获取提交参数信息 * @@ -245,7 +254,7 @@ export default class Render { emulateScreenMedia: query.emulateScreenMedia, ignoreHttpsErrors: query.ignoreHttpsErrors, waitFor: ~~query.waitFor, - output: query.output || _C.FOTMAT_TYPE_PDF, + output: query.output || _C.FOTMAT_TYPE_PDF || _C.FOTMAT_TYPE_HTML, viewport: { width: query['viewport.width'], height: query['viewport.height'],