skutter
Version:
Skutter: Opinionated BDD Browser based test framework
129 lines (128 loc) • 7.39 kB
JavaScript
;
const Lazy = require("lazy.js");
const verbosity_level_aware_logger_1 = require("../framework/services/verbosity-level-aware-logger");
const screenshotter_1 = require("../framework/services/screenshotter");
const url = require("url");
const querystring = require("querystring");
const className = "BrowserActions";
function checkSpecified(className, functionName, parameterName, parameterValue) {
if (!parameterValue) {
let error = new Error(`[${className}].[${functionName}] Parameter '${parameterName}' is not specified.`);
Error.captureStackTrace(error, checkSpecified);
throw error;
}
}
class BrowserActions {
static isPageLoaded(activeBrowser, pageDefinition) {
let methodName = "isPageLoaded";
checkSpecified(className, methodName, "activeBrowser", activeBrowser);
checkSpecified(className, methodName, "pageDefinition", pageDefinition);
let promise = new Promise((resolve, reject) => {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] entered.`);
let urlPromise = activeBrowser.getCurrentUrl();
let titlePromise = activeBrowser.getTitle();
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Retrieving currentUrl and page title.`);
let promises = [Promise.resolve(urlPromise), Promise.resolve(titlePromise)];
Promise.all(promises).then((results) => {
let actualUrlString = results[0].toLowerCase();
let expectedUrlString = pageDefinition.url.toLowerCase();
let actualTitle = results[1];
let expectedTitle = pageDefinition.title;
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.test(`[${className}].[${methodName}] Testing: Page Url '${actualUrlString}' contains all components of '${expectedUrlString}'`);
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.test(`[${className}].[${methodName}] Testing: Page Title '${actualTitle}' is '${expectedTitle}'`);
let actualUrl = url.parse(actualUrlString);
let expectedUrl = url.parse(expectedUrlString);
let actualQueryObject = querystring.parse(actualUrl.query || {});
let expectedQueryObject = querystring.parse(expectedUrl.query || {});
let isCorrectHost = actualUrl.host === expectedUrl.host;
let isCorrectPath = actualUrl.pathname === expectedUrl.pathname;
let containsCorrectQuery = Lazy(expectedQueryObject).keys().every((key) => {
return actualQueryObject[key] === expectedQueryObject[key];
});
let isCorrectUrl = isCorrectHost && isCorrectPath && containsCorrectQuery;
let isCorrectTitle = actualTitle === expectedTitle;
if (!isCorrectUrl) {
let failureMessage = `Current page has unexpected url. Expected: '${expectedUrl}', Actual: '${actualUrl}'`;
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.failure(failureMessage);
reject(failureMessage);
return;
}
if (!isCorrectTitle) {
let failureMessage = `Current page has unexpected title. Expected: '${expectedTitle}', Actual: '${actualTitle}'`;
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.failure(failureMessage);
reject(failureMessage);
return;
}
resolve();
});
});
return promise;
}
static navigateTo(activeBrowser, pageDefinition) {
let methodName = "navigateTo";
checkSpecified(className, methodName, "activeBrowser", activeBrowser);
checkSpecified(className, methodName, "pageDefinition", pageDefinition);
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] entered.`);
let url = pageDefinition.url;
if (!url) {
throw new Error(`[${className}].[${methodName}] pageDefinition url parameter is not specified. Check page definition has url set.`);
}
if (url.indexOf("?") === -1) {
url += "?";
}
else {
url += "&";
}
url += "debug=true";
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.info(`[${className}].[${methodName}] Navigating to Url: "${url}".`);
let promise = new Promise((resolve, reject) => {
if (pageDefinition.isAngularPage) {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Angular navigate`);
activeBrowser.ignoreSynchronization = false;
activeBrowser.driver.get(url);
activeBrowser.waitForAngular().then(() => {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Navigated...`);
resolve();
});
}
else {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Non-Angular navigate`);
activeBrowser.ignoreSynchronization = true;
activeBrowser.driver.get(url).then(() => {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Navigated...`);
resolve();
});
}
});
return promise;
}
static pauseBrowser(activeBrowser, milliseconds) {
let methodName = "pauseBrowser";
checkSpecified(className, methodName, "activeBrowser", activeBrowser);
checkSpecified(className, methodName, "milliseconds", milliseconds);
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] entered.`);
let promise = new Promise((resolve, reject) => {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.test(`[${className}].[${methodName}] waiting for ${milliseconds}ms`);
activeBrowser.sleep(milliseconds).then(() => {
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] Waiting completed`);
resolve();
});
});
return promise;
}
static takeScreenshot(activeBrowser, outputRootPath, featureId) {
let methodName = "takeScreenshot";
checkSpecified(className, methodName, "activeBrowser", activeBrowser);
verbosity_level_aware_logger_1.VerbosityLevelAwareConsoleLog.diag(`[${className}].[${methodName}] entered.`);
let promise = new Promise((resolve, reject) => {
let screenshotter = new screenshotter_1.Screenshotter(outputRootPath);
let screenshotPromise = Promise.resolve(activeBrowser.takeScreenshot());
screenshotPromise
.then((screenshotPngData) => {
resolve(screenshotter.saveScreenshot(screenshotPngData, featureId));
});
});
return promise;
}
}
exports.BrowserActions = BrowserActions;