UNPKG

webdriverio-workflo

Version:

This is a customized version of webdriverio for use with workflo framework.

125 lines (101 loc) 4.42 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); var _q = require('q'); var _q2 = _interopRequireDefault(_q); var _findElementStrategy = require('../helpers/findElementStrategy'); var _findElementStrategy2 = _interopRequireDefault(_findElementStrategy); var _hasElementResultHelper = require('../helpers/hasElementResultHelper'); var _hasElementResultHelper2 = _interopRequireDefault(_hasElementResultHelper); var _constants = require('../helpers/constants'); var _ErrorHandler = require('../utils/ErrorHandler'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var elements = function elements(selector) { var requestPath = '/session/:sessionId/elements'; var lastPromise = this.lastResult ? (0, _q2.default)(this.lastResult).inspect() : this.lastPromise.inspect(); var relative = false; var elementResult = (0, _hasElementResultHelper2.default)(lastPromise.value); if (lastPromise.state === 'fulfilled' && elementResult) { if (!selector) { var newSelector = (0, _assign2.default)({}, lastPromise.value); /** * if last result was an element result transform result into an array */ newSelector.value = Array.isArray(newSelector.value) ? newSelector.value : newSelector.value !== null ? [newSelector.value] : []; /** * Only return new selector if existing otherwise fetch again for selector. * This is important in cases you do a waitForExist and use the same element * variable again after the element has appeared. */ if (newSelector.value.length === 0) { this.lastResult = null; return elements.call(this, newSelector.selector); } return newSelector; } /** * only run elementIdElement if lastPromise was an element command */ if (elementResult === 1) { if (lastPromise.value.value === null) { throw new _ErrorHandler.CommandError(7, lastPromise.value.selector); } /** * format xpath selector (global -> relative) */ if (selector.slice(0, 2) === '//') { selector = '.' + selector.slice(1); } var elem = lastPromise.value.value.ELEMENT; relative = true; requestPath = `/session/:sessionId/element/${elem}/elements`; } } var found = (0, _findElementStrategy2.default)(selector, relative); return this.requestHandler.create(requestPath, { using: found.using, value: found.value }).then(function (result) { result.selector = selector; /** * W3C webdriver protocol has changed element identifier from `ELEMENT` to * `element-6066-11e4-a52e-4f735466cecf`. Let's make sure both identifier * are supported. */ result.value = result.value.map(function (elem) { var elemValue = elem.ELEMENT || elem[_constants.W3C_ELEMENT_ID]; return { ELEMENT: elemValue, [_constants.W3C_ELEMENT_ID]: elemValue }; }); return result; }, function (err) { if (err.message === 'no such element') { return []; } throw err; }); }; /** * * Search for multiple elements on the page, starting from the document root. The located * elements will be returned as a WebElement JSON objects. The table below lists the * locator strategies that each server should support. Elements should be returned in * the order located in the DOM. * * The array of elements can be retrieved using the 'response.value' which is a * collection of element ID's and can be accessed in the subsequent commands * using the '.ELEMENT' method. * * @param {String} selector selector to query the elements * @return {Object[]} A list of WebElement JSON objects for the located elements. * * @see https://w3c.github.io/webdriver/webdriver-spec.html#find-elements * @type protocol * */ exports.default = elements; module.exports = exports['default'];