@theintern/leadfoot
Version:
Leadfoot. A JavaScript client library that brings cross-platform consistency to the Selenium WebDriver API.
57 lines • 2.44 kB
JavaScript
;
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