UNPKG

@theintern/leadfoot

Version:

Leadfoot. A JavaScript client library that brings cross-platform consistency to the Selenium WebDriver API.

57 lines 2.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var common_1 = require("@theintern/common"); var statusCodes_1 = __importDefault(require("./statusCodes")); /** * Gets the first [[Element.isDisplayed|displayed]] element inside this element * matching the given query. This is inherently slower than [[Element.find]], * so should only be used in cases where the visibility of an element cannot be * ensured in advance. */ function findDisplayed(session, locator, strategy, value) { return session.getTimeout('implicit').then(function (originalTimeout) { var startTime = Date.now(); function poll() { return locator.findAll(strategy, value).then(function (elements) { // Due to concurrency issues with at least ChromeDriver // 2.16, each element must be tested one at a time instead // of using `Promise.all` var i = -1; function checkElement() { var element = elements[++i]; if (element) { return element.isDisplayed().then(function (isDisplayed) { if (isDisplayed) { return element; } else { return checkElement(); } }); } } return common_1.Task.resolve(checkElement()).then(function (element) { if (element) { return element; } else if (Date.now() - startTime > originalTimeout) { var error = new Error(); error.status = elements.length ? 11 : 7; error.name = statusCodes_1.default[error.status][0]; error.message = statusCodes_1.default[error.status][1]; throw error; } else { return poll(); } }); }); } return poll(); }); } exports.default = findDisplayed; //# sourceMappingURL=findDisplayed.js.map