UNPKG

skutter

Version:

Skutter: Opinionated BDD Browser based test framework

129 lines (128 loc) 7.39 kB
"use strict"; 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;