testplane
Version:
Tests framework based on mocha and wdio
106 lines • 4.91 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ViewportScreenShooter = void 0;
const client_bridge_1 = require("../client-bridge");
const types_1 = require("../isomorphic/types");
const operations_1 = require("./operations");
const history_1 = require("../history");
const debug_1 = require("./debug");
const debug = (0, debug_1.makeVerboseScreenshotsDebug)("testplane:screenshots:viewport-screen-shooter");
class ViewportScreenShooter {
static async create(params) {
const browserSideScreenshooter = await client_bridge_1.ClientBridge.create(params.browser, "screen-shooter", { needsCompatLib: params.browserProperties.needsCompatLib });
return new this({ ...params, browserSideScreenshooter });
}
constructor({ browser, camera, browserProperties, browserSideScreenshooter }) {
this._browser = browser;
this._camera = camera;
this._browserProperties = browserProperties;
this._browserSideScreenshooter = browserSideScreenshooter;
}
async capture(opts = {}) {
try {
return await this._captureImpl(opts);
}
finally {
try {
await this._cleanup(opts);
}
catch (cleanupError) {
const msg = cleanupError instanceof Error ? cleanupError.message : String(cleanupError);
console.warn(`Warning: failed to cleanup after viewport screenshot.\nCleanup error: ${msg}`);
}
}
}
async _captureImpl(opts) {
const selectorsToIgnore = [].concat(opts.ignoreElements ?? []);
const prepareResult = await (0, history_1.runWithoutHistory)({}, () => this._browserSideScreenshooter.call("prepareViewportScreenshot", [
{
usePixelRatio: this._browserProperties.shouldUsePixelRatio,
disableAnimation: opts.disableAnimation,
disableHover: opts.disableHover,
ignoreSelectors: selectorsToIgnore,
},
]));
debug("prepareViewportScreenshot opts: %O", {
usePixelRatio: this._browserProperties.shouldUsePixelRatio,
disableAnimation: opts.disableAnimation,
disableHover: opts.disableHover,
ignoreSelectors: selectorsToIgnore,
});
debug("prepareViewportScreenshot result: %O", prepareResult);
if ((0, types_1.isBrowserSideError)(prepareResult)) {
throw new Error(`Failed to prepare viewport screenshot: error '${prepareResult.errorCode}': ${prepareResult.message}`);
}
// https://github.com/webdriverio/webdriverio/issues/11396
if (this._browserProperties.isWebdriverProtocol && opts.disableAnimation) {
await (0, operations_1.disableIframeAnimations)(this._browser, this._browserSideScreenshooter);
}
await (0, operations_1.preparePointerForScreenshot)(this._browser, {
disableHover: opts.disableHover,
pointerEventsDisabled: prepareResult.pointerEventsDisabled,
});
const { viewportSize, viewportOffset } = prepareResult;
debug("Capturing viewport screenshot.\n viewportSize: %O\n viewportOffset: %O", viewportSize, viewportOffset);
const image = await this._camera.captureViewportImage({
viewportSize,
viewportOffset,
screenshotDelay: opts.screenshotDelay,
cropMargins: opts.cropMargins,
});
if (prepareResult.ignoreAreas.length > 0) {
const cropOffset = {
left: opts.cropMargins?.left ?? 0,
top: opts.cropMargins?.top ?? 0,
};
for (const ignoreArea of prepareResult.ignoreAreas) {
await image.addClear({
...ignoreArea,
left: ignoreArea.left - cropOffset.left,
top: ignoreArea.top - cropOffset.top,
});
}
await image.applyJoin();
}
return {
image,
meta: {
canHaveCaret: prepareResult.canHaveCaret,
pixelRatio: prepareResult.pixelRatio,
},
};
}
async _cleanup(opts) {
return (0, history_1.runWithoutHistory)({}, async () => {
await (0, operations_1.cleanupScrolls)(this._browserSideScreenshooter);
if (opts.disableAnimation) {
await (0, operations_1.cleanupPageAnimations)(this._browser, this._browserSideScreenshooter, this._browserProperties.isWebdriverProtocol);
}
if (opts.disableHover && opts.disableHover !== "never") {
await (0, operations_1.cleanupPointerEvents)(this._browserSideScreenshooter);
}
});
}
}
exports.ViewportScreenShooter = ViewportScreenShooter;
//# sourceMappingURL=viewport-screen-shooter.js.map