162 lines
25 KiB
JavaScript
162 lines
25 KiB
JavaScript
|
"use strict";
|
||
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
|
};
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
const path_1 = require("path");
|
||
|
const testcafe_browser_tools_1 = require("testcafe-browser-tools");
|
||
|
const crop_1 = require("./crop");
|
||
|
const async_queue_1 = require("../utils/async-queue");
|
||
|
const warning_message_1 = __importDefault(require("../notifications/warning-message"));
|
||
|
const escape_user_agent_1 = __importDefault(require("../utils/escape-user-agent"));
|
||
|
const correct_file_path_1 = __importDefault(require("../utils/correct-file-path"));
|
||
|
const promisified_functions_1 = require("../utils/promisified-functions");
|
||
|
const default_extension_1 = __importDefault(require("./default-extension"));
|
||
|
const make_dir_1 = __importDefault(require("make-dir"));
|
||
|
class Capturer {
|
||
|
// TODO: refactor to use dictionary
|
||
|
constructor(baseScreenshotsPath, testEntry, connection, pathPattern, fullPage, thumbnails, warningLog, tempDirectoryPath, autoTakeOnFails) {
|
||
|
this.enabled = !!baseScreenshotsPath;
|
||
|
this.baseScreenshotsPath = baseScreenshotsPath;
|
||
|
this.testEntry = testEntry;
|
||
|
this.provider = connection.provider;
|
||
|
this.browserId = connection.id;
|
||
|
this.warningLog = warningLog;
|
||
|
this.pathPattern = pathPattern;
|
||
|
this.fullPage = fullPage;
|
||
|
this.thumbnails = thumbnails;
|
||
|
this.tempDirectoryPath = tempDirectoryPath;
|
||
|
this.autoTakeOnFails = autoTakeOnFails;
|
||
|
}
|
||
|
static _getDimensionWithoutScrollbar(fullDimension, documentDimension, bodyDimension) {
|
||
|
if (bodyDimension > fullDimension)
|
||
|
return documentDimension;
|
||
|
if (documentDimension > fullDimension)
|
||
|
return bodyDimension;
|
||
|
return Math.max(documentDimension, bodyDimension);
|
||
|
}
|
||
|
static _getCropDimensions(cropDimensions, pageDimensions) {
|
||
|
if (!cropDimensions || !pageDimensions)
|
||
|
return null;
|
||
|
const { dpr } = pageDimensions;
|
||
|
const { top, left, bottom, right } = cropDimensions;
|
||
|
return {
|
||
|
top: Math.round(top * dpr),
|
||
|
left: Math.round(left * dpr),
|
||
|
bottom: Math.round(bottom * dpr),
|
||
|
right: Math.round(right * dpr),
|
||
|
};
|
||
|
}
|
||
|
static _getClientAreaDimensions(pageDimensions) {
|
||
|
if (!pageDimensions)
|
||
|
return null;
|
||
|
const { innerWidth, documentWidth, bodyWidth, innerHeight, documentHeight, bodyHeight, dpr } = pageDimensions;
|
||
|
return {
|
||
|
width: Math.floor(Capturer._getDimensionWithoutScrollbar(innerWidth, documentWidth, bodyWidth) * dpr),
|
||
|
height: Math.floor(Capturer._getDimensionWithoutScrollbar(innerHeight, documentHeight, bodyHeight) * dpr),
|
||
|
};
|
||
|
}
|
||
|
static async _isScreenshotCaptured(screenshotPath) {
|
||
|
try {
|
||
|
const stats = await (0, promisified_functions_1.stat)(screenshotPath);
|
||
|
return stats.isFile();
|
||
|
}
|
||
|
catch (e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
_joinWithBaseScreenshotPath(path) {
|
||
|
return (0, path_1.join)(this.baseScreenshotsPath, path);
|
||
|
}
|
||
|
_incrementFileIndexes(forError) {
|
||
|
if (forError)
|
||
|
this.pathPattern.data.errorFileIndex++;
|
||
|
else
|
||
|
this.pathPattern.data.fileIndex++;
|
||
|
}
|
||
|
_getCustomScreenshotPath(customPath) {
|
||
|
const correctedCustomPath = (0, correct_file_path_1.default)(customPath, default_extension_1.default);
|
||
|
return this._joinWithBaseScreenshotPath(correctedCustomPath);
|
||
|
}
|
||
|
_getScreenshotPath(forError) {
|
||
|
const path = this.pathPattern.getPath(forError);
|
||
|
this._incrementFileIndexes(forError);
|
||
|
return this._joinWithBaseScreenshotPath(path);
|
||
|
}
|
||
|
_getThumbnailPath(screenshotPath) {
|
||
|
const imageName = (0, path_1.basename)(screenshotPath);
|
||
|
const imageDir = (0, path_1.dirname)(screenshotPath);
|
||
|
return (0, path_1.join)(imageDir, 'thumbnails', imageName);
|
||
|
}
|
||
|
async _takeScreenshot({ filePath, pageWidth, pageHeight, fullPage = this.fullPage }) {
|
||
|
await this.provider.takeScreenshot(this.browserId, filePath, pageWidth, pageHeight, fullPage);
|
||
|
}
|
||
|
async _capture(forError, { actionId, failedActionId, pageDimensions, cropDimensions, markSeed, customPath, fullPage, thumbnails } = {}) {
|
||
|
if (!this.enabled)
|
||
|
return null;
|
||
|
thumbnails = thumbnails === void 0 ? this.thumbnails : thumbnails;
|
||
|
const screenshotPath = customPath ? this._getCustomScreenshotPath(customPath) : this._getScreenshotPath(forError);
|
||
|
const thumbnailPath = this._getThumbnailPath(screenshotPath);
|
||
|
const tempPath = screenshotPath.replace(this.baseScreenshotsPath, this.tempDirectoryPath);
|
||
|
let screenshotData;
|
||
|
if ((0, async_queue_1.isInQueue)(screenshotPath))
|
||
|
this.warningLog.addWarning(warning_message_1.default.screenshotRewritingError, screenshotPath);
|
||
|
await (0, async_queue_1.addToQueue)(screenshotPath, async () => {
|
||
|
const clientAreaDimensions = Capturer._getClientAreaDimensions(pageDimensions);
|
||
|
const { width: pageWidth, height: pageHeight } = clientAreaDimensions || {};
|
||
|
const takeScreenshotOptions = {
|
||
|
filePath: tempPath,
|
||
|
pageWidth,
|
||
|
pageHeight,
|
||
|
fullPage,
|
||
|
};
|
||
|
await this._takeScreenshot(takeScreenshotOptions);
|
||
|
if (!await Capturer._isScreenshotCaptured(tempPath))
|
||
|
return;
|
||
|
const image = await (0, promisified_functions_1.readPngFile)(tempPath);
|
||
|
const markSeedPosition = markSeed ? (0, crop_1.calculateMarkPosition)(image, markSeed) : null;
|
||
|
if (markSeed && !markSeedPosition)
|
||
|
this.warningLog.addWarning(warning_message_1.default.screenshotMarkNotFound, tempPath, (0, crop_1.markSeedToId)(markSeed));
|
||
|
const croppedImage = await (0, crop_1.cropScreenshot)(image, {
|
||
|
markSeedPosition,
|
||
|
clientAreaDimensions,
|
||
|
path: tempPath,
|
||
|
cropDimensions: Capturer._getCropDimensions(cropDimensions, pageDimensions),
|
||
|
});
|
||
|
if (croppedImage)
|
||
|
await (0, promisified_functions_1.writePng)(tempPath, croppedImage);
|
||
|
screenshotData = await (0, promisified_functions_1.readFile)(tempPath);
|
||
|
if (forError && this.autoTakeOnFails)
|
||
|
return;
|
||
|
await (0, make_dir_1.default)((0, path_1.dirname)(screenshotPath));
|
||
|
await (0, promisified_functions_1.writeFile)(screenshotPath, screenshotData);
|
||
|
if (thumbnails)
|
||
|
await (0, testcafe_browser_tools_1.generateThumbnail)(screenshotPath, thumbnailPath);
|
||
|
});
|
||
|
const testRunId = this.testEntry.testRuns[this.browserId].id;
|
||
|
const userAgent = (0, escape_user_agent_1.default)(this.pathPattern.data.parsedUserAgent.prettyUserAgent);
|
||
|
const quarantineAttempt = this.pathPattern.data.quarantineAttempt;
|
||
|
const takenOnFail = forError;
|
||
|
const screenshot = {
|
||
|
testRunId,
|
||
|
screenshotPath,
|
||
|
screenshotData,
|
||
|
thumbnailPath,
|
||
|
userAgent,
|
||
|
quarantineAttempt,
|
||
|
takenOnFail,
|
||
|
actionId: failedActionId || actionId,
|
||
|
};
|
||
|
this.testEntry.screenshots.push(screenshot);
|
||
|
return screenshotPath;
|
||
|
}
|
||
|
async captureAction(options) {
|
||
|
return await this._capture(false, options);
|
||
|
}
|
||
|
async captureError(options) {
|
||
|
return await this._capture(true, options);
|
||
|
}
|
||
|
}
|
||
|
exports.default = Capturer;
|
||
|
module.exports = exports.default;
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyZWVuc2hvdHMvY2FwdHVyZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSwrQkFJYztBQUVkLG1FQUEyRDtBQUMzRCxpQ0FJZ0I7QUFDaEIsc0RBQTZEO0FBQzdELHVGQUErRDtBQUMvRCxtRkFBeUQ7QUFDekQsbUZBQXlEO0FBQ3pELDBFQU13QztBQUV4Qyw0RUFBK0Q7QUFDL0Qsd0RBQStCO0FBRy9CLE1BQXFCLFFBQVE7SUFDekIsbUNBQW1DO0lBQ25DLFlBQWEsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsZUFBZTtRQUN0SSxJQUFJLENBQUMsT0FBTyxHQUFlLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQztRQUNqRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLFNBQVMsR0FBYSxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBYyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQy9DLElBQUksQ0FBQyxTQUFTLEdBQWEsVUFBVSxDQUFDLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsVUFBVSxHQUFZLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFXLFdBQVcsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxHQUFjLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsVUFBVSxHQUFZLFVBQVUsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUssaUJBQWlCLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsR0FBTyxlQUFlLENBQUM7SUFDL0MsQ0FBQztJQUVELE1BQU0sQ0FBQyw2QkFBNkIsQ0FBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsYUFBYTtRQUNqRixJQUFJLGFBQWEs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
|