tlc-core-automation-framework-v3-wdio-v9
Version:
Background: - We are following multi-layer automation framework architecture using webdriver.io + cucumber + typescript This core framework has been implemented with generic utility functions and cucumber steps, which can be easily consumed by another fra
197 lines • 31.9 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const cucumber_1 = require("@cucumber/cucumber");
const compareText_1 = __importDefault(require("../helpers/framework-helpers/check/compareText"));
const checkEqualsText_1 = __importDefault(require("../helpers/framework-helpers/check/checkEqualsText"));
const checkContainsText_1 = __importDefault(require("../helpers/framework-helpers/check/checkContainsText"));
const checkIsEmpty_1 = __importDefault(require("../helpers/framework-helpers/check/checkIsEmpty"));
const checkProperty_1 = __importDefault(require("../helpers/framework-helpers/check/checkProperty"));
const checkDimension_1 = __importDefault(require("../helpers/framework-helpers/check/checkDimension"));
const checkOffset_1 = __importDefault(require("../helpers/framework-helpers/check/checkOffset"));
const clickElement_1 = __importDefault(require("../helpers/framework-helpers/action/clickElement"));
const clearInputField_1 = __importDefault(require("../helpers/framework-helpers/action/clearInputField"));
const dragElement_1 = __importDefault(require("../helpers/framework-helpers/action/dragElement"));
const selectOptionByIndex_1 = __importDefault(require("../helpers/framework-helpers/action/selectOptionByIndex"));
const selectOption_1 = __importDefault(require("../helpers/framework-helpers/action/selectOption"));
const mouseHoverToCoordinates_1 = __importDefault(require("../helpers/framework-helpers/action/mouseHoverToCoordinates"));
const scroll_1 = __importDefault(require("../helpers/framework-helpers/action/scroll"));
const typeSlowlyIntoInputBox_1 = __importDefault(require("../helpers/framework-helpers/action/typeSlowlyIntoInputBox"));
const checkIfElementExists_1 = __importDefault(require("../helpers/framework-helpers/check/checkIfElementExists"));
const checkWithinViewport_1 = __importDefault(require("../helpers/framework-helpers/check/checkWithinViewport"));
const checkClass_1 = __importDefault(require("../helpers/framework-helpers/check/checkClass"));
const waitForElementState_1 = __importDefault(require("../helpers/framework-helpers/action/waitForElementState"));
const setInputField_1 = __importDefault(require("../helpers/framework-helpers/action/setInputField"));
const mouseHoverToCoordinates_2 = __importDefault(require("../helpers/framework-helpers/action/mouseHoverToCoordinates"));
const mouseHoverToElement_1 = __importDefault(require("../helpers/framework-helpers/action/mouseHoverToElement"));
const mouseHoverToElementByIndex_1 = __importDefault(require("../helpers/framework-helpers/action/mouseHoverToElementByIndex"));
const checkIfElementExistsByIndex_1 = __importDefault(require("../helpers/framework-helpers/check/checkIfElementExistsByIndex"));
const checkElementTextByIndex_1 = __importDefault(require("../helpers/framework-helpers/check/checkElementTextByIndex"));
const checkElementText_1 = __importDefault(require("../helpers/framework-helpers/check/checkElementText"));
const checkElementTextMatchesByIndex_1 = __importDefault(require("../helpers/framework-helpers/check/checkElementTextMatchesByIndex"));
const waitForElementStateByIndex_1 = __importDefault(require("../helpers/framework-helpers/action/waitForElementStateByIndex"));
const config_helper_1 = require("../helpers/common-helpers/config-helper");
let pageConfig;
(0, cucumber_1.Given)(/^I expect that element "([^"]*)?" is( not)? (Clickable|Displayed|Selected|Existing|Enabled|Focused|Checked)$/, async (pageObject, falseCase, elementState) => {
console.log(`I expect that element ${pageObject} is ${falseCase ? 'not' : ''} ${elementState}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, waitForElementState_1.default)(pageConfig, falseCase, elementState, 0, 0);
});
(0, cucumber_1.Given)(/^I wait and expect that element "([^"]*)?" is( not)? (Clickable|Displayed|Selected|Existing|Enabled|Focused|Checked)$/, async (pageObject, falseCase, elementState) => {
console.log(`I wait and expect that element ${pageObject} is ${falseCase ? 'not' : ''} ${elementState}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, waitForElementState_1.default)(pageConfig, falseCase, elementState, 55, 1000);
});
(0, cucumber_1.Given)(/^I expect that (\d+)(?:th|st|nd|rd) "([^"]*)" (?:button|link|icon|element) is( not)? (Clickable|Displayed|Selected|Existing|Enabled|Focused|Checked)$/, async (elementPosition, pageObject, falseCase, elementState) => {
console.log(`I expect that ${elementPosition} ${pageObject} element is ${falseCase ? 'not' : ''} ${elementState}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, waitForElementStateByIndex_1.default)(elementPosition, pageConfig, falseCase, elementState, 0, 0);
});
(0, cucumber_1.Given)(/^I wait and expect that (\d+)(?:th|st|nd|rd) "([^"]*)" (?:button|link|icon|element) is( not)? (Clickable|Displayed|Selected|Existing|Enabled|Focused|Checked)$/, async (elementPosition, pageObject, falseCase, elementState) => {
console.log(`I expect that ${elementPosition} ${pageObject} element is ${falseCase ? 'not' : ''} ${elementState}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, waitForElementStateByIndex_1.default)(elementPosition, pageConfig, falseCase, elementState, 5, 1000);
});
(0, cucumber_1.Given)(/^the element "([^"]*)?"( not)? contains the same text as element "([^"]*)?"$/, async (pageObject1, falseCase, pageObject2) => {
console.log(`the element ${pageObject1} ${falseCase ? 'not' : ''} contains the same text as element ${pageObject2}`);
const pageConfig1 = config_helper_1.ConfigHelper.getPageConfig(pageObject1);
const pageConfig2 = config_helper_1.ConfigHelper.getPageConfig(pageObject2);
await (0, compareText_1.default)(pageConfig1, falseCase, pageConfig2);
});
(0, cucumber_1.Given)(/^the (button|element|field) "([^"]*)?" is( not)? empty$/, async (elementType, pageObject, falseCase) => {
console.log(`The ${elementType} ${pageObject} is ${falseCase ? 'not' : ''} empty`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkIsEmpty_1.default)(elementType, pageConfig, falseCase);
});
(0, cucumber_1.Given)(/^the( css)? attribute "([^"]*)?" from element "([^"]*)?" is( not)? expected to be "([^"]*)?"$/, async (isCSS, attrName, pageObject, falseCase, expectedValue) => {
console.log(`The ${isCSS} attribute ${attrName} from element ${pageObject} is ${falseCase ? 'not' : ''} expected to be ${expectedValue}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkProperty_1.default)(isCSS, attrName, pageConfig, falseCase, expectedValue);
});
(0, cucumber_1.When)(/^I (add|set) "([^"]*)?" to the input field "([^"]*)?"$/, async (method, value, pageObject) => {
console.log(`I ${method} ${value} to the input field ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, setInputField_1.default)(method, value, pageConfig);
});
(0, cucumber_1.When)(/^I slowly type "([^"]*)?" into the input field "([^"]*)?" at a speed of "([^"]*)" milliseconds$/, async (value, pageObject, timeInMillis) => {
console.log(`I slowly type ${value} into the input field ${pageObject} at a speed of ${timeInMillis} milliseconds`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, typeSlowlyIntoInputBox_1.default)(value, pageConfig, timeInMillis);
});
(0, cucumber_1.When)(/^I clear the input field "([^"]*)?"$/, async (pageObject) => {
console.log(`I clear the input field ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, clearInputField_1.default)(pageConfig);
});
(0, cucumber_1.When)(/^I select the (\d+)(?:st|nd|rd|th) option from the list of element "([^"]*)?"$/, async (index, pageObject) => {
console.log(`I select the ${index} option from the list of element ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, selectOptionByIndex_1.default)(index, pageConfig);
});
(0, cucumber_1.When)(/^I select the option with the (value|text) "([^"]*)?" from the element "([^"]*)?"$/, async (selectionType, selectionValue, pageObject) => {
console.log(`I select the option with the ${selectionType} from the element ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, selectOption_1.default)(selectionType, selectionValue, pageConfig);
});
(0, cucumber_1.When)(/^I move to element "([^"]*)?"(?: with an offset of (\d+),(\d+))*$/, async (pageObject, xCoordinate, yCoordinate) => {
console.log(`I move to element ${pageObject} with an offset of ${xCoordinate},${yCoordinate}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, mouseHoverToCoordinates_1.default)(pageConfig, xCoordinate, yCoordinate);
});
(0, cucumber_1.When)(/^I scroll to element "([^"]*)?"$/, async (pageObject) => {
console.log(`I scroll to element ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, scroll_1.default)(pageConfig);
});
(0, cucumber_1.When)(/^I (click|doubleClick) on the element "([^"]*)?"$/, async (action, pageObject) => {
console.log(`I ${action} on the element ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, clickElement_1.default)(action, pageConfig);
});
(0, cucumber_1.Then)(/^I expect that element "([^"]*)?" does (not )?appear (\d+) times$/, async (pageObject, falseCase, exactly) => {
console.log(`I expect that element ${pageObject} does ${falseCase ? 'not' : ''} appear ${exactly} times`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkIfElementExists_1.default)(pageConfig, falseCase, exactly);
});
(0, cucumber_1.Then)(/^I expect that element "([^"]*)?" is (not )?within the viewport$/, async (pageObject, falseCase) => {
console.log(`I expect that element ${pageObject} is ${falseCase ? 'not' : ''} within the viewport`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkWithinViewport_1.default)(pageConfig, falseCase);
});
(0, cucumber_1.Then)(/^I expect that element "([^"]*)?" does( not)? have the class contains "([^"]*)?"$/, async (pageObject, falseCase, expectedClassName) => {
console.log(`I expect that element ${pageObject} does ${falseCase ? 'not' : ''} have the class contains ${expectedClassName}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkClass_1.default)(pageConfig, falseCase, expectedClassName);
});
(0, cucumber_1.When)(/^I mouse hover to the element "([^"]*)?"$/, async (pageObject) => {
console.log(`I mouse hover to the element ${pageObject}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, mouseHoverToElement_1.default)(pageConfig);
});
(0, cucumber_1.When)(/^I mouse hover to the (\d+)(?:th|st|nd|rd) "([^"]*)" element$/, async (elementPosition, pageObject) => {
console.log(`I mouse hover to the ${elementPosition} ${pageObject} element`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, mouseHoverToElementByIndex_1.default)(elementPosition, pageConfig);
});
(0, cucumber_1.When)(/^I mouse hover to element "([^"]*)?"(?: with an offset of (\d+),(\d+))*$/, async (pageObject, xCoordinate, yCoordinate) => {
console.log(`I mouse hover to element ${pageObject} with an offset of ${xCoordinate},${yCoordinate}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, mouseHoverToCoordinates_2.default)(pageConfig, xCoordinate, yCoordinate);
});
// Can't implement this step in the existing website, keeping it for future
(0, cucumber_1.Given)(/^the element "([^"]*)?" is( not)? ([\d]+)px (broad|tall)$/, async (pageObject, falseCase, expectedValue, dimension) => {
console.log(`The element ${pageObject} is ${falseCase ? 'not' : ''} ${expectedValue} ${dimension}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkDimension_1.default)(pageConfig, falseCase, expectedValue, dimension);
});
// Can't implement this step in the existing website, keeping it for future
(0, cucumber_1.Given)(/^the element "([^"]*)?" is( not)? positioned at (\d+)px on the (x|y) axis$/, async (pageObject, falseCase, expectedPosition, axis) => {
console.log(`The element ${pageObject} is ${falseCase ? 'not' : ''} positioned at ${expectedPosition} on the ${axis}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkOffset_1.default)(pageConfig, falseCase, expectedPosition, axis);
});
// Can't implement this step in the existing website, keeping it for future
(0, cucumber_1.When)(/^I drag element "([^"]*)?" to element "([^"]*)?"$/, async (SelectedPageObject, DestinationPageObject) => {
console.log(`I drag element ${SelectedPageObject} to element ${DestinationPageObject}`);
const SelectedPageConfig = config_helper_1.ConfigHelper.getPageConfig(SelectedPageObject);
const DestinationPageConfig = config_helper_1.ConfigHelper.getPageConfig(DestinationPageObject);
await (0, dragElement_1.default)(SelectedPageConfig, DestinationPageConfig);
});
(0, cucumber_1.Given)(/^the (\d+)(?:th|st|nd|rd) "([^"]*)" (?:button|link|icon|element) is( not)? present$/, async (elementPosition, pageObject, falseCase) => {
console.log(`The ${elementPosition} ${pageObject} element is ${falseCase ? 'not' : ''} present`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkIfElementExistsByIndex_1.default)(elementPosition, pageConfig, falseCase);
});
(0, cucumber_1.Given)(/^the (button|element|field) "([^"]*)?"( not)? matches the text "([^"]*)?"( ignoring-case)?$/, async (elementType, pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`The ${elementType} ${pageObject} ${falseCase ? 'not' : ''} matches the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkEqualsText_1.default)(elementType, pageConfig, falseCase, expectedText, ignoreCase);
});
(0, cucumber_1.Given)(/^the (?:button|element|container) "([^"]*)?" (not )?contains the text "([^"]*)?"( ignoring-case)?$/, async (pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`The (button|element|container) ${pageObject} ${falseCase ? 'not' : ''} contains the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkContainsText_1.default)(pageConfig, falseCase, expectedText, ignoreCase);
});
(0, cucumber_1.Given)(/^the "([^"]*)" (?:button|link|icon|element) (not )?contains the text "([^"]*)"( ignoring-case)?$/, async (pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`The ${pageObject} element ${falseCase ? 'not' : ''} contains the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkElementText_1.default)(pageConfig, falseCase, expectedText, 10, ignoreCase);
});
(0, cucumber_1.Given)(/^I wait and expect the "([^"]*)" (?:button|link|icon|element) (not )?contains the text "([^"]*)"( ignoring-case)?$/, async (pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`I wait and expect the ${pageObject} element ${falseCase ? 'not' : ''} contains the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkElementText_1.default)(pageConfig, falseCase, expectedText, 50, ignoreCase);
});
(0, cucumber_1.Given)(/^the (\d+)(?:th|st|nd|rd) "([^"]*)" (?:button|link|icon|element) (not )?contains the text "([^"]*)"( ignoring-case)?$/, async (elementPosition, pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`The ${elementPosition} ${pageObject} element ${falseCase ? 'not' : ''} contains the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkElementTextByIndex_1.default)(elementPosition, pageConfig, falseCase, expectedText, ignoreCase);
});
(0, cucumber_1.Given)(/^the (\d+)(?:th|st|nd|rd) "([^"]*)" (?:button|link|icon|element) (not )?matches the text "([^"]*)"( ignoring-case)?$/, async (elementPosition, pageObject, falseCase, expectedText, ignoreCase) => {
console.log(`The ${elementPosition} th|st|nd|rd ${pageObject} element ${falseCase ? 'not' : ''} matches the text ${expectedText} ${ignoreCase ? 'ignoring case' : ''}`);
pageConfig = config_helper_1.ConfigHelper.getPageConfig(pageObject);
await (0, checkElementTextMatchesByIndex_1.default)(elementPosition, pageConfig, falseCase, expectedText, ignoreCase);
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHRtbEVsZW1lbnQtc3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZTJlL3N0ZXAtZGVmaW5pdGlvbnMvaHRtbEVsZW1lbnQtc3RlcHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxpREFBcUQ7QUFDckQsaUdBQXlFO0FBQ3pFLHlHQUFpRjtBQUNqRiw2R0FBcUY7QUFDckYsbUdBQTJFO0FBQzNFLHFHQUE2RTtBQUM3RSx1R0FBK0U7QUFDL0UsaUdBQXlFO0FBQ3pFLG9HQUE0RTtBQUM1RSwwR0FBa0Y7QUFDbEYsa0dBQTBFO0FBQzFFLGtIQUEwRjtBQUMxRixvR0FBNEU7QUFDNUUsMEhBQWlGO0FBQ2pGLHdGQUFnRTtBQUNoRSx3SEFBZ0c7QUFDaEcsbUhBQTJGO0FBQzNGLGlIQUF5RjtBQUN6RiwrRkFBdUU7QUFDdkUsa0hBQTBGO0FBQzFGLHNHQUE4RTtBQUM5RSwwSEFBa0c7QUFDbEcsa0hBQTBGO0FBQzFGLGdJQUF3RztBQUN4RyxpSUFBeUc7QUFDekcseUhBQWlHO0FBQ2pHLDJHQUFtRjtBQUNuRix1SUFBK0c7QUFDL0csZ0lBQXdHO0FBQ3hHLDJFQUFxRTtBQUdyRSxJQUFJLFVBQTJCLENBQUM7QUFFaEMsSUFBQSxnQkFBSyxFQUFDLDhHQUE4RyxFQUFFLEtBQUssRUFBRSxVQUFrQixFQUFFLFNBQWtCLEVBQUUsWUFBcUcsRUFBRSxFQUFFO0lBQzFRLE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLFVBQVUsT0FBTyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDaEcsVUFBVSxHQUFHLDRCQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sSUFBQSw2QkFBbUIsRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7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