UNPKG

testplane

Version:

Tests framework based on mocha and wdio

106 lines 4.91 kB
"use strict"; 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