UNPKG

@web/test-runner-visual-regression

Version:
99 lines 5.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.visualRegressionPlugin = void 0; const config_js_1 = require("./config.js"); const visualDiffCommand_js_1 = require("./visualDiffCommand.js"); const VisualRegressionError_js_1 = require("./VisualRegressionError.js"); function validatePayload(payload) { if (payload == null || typeof payload !== 'object') { throw new Error('Command visual-diff requires a payload with an id and name'); } if (typeof payload.id !== 'string') { throw new Error('Command visual-diff is missing an id in payload'); } if (typeof payload.name !== 'string') { throw new Error('Command visual-diff is missing a name in payload'); } return true; } function visualRegressionPlugin(options = {}) { const mergedOptions = Object.assign(Object.assign(Object.assign({}, config_js_1.defaultOptions), options), { diffOptions: Object.assign(Object.assign({}, config_js_1.defaultOptions.diffOptions), options.diffOptions) }); return { name: 'visual-regression', async executeCommand({ command, session, payload }) { if (command === 'visual-diff') { try { if (!validatePayload(payload)) { return; } const context = { testFile: session.testFile, browser: session.browser.name, }; if (session.browser.type === 'puppeteer') { const browser = session.browser; const page = browser.getPage(session.id); const handle = await page.evaluateHandle(function findElement(elementId) { return (window.__WTR_VISUAL_REGRESSION__ && window.__WTR_VISUAL_REGRESSION__[elementId]); }, payload.id); // @ts-ignore const element = handle.asElement(); if (!element) { throw new VisualRegressionError_js_1.VisualRegressionError('Something went wrong diffing element, the browser could not find it.'); } const screenshot = await element.screenshot({ encoding: 'binary' }); return (0, visualDiffCommand_js_1.visualDiffCommand)(mergedOptions, Buffer.from(screenshot), payload.name, context); } if (session.browser.type === 'playwright') { const browser = session.browser; const page = browser.getPage(session.id); const handle = await page.evaluateHandle(function findElement(elementId) { return (window.__WTR_VISUAL_REGRESSION__ && window.__WTR_VISUAL_REGRESSION__[elementId]); }, payload.id); const element = handle.asElement(); if (!element) { throw new VisualRegressionError_js_1.VisualRegressionError('Something went wrong diffing element, the browser could not find it.'); } const screenshot = await element.screenshot(); return (0, visualDiffCommand_js_1.visualDiffCommand)(mergedOptions, screenshot, payload.name, context); } if (session.browser.type === 'webdriver') { const browser = session.browser; const locator = ` return (function () { try { var wtr = window.__WTR_VISUAL_REGRESSION__; return wtr && wtr[${payload.id}]; } catch (_) { return undefined; } })(); `; const screenshot = await browser.takeScreenshot(session.id, locator); return (0, visualDiffCommand_js_1.visualDiffCommand)(mergedOptions, screenshot, payload.name, context); } throw new Error(`Browser type ${session.browser.type} is not supported for visual diffing.`); } catch (error) { if (error instanceof VisualRegressionError_js_1.VisualRegressionError) { return { errorMessage: `Something went wrong while executing creating visual diff: ${error.message}`, diffPercentage: -1, passed: false, }; } console.error(error); return { errorMessage: 'Something went wrong while creating visual diff.', diffPercentage: -1, passed: false, }; } } }, }; } exports.visualRegressionPlugin = visualRegressionPlugin; //# sourceMappingURL=visualRegressionPlugin.js.map