PromucFlow_constructor/app/client/perf/utils/utils.js
Satish Gandham c5abd3dd6f
feat: UI Performance Infra setup v1 (#9835)
Co-authored-by: Satish Gandham <satish@appsmith.com>
2021-12-28 16:09:15 +05:30

144 lines
4.6 KiB
JavaScript

const fs = require("fs");
const path = require("path");
const delay = (time, msg = "") => {
console.log(`waiting ${msg}:`, time / 1000, "s");
return new Promise(function(resolve) {
setTimeout(resolve, time);
});
};
exports.delay = delay;
exports.getDevToolsPage = async (browser) => {
const targets = await browser.targets();
const devtoolsTarget = targets.filter((t) => {
return t.type() === "other" && t.url().startsWith("devtools://");
})[0];
// Hack to get a page pointing to the devtools
devtoolsTarget._targetInfo.type = "page";
const devtoolsPage = await devtoolsTarget.page();
return devtoolsPage;
};
exports.gotoProfiler = async (devtoolsPage) => {
await devtoolsPage.bringToFront();
await devtoolsPage.keyboard.down("MetaLeft");
await devtoolsPage.keyboard.press("[");
await devtoolsPage.keyboard.up("MetaLeft");
};
exports.getProfilerFrame = async (devtoolsPage) => {
const frames = await devtoolsPage.frames();
const reactProfiler = frames[2]; // This is not foolproof
return reactProfiler;
};
exports.startReactProfile = async (reactProfiler) => {
const recordButton =
"#container > div > div > div > div > div.Toolbar___30kHu > button.Button___1-PiG.InactiveRecordToggle___2CUtF";
await reactProfiler.waitForSelector(recordButton);
const container = await reactProfiler.$(recordButton);
console.log("Satring recording");
await reactProfiler.evaluate((el) => el.click(), container);
console.log("Recording started");
};
exports.stopReactProfile = async (reactProfiler) => {
const stopRecordingButton =
"#container > div > div > div > div > div.Toolbar___30kHu > button.Button___1-PiG.ActiveRecordToggle___1Cpcb";
await reactProfiler.waitForSelector(stopRecordingButton);
const container = await reactProfiler.$(stopRecordingButton);
console.log("Stopping recording");
await reactProfiler.evaluate((el) => el.click(), container);
console.log("Recording stopped");
};
exports.downloadReactProfile = async (reactProfiler) => {
const saveProfileButton =
"#container > div > div > div > div.LeftColumn___3I7-I > div.Toolbar___30kHu > button:nth-child(8)";
await reactProfiler.waitForSelector(saveProfileButton);
const container = await reactProfiler.$(saveProfileButton);
await reactProfiler.evaluate((el) => el.click(), container);
console.log("Downlaoded the profile");
};
exports.saveProfile = async (reactProfiler, name) => {
const anchorSelector =
"#container > div > div > div > div.LeftColumn___3I7-I > div.Toolbar___30kHu > a";
await reactProfiler.waitForSelector(anchorSelector);
const anchor = await reactProfiler.$(anchorSelector);
await reactProfiler.evaluate(
(el) => console.log(el.getAttribute("href")),
anchor,
);
const attr = await reactProfiler.$$eval(anchorSelector, (el) =>
el.map((x) => x.getAttribute("href")),
);
const url = attr[0];
const profile = await reactProfiler.evaluate(async (href) => {
const blob = await fetch(href).then(async (r) => r.blob());
const text = await blob.text();
return text;
}, url);
const location = path.join(__dirname, `/profiles/${name}.json`);
fs.writeFileSync(location, profile);
};
exports.login = async (page) => {
const url = "https://dev.appsmith.com/user/login";
await page.goto(url);
await page.setViewport({ width: 1440, height: 714 });
await delay(1000, "before login");
const emailSelector = "input[name='username']";
const passwordSelector = "input[name='password']";
const buttonSelector = "button[type='submit']";
try {
await page.waitForSelector(emailSelector);
await page.waitForSelector(passwordSelector);
await page.waitForSelector(buttonSelector);
} catch (e) {
console.error(e);
console.log(
"Screenshot:",
`${APP_ROOT}/traces/reports/login-selector-error.png`,
);
await page.screenshot({
path: `${APP_ROOT}/traces/reports/login-selector-error.png`,
});
}
await page.type(emailSelector, process.env.CYPRESS_TESTUSERNAME1);
await page.type(passwordSelector, process.env.CYPRESS_TESTPASSWORD1);
delay(1000, "before clicking login button");
await page.click(buttonSelector);
};
exports.getFormattedTime = () => {
var today = new Date();
var y = today.getFullYear();
var m = today.getMonth() + 1;
var d = today.getDate();
var h = today.getHours();
var mi = today.getMinutes();
var s = today.getSeconds();
return y + "-" + m + "-" + d + "-" + h + "-" + mi + "-" + s;
};
exports.sortObjectKeys = (obj) => {
const sortedObj = {};
Object.keys(obj)
.sort()
.forEach((key) => {
sortedObj[key] = obj[key];
});
return sortedObj;
};