UNPKG

puppeteer-full-page-screenshot

Version:

A better solution for taking full page screenshot with Puppeteer

104 lines (88 loc) 2.52 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _mergeImg = _interopRequireDefault(require("merge-img")); var _jimp = _interopRequireDefault(require("jimp")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* eslint-disable no-undef */ /* eslint-disable no-await-in-loop */ const pageDown = async page => { const isEnd = await page.evaluate(() => { window.scrollBy({ top: window.innerHeight, behavior: 'instant' }); return window.scrollY >= document.documentElement.scrollHeight - window.innerHeight; }); return isEnd; }; const defaultOptions = { fullPage: false, captureBeyondViewport: false, type: 'png', delay: 0 }; const fullPageScreenshot = async (page, options = {}) => { const { pagesCount, extraPixels, viewport } = await page.evaluate(() => { window.scrollTo({ top: 0, left: 0, behavior: 'instant' }); const pageHeight = document.documentElement.scrollHeight; return { pagesCount: Math.ceil(pageHeight / window.innerHeight), extraPixels: pageHeight % window.innerHeight * window.devicePixelRatio, viewport: { height: window.innerHeight * window.devicePixelRatio, width: window.innerWidth * window.devicePixelRatio } }; }); const { path, delay, ...pptrScreenshotOptions } = { ...defaultOptions, ...options }; const images = []; for (let index = 0; index < pagesCount; index += 1) { if (delay) { await page.waitForTimeout(delay); } const image = await page.screenshot(pptrScreenshotOptions); await pageDown(page); images.push(image); } if (pagesCount === 1) { const image = await _jimp.default.read(images[0]); if (path) image.write(path); return image; } if (extraPixels > 0) { // crop last image extra pixels const cropped = await _jimp.default.read(images.pop()).then(image => image.crop(0, viewport.height - extraPixels, viewport.width, extraPixels)).then(image => image.getBufferAsync(_jimp.default.AUTO)); images.push(cropped); } const mergedImage = await (0, _mergeImg.default)(images, { direction: true }); if (path) { await new Promise(resolve => { mergedImage.write(path, () => { resolve(); }); }); } return mergedImage; }; var _default = fullPageScreenshot; exports.default = _default; //# sourceMappingURL=index.js.map