@web/test-runner-visual-regression
Version:
Web test runner visual regression
99 lines • 5.2 kB
JavaScript
;
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