UNPKG

@progress/kendo-e2e

Version:

Kendo UI end-to-end test utilities.

393 lines 19.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.WebApp = void 0; const selenium_webdriver_1 = require("selenium-webdriver"); const conditions_1 = require("./conditions"); const rgb2hex_1 = __importDefault(require("rgb2hex")); /** * This class encapsulates common location and interaction functionality over a {@link ThenableWebDriver}. */ class WebApp { constructor(driver) { this.driver = driver; } find(locator_1) { return __awaiter(this, arguments, void 0, function* (locator, { timeout = 10000, pollTimeout = 25 } = {}) { const errorMessage = `Failed to find element located by ${locator}.`; if (locator instanceof selenium_webdriver_1.By) { return yield this.driver.wait(selenium_webdriver_1.until.elementLocated(locator), timeout, errorMessage, pollTimeout); } else { return yield this.driver.wait(selenium_webdriver_1.until.elementLocated(selenium_webdriver_1.By.css(locator)), timeout, errorMessage, pollTimeout); } }); } findAll(locator) { return __awaiter(this, void 0, void 0, function* () { if (locator instanceof selenium_webdriver_1.By) { return yield this.driver.findElements(locator); } else { return yield this.driver.findElements(selenium_webdriver_1.By.css(locator)); } }); } findChild(rootElement_1, locator_1) { return __awaiter(this, arguments, void 0, function* (rootElement, locator, { waitForChild = true, timeout = 10000, pollTimeout = 25 } = {}) { if (!(rootElement instanceof selenium_webdriver_1.WebElement)) { rootElement = yield this.find(rootElement); } if (waitForChild) { const message = `Failed to find child element located by ${locator}.`; yield this.wait(conditions_1.EC.hasChild(rootElement, locator), { timeout: timeout, message: message, pollTimeout: pollTimeout }); } return (locator instanceof selenium_webdriver_1.By) ? rootElement.findElement(locator) : rootElement.findElement(selenium_webdriver_1.By.css(locator)); }); } findChildren(rootElement_1, locator_1) { return __awaiter(this, arguments, void 0, function* (rootElement, locator, { waitForChild = true, timeout = 10000, pollTimeout = 25 } = {}) { if (!(rootElement instanceof selenium_webdriver_1.WebElement)) { rootElement = yield this.find(rootElement); } if (waitForChild) { const message = `Failed to find child element located by ${locator}.`; yield this.wait(conditions_1.EC.hasChild(rootElement, locator), { timeout: timeout, message: message, pollTimeout: pollTimeout }); } return (locator instanceof selenium_webdriver_1.By) ? rootElement.findElements(locator) : rootElement.findElements(selenium_webdriver_1.By.css(locator)); }); } click(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { try { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } yield element.click(); } catch (_a) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } const notVisibleMessage = (element instanceof selenium_webdriver_1.WebElement) ? `Element located is not visible.` : `Element located by ${element} is not visible.`; const notEnabledMessage = (element instanceof selenium_webdriver_1.WebElement) ? `Element located is not visible.` : `Element located by ${element} is not visible.`; yield this.wait(selenium_webdriver_1.until.elementIsVisible(element), { timeout: timeout, message: notVisibleMessage }); yield this.wait(selenium_webdriver_1.until.elementIsEnabled(element), { timeout: timeout, message: notEnabledMessage }); yield element.click(); } }); } hover(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } const actions = this.driver.actions({ async: true, bridge: true }); yield actions.move({ origin: element }).perform(); }); } focus(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } yield this.driver.executeScript(`arguments[0].focus();`, element); yield this.driver.sleep(50); }); } contextClick(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } const actions = this.driver.actions({ async: true, bridge: true }); yield actions.contextClick(element).perform(); }); } doubleClick(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } const actions = this.driver.actions({ async: true, bridge: true }); yield actions.doubleClick(element).perform(); }); } waitForAnimationAndClick(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 50 } = {}) { yield this.waitForAnimation(element, { timeout: timeout, pollTimeout: pollTimeout }); yield this.click(element, { timeout: timeout, pollTimeout: pollTimeout }); }); } scrollAndClick(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element, { timeout: timeout, pollTimeout: pollTimeout }); } yield this.driver.executeScript("arguments[0].scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' });", element); yield element.click(); }); } scrollIntoView(locator_1) { return __awaiter(this, arguments, void 0, function* (locator, { timeout = 10000, pollTimeout = 25 } = {}) { const element = yield this.find(locator, { timeout: timeout, pollTimeout: pollTimeout }); yield this.driver.executeScript("arguments[0].scrollIntoView({ behavior: 'instant', block: 'center', inline: 'nearest' });", element); }); } dragTo(source, target) { return __awaiter(this, void 0, void 0, function* () { let sourceElement; let targetElement; if (source instanceof selenium_webdriver_1.By) { sourceElement = yield this.find(source); } else { sourceElement = source; } if (target instanceof selenium_webdriver_1.By) { targetElement = yield this.find(target); } else { targetElement = target; } const actions = this.driver.actions({ async: true, bridge: true }); yield actions.dragAndDrop(sourceElement, targetElement).perform(); }); } dragByOffset(element, offsetX, offsetY) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } const actions = this.driver.actions({ async: true, bridge: true }); yield actions.dragAndDrop(element, { x: offsetX, y: offsetY }).perform(); }); } type(element_1, text_1) { return __awaiter(this, arguments, void 0, function* (element, text, { clear = true, sendEnter = false } = {}) { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } if (clear) { yield element.clear(); } yield element.sendKeys(text); if (sendEnter) { yield this.sendKey(selenium_webdriver_1.Key.ENTER); } }); } sendKey(key) { return __awaiter(this, void 0, void 0, function* () { yield this.driver.actions({ async: true, bridge: true }).sendKeys(key).perform(); }); } sendKeyCombination(key1, key2) { return __awaiter(this, void 0, void 0, function* () { yield this.sendKeysCombination([key1, key2]); }); } sendKeysCombination(keys) { return __awaiter(this, void 0, void 0, function* () { const actions = this.driver.actions({ async: false, bridge: true }); for (const key of keys) { actions.keyDown(key).pause(10); } for (const key of keys.reverse()) { actions.keyUp(key).pause(10); } yield actions.perform(); }); } sendControlKeyCombination(key) { return __awaiter(this, void 0, void 0, function* () { const control = (process.platform === 'darwin' ? selenium_webdriver_1.Key.COMMAND : selenium_webdriver_1.Key.CONTROL); yield this.sendKeysCombination([control, key]); }); } isVisible(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { return yield this.waitSafely(conditions_1.EC.isVisible(element), { timeout: timeout, pollTimeout: pollTimeout }); }); } isNotVisible(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { return yield this.waitSafely(conditions_1.EC.notVisible(element), { timeout: timeout, pollTimeout: pollTimeout }); }); } isInViewport(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { return yield this.waitSafely(conditions_1.EC.isInViewport(element), { timeout: timeout, pollTimeout: pollTimeout }); }); } isNotInViewport(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 25 } = {}) { return yield this.waitSafely(conditions_1.EC.notInViewport(element), { timeout: timeout, pollTimeout: pollTimeout }); }); } hasFocus(element) { return __awaiter(this, void 0, void 0, function* () { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasFocus(element)) : yield this.waitSafely(conditions_1.EC.hasFocus(yield this.find(element))); }); } hasNoFocus(element) { return __awaiter(this, void 0, void 0, function* () { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasNoFocus(element)) : yield this.waitSafely(conditions_1.EC.hasNoFocus(yield this.find(element))); }); } hasText(element, text) { return __awaiter(this, void 0, void 0, function* () { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasText(element, text)) : yield this.waitSafely(conditions_1.EC.hasText(yield this.find(element), text)); }); } hasValue(element, value) { return __awaiter(this, void 0, void 0, function* () { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasValue(element, value)) : yield this.waitSafely(conditions_1.EC.hasValue(yield this.find(element), value)); }); } hasAttribute(element_1, attribute_1, value_1) { return __awaiter(this, arguments, void 0, function* (element, attribute, value, exactMatch = true) { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasAttribute(element, attribute, value, exactMatch)) : yield this.waitSafely(conditions_1.EC.hasAttribute(yield this.find(element), attribute, value, exactMatch)); }); } hasClass(element_1, value_1) { return __awaiter(this, arguments, void 0, function* (element, value, exactMatch = false) { return (element instanceof selenium_webdriver_1.WebElement) ? yield this.waitSafely(conditions_1.EC.hasClass(element, value, exactMatch)) : yield this.waitSafely(conditions_1.EC.hasClass(yield this.find(element), value, exactMatch)); }); } sleep(milliseconds) { return __awaiter(this, void 0, void 0, function* () { yield this.driver.sleep(milliseconds); }); } wait(condition_1) { return __awaiter(this, arguments, void 0, function* (condition, { timeout = 10000, message = 'Failed to satisfy condition.', pollTimeout = 25 } = {}) { yield this.driver.wait(condition, timeout, message, pollTimeout); }); } waitSafely(condition_1) { return __awaiter(this, arguments, void 0, function* (condition, { timeout = 10000, pollTimeout = 25 } = {}) { try { yield this.driver.wait(condition, timeout, null, pollTimeout); return true; } catch (error) { return false; } }); } waitForAnimation(element_1) { return __awaiter(this, arguments, void 0, function* (element, { timeout = 10000, pollTimeout = 50 } = {}) { const locatorStringValue = (element instanceof selenium_webdriver_1.WebElement) ? 'element' : element; yield this.wait(conditions_1.EC.isVisible(element), { timeout: timeout, message: `Failed to find ${locatorStringValue}` }); const isElementStable = () => __awaiter(this, void 0, void 0, function* () { const rect = (element instanceof selenium_webdriver_1.WebElement) ? yield element.getRect() : yield (yield this.find(element)).getRect(); yield this.sleep(pollTimeout); const newRect = (element instanceof selenium_webdriver_1.WebElement) ? yield element.getRect() : yield (yield this.find(element)).getRect(); return (rect.x === newRect.x && rect.y === newRect.y && rect.width === newRect.width && rect.height === newRect.height); }); yield this.wait(isElementStable, { timeout: timeout, message: `Element ${locatorStringValue} is still moving or resizing.` }); }); } getScreenshot() { return __awaiter(this, void 0, void 0, function* () { return yield this.driver.takeScreenshot(); }); } // eslint-disable-next-line @typescript-eslint/ban-types executeScript(script) { return __awaiter(this, void 0, void 0, function* () { return yield this.driver.executeScript(script); }); } getText(element) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } try { return yield element.getText(); } catch (_a) { return undefined; } }); } getAttribute(element, attribute) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } return yield element.getAttribute(attribute); }); } getProperty(element, property) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } const script = function (element, property) { return element[property]; }; return yield this.driver.executeScript(script, element, property); }); } getColor(element) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } const color = yield element.getCssValue('color'); return (0, rgb2hex_1.default)(color).hex; }); } getBackgroundColor(element) { return __awaiter(this, void 0, void 0, function* () { if (!(element instanceof selenium_webdriver_1.WebElement)) { element = yield this.find(element); } const color = yield element.getCssValue('background-color'); return (0, rgb2hex_1.default)(color).hex; }); } } exports.WebApp = WebApp; //# sourceMappingURL=web-app.js.map