gemini-core
Version:
Utility which contains common modules for gemini and hermione
56 lines (45 loc) • 1.98 kB
JavaScript
;
const Promise = require('bluebird');
const Viewport = require('./viewport');
const HeightViewportError = require('./viewport/coord-validator/errors/height-viewport-error');
module.exports = class ScreenShooter {
static create(browser) {
return new ScreenShooter(browser);
}
constructor(browser) {
this._browser = browser;
}
capture(page, opts = {}) {
const {allowViewportOverflow, compositeImage, screenshotDelay, selectorToScroll} = opts;
const viewportOpts = {allowViewportOverflow, compositeImage};
const cropImageOpts = {screenshotDelay, compositeImage, selectorToScroll};
return this._browser.captureViewportImage(page, screenshotDelay)
.then((viewportImage) => Viewport.create(page.viewport, viewportImage, page.pixelRatio, viewportOpts))
.then((viewport) => this._cropImage(viewport, page, cropImageOpts));
}
_cropImage(viewport, page, opts) {
try {
viewport.validate(page.captureArea, this._browser);
} catch (e) {
return e instanceof HeightViewportError && opts.compositeImage
? this._extendImage(viewport, page, opts)
: Promise.reject(e);
}
viewport.ignoreAreas(page.ignoreAreas);
return viewport.crop(page.captureArea);
}
_extendImage(viewport, page, opts) {
const scrollHeight = Math.min(
viewport.getVerticalOverflow(page.captureArea),
page.viewport.height
);
return this._browser
.scrollBy({x: 0, y: scrollHeight, selector: opts.selectorToScroll})
.then(() => {
page.viewport.top += scrollHeight;
return this._browser.captureViewportImage(page, opts.screenshotDelay);
})
.then((newImage) => viewport.extendBy(scrollHeight, newImage))
.then(() => this._cropImage(viewport, page, opts));
}
};