testplane
Version:
Tests framework based on mocha and wdio
119 lines • 5.14 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendFilteredEvents = exports.filterEvents = exports.installRrwebAndCollectEvents = void 0;
const fs_1 = __importDefault(require("fs"));
const events_1 = require("../../events");
const index_1 = require("./index");
const path_1 = __importDefault(require("path"));
const rrwebCode = fs_1.default.readFileSync(path_1.default.join(__dirname, "../client-scripts/rrweb-record.min.js"), "utf-8");
async function installRrwebAndCollectEvents(session, callstack) {
/* eslint-disable @typescript-eslint/ban-ts-comment */
const resultPromise = (0, index_1.runWithoutHistory)({ callstack }, () => session.execute((rrwebRecordFnCode, serverTime) => {
// @ts-expect-error
if (!window.__testplaneTiming) {
// @ts-expect-error
window.__testplaneTiming = {
serverTime: serverTime,
baseRaf: null,
initialized: true,
};
requestAnimationFrame(timestamp => {
// @ts-expect-error
window.__testplaneTiming.baseRaf = timestamp;
});
}
try {
// @ts-expect-error
if (!window.rrweb) {
window.eval(rrwebRecordFnCode);
// @ts-expect-error
window.lastProcessedRrwebEvent = -1;
// @ts-expect-error
window.rrwebEvents = [];
// @ts-expect-error
window.rrweb.record({
// @ts-expect-error
emit(event) {
// We use this complex RAF-based timing, because users might have Date.now() stubbed
requestAnimationFrame(currentRaf => {
// @ts-expect-error
const baseRaf = window.__testplaneTiming.baseRaf;
// @ts-expect-error
const serverTime = window.__testplaneTiming.serverTime;
if (baseRaf !== null) {
event.timestamp = Math.floor(serverTime + (currentRaf - baseRaf));
}
else {
// RAF not ready, use server time
event.timestamp = serverTime;
}
// @ts-expect-error
window.rrwebEvents.push(event);
});
},
});
// @ts-expect-error
window.rrweb.record.addCustomEvent("color-scheme-change", {
colorScheme: window.matchMedia && window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light",
});
window.matchMedia &&
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", event => {
// @ts-expect-error
window.rrweb.record.addCustomEvent("color-scheme-change", {
colorScheme: event.matches ? "dark" : "light",
});
});
}
}
catch (e) {
/**/
}
let result;
try {
// @ts-expect-error
result = window.rrwebEvents.slice(window.lastProcessedRrwebEvent + 1);
// @ts-expect-error
window.lastProcessedRrwebEvent = window.rrwebEvents.length - 1;
}
catch {
result = [];
}
return result;
}, rrwebCode, Date.now()));
/* eslint-enable @typescript-eslint/ban-ts-comment */
callstack.setIsInBypassMode(false);
return resultPromise;
}
exports.installRrwebAndCollectEvents = installRrwebAndCollectEvents;
function filterEvents(rrwebEvents) {
return rrwebEvents.filter(e => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const dataAny = e?.data;
// cd_frame_id_ attribute is specific for chromedriver and in rare cases can be captured by rrweb
// It doesn't hold any value, and we want to get rid of it here.
return !dataAny?.attributes?.[0]?.attributes?.["cd_frame_id_"];
});
}
exports.filterEvents = filterEvents;
function sendFilteredEvents(session, rrwebEvents) {
const currentTest = session.executionContext?.ctx?.currentTest;
if (rrwebEvents.length > 0 && process.send && currentTest) {
process.send({
event: events_1.MasterEvents.DOM_SNAPSHOTS,
context: {
testPath: currentTest.titlePath(),
browserId: currentTest.browserId,
},
data: {
rrwebSnapshots: rrwebEvents,
},
});
}
}
exports.sendFilteredEvents = sendFilteredEvents;
//# sourceMappingURL=rrweb.js.map