all files / DEV/lib/commands/ selectorExecuteAsync.js

92.59% Statements 25/27
75% Branches 12/16
33.33% Functions 1/3
66.67% Lines 2/3
14 statements, 9 branches Ignored     
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93                                                                                                                                                                                       
/**
 * Works just like execute, only you can use Selenium selector strategies to pass html elements to
 * the asynchronous function you wish to execute in the browser.
 *
 * The asynchronous function fn will receive every resolved selector as an array of html elements,
 * even if there is only one result, or no result.
 * These arrays are the first arguments the function fn receives.
 * If you pass an array of selectors, the resulting html element arrays are returned in the same order.
 *
 * All arguments you append after function fn are added as the arguments after the html arrays.
 * You can use any JSON value or a function as such an argument.
 *
 * <example>
 :selectorExecuteAsync.js
    client.selectorExecuteAsync("//div", function(divs, message, callback) {
        callback(divs.length + message);
    }, " divs on the page").then(function(msg){
        console.log(msg); // returns, for example, "68 divs on the page"
    });
 
    client.selectorExecuteAsync(["//div", "=Read Post"], function(divs, links, callback) {
        var message = 'There are ';
 
        message += divs.length + ' divs on the page';
        message += ' and ';
        message += links.length + ' links with an link text "' + links[0].text + '"';
 
        callback(message);
    }).then(function(msg){
        console.log(msg); // returns, for example, "There are 68 divs on the page and 42 links with an link text 'Read Post'"
    });
 * </example>
 *
 * @param {String|Array.<String>} selectors                  single selector or array of selectors
 * @param {Function}              script                     asynchronous function to get executed in the browser
 * @param {...*}                  [argument1,...,argumentN]  arguments added to fn. Can be any JSON value or function
 *
 * @uses protocol/execute
 * @type action
 */
 
'use strict';
 
Object.defineProperty(exports, '__esModule', {
    value: true
});
// istanbul ignore next
 
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
 
var _helpersEnsureClientSideSelectorSupport = require('../helpers/ensureClientSideSelectorSupport');
 
var _helpersEnsureClientSideSelectorSupport2 = _interopRequireDefault(_helpersEnsureClientSideSelectorSupport);
 
var _scriptsCreateSelectorScript = require('../scripts/createSelectorScript');
 
var _scriptsCreateSelectorScript2 = _interopRequireDefault(_scriptsCreateSelectorScript);
 
var _utilsErrorHandler = require('../utils/ErrorHandler');
 
var selectorExecuteAsync = function selectorExecuteAsync() {
    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
        args[_key] = arguments[_key];
    }
 
    var selector = args.shift();
    var script = args.shift();
 
    if (typeof selector === 'string') {
        selector = [selector];
    }
    if (!Array.isArray(selector)) {
        throw new _utilsErrorHandler.CommandError('Argument \'selector\' must be string or array of strings.');
    }
    if (!/string|function/.test(typeof script)) {
        throw new _utilsErrorHandler.CommandError('Argument \'script\' must be a function or string.');
    }
 
    var fullScript = _scriptsCreateSelectorScript2['default'].call(this, script, selector, args);
    return _helpersEnsureClientSideSelectorSupport2['default'].call(this).executeAsync(fullScript).then(function (res) {
        var result = res && res.value;
 
        if (result && result.message === 'NoSuchElement') {
            throw new _utilsErrorHandler.CommandError(7);
        }
 
        return result;
    });
};
 
exports['default'] = selectorExecuteAsync;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9jaHJpc3RpYW5icm9tYW5uL1NpdGVzL1dlYnByb2pla3RlL3dlYmRyaXZlcmpzL0RFVi9saWIvY29tbWFuZHMvc2VsZWN0b3JFeGVjdXRlQXN5bmMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7c0RBeUM0Qyw0Q0FBNEM7Ozs7MkNBQ3ZELGlDQUFpQzs7OztpQ0FDckMsdUJBQXVCOztBQUVwRCxJQUFJLG9CQUFvQixHQUFHLFNBQXZCLG9CQUFvQixHQUFzQjtzQ0FBTixJQUFJO0FBQUosWUFBSTs7O0FBQ3hDLFFBQUksUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTtBQUMzQixRQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7O0FBRXpCLFFBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO0FBQzlCLGdCQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQTtLQUN4QjtBQUNELFFBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO0FBQzFCLGNBQU0sZ0dBQTJFLENBQUE7S0FDcEY7QUFDRCxRQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLE9BQU8sTUFBTSxDQUFDLEVBQUU7QUFDeEMsY0FBTSx3RkFBbUUsQ0FBQTtLQUM1RTs7QUFFRCxRQUFJLFVBQVUsR0FBRyx5Q0FBcUIsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFBO0FBQ3hFLFdBQU8sb0RBQWdDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsR0FBRyxFQUFLO0FBQ3JGLFlBQUksTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFBOztBQUU3QixZQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLGVBQWUsRUFBRTtBQUM5QyxrQkFBTSxvQ0FBaUIsQ0FBQyxDQUFDLENBQUE7U0FDNUI7O0FBRUQsZUFBTyxNQUFNLENBQUE7S0FDaEIsQ0FBQyxDQUFBO0NBQ0wsQ0FBQTs7cUJBRWMsb0JBQW9CIiwiZmlsZSI6Ii9Vc2Vycy9jaHJpc3RpYW5icm9tYW5uL1NpdGVzL1dlYnByb2pla3RlL3dlYmRyaXZlcmpzL0RFVi9saWIvY29tbWFuZHMvc2VsZWN0b3JFeGVjdXRlQXN5bmMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdvcmtzIGp1c3QgbGlrZSBleGVjdXRlLCBvbmx5IHlvdSBjYW4gdXNlIFNlbGVuaXVtIHNlbGVjdG9yIHN0cmF0ZWdpZXMgdG8gcGFzcyBodG1sIGVsZW1lbnRzIHRvXG4gKiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHlvdSB3aXNoIHRvIGV4ZWN1dGUgaW4gdGhlIGJyb3dzZXIuXG4gKlxuICogVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBmbiB3aWxsIHJlY2VpdmUgZXZlcnkgcmVzb2x2ZWQgc2VsZWN0b3IgYXMgYW4gYXJyYXkgb2YgaHRtbCBlbGVtZW50cyxcbiAqIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUgcmVzdWx0LCBvciBubyByZXN1bHQuXG4gKiBUaGVzZSBhcnJheXMgYXJlIHRoZSBmaXJzdCBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGZuIHJlY2VpdmVzLlxuICogSWYgeW91IHBhc3MgYW4gYXJyYXkgb2Ygc2VsZWN0b3JzLCB0aGUgcmVzdWx0aW5nIGh0bWwgZWxlbWVudCBhcnJheXMgYXJlIHJldHVybmVkIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIEFsbCBhcmd1bWVudHMgeW91IGFwcGVuZCBhZnRlciBmdW5jdGlvbiBmbiBhcmUgYWRkZWQgYXMgdGhlIGFyZ3VtZW50cyBhZnRlciB0aGUgaHRtbCBhcnJheXMuXG4gKiBZb3UgY2FuIHVzZSBhbnkgSlNPTiB2YWx1ZSBvciBhIGZ1bmN0aW9uIGFzIHN1Y2ggYW4gYXJndW1lbnQuXG4gKlxuICogPGV4YW1wbGU+XG4gOnNlbGVjdG9yRXhlY3V0ZUFzeW5jLmpzXG4gICAgY2xpZW50LnNlbGVjdG9yRXhlY3V0ZUFzeW5jKFwiLy9kaXZcIiwgZnVuY3Rpb24oZGl2cywgbWVzc2FnZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soZGl2cy5sZW5ndGggKyBtZXNzYWdlKTtcbiAgICB9LCBcIiBkaXZzIG9uIHRoZSBwYWdlXCIpLnRoZW4oZnVuY3Rpb24obXNnKXtcbiAgICAgICAgY29uc29sZS5sb2cobXNnKTsgLy8gcmV0dXJucywgZm9yIGV4YW1wbGUsIFwiNjggZGl2cyBvbiB0aGUgcGFnZVwiXG4gICAgfSk7XG5cbiAgICBjbGllbnQuc2VsZWN0b3JFeGVjdXRlQXN5bmMoW1wiLy9kaXZcIiwgXCI9UmVhZCBQb3N0XCJdLCBmdW5jdGlvbihkaXZzLCBsaW5rcywgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIG1lc3NhZ2UgPSAnVGhlcmUgYXJlICc7XG5cbiAgICAgICAgbWVzc2FnZSArPSBkaXZzLmxlbmd0aCArICcgZGl2cyBvbiB0aGUgcGFnZSc7XG4gICAgICAgIG1lc3NhZ2UgKz0gJyBhbmQgJztcbiAgICAgICAgbWVzc2FnZSArPSBsaW5rcy5sZW5ndGggKyAnIGxpbmtzIHdpdGggYW4gbGluayB0ZXh0IFwiJyArIGxpbmtzWzBdLnRleHQgKyAnXCInO1xuXG4gICAgICAgIGNhbGxiYWNrKG1lc3NhZ2UpO1xuICAgIH0pLnRoZW4oZnVuY3Rpb24obXNnKXtcbiAgICAgICAgY29uc29sZS5sb2cobXNnKTsgLy8gcmV0dXJucywgZm9yIGV4YW1wbGUsIFwiVGhlcmUgYXJlIDY4IGRpdnMgb24gdGhlIHBhZ2UgYW5kIDQyIGxpbmtzIHdpdGggYW4gbGluayB0ZXh0ICdSZWFkIFBvc3QnXCJcbiAgICB9KTtcbiAqIDwvZXhhbXBsZT5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheS48U3RyaW5nPn0gc2VsZWN0b3JzICAgICAgICAgICAgICAgICAgc2luZ2xlIHNlbGVjdG9yIG9yIGFycmF5IG9mIHNlbGVjdG9yc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gICAgICAgICAgICAgIHNjcmlwdCAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBnZXQgZXhlY3V0ZWQgaW4gdGhlIGJyb3dzZXJcbiAqIEBwYXJhbSB7Li4uKn0gICAgICAgICAgICAgICAgICBbYXJndW1lbnQxLC4uLixhcmd1bWVudE5dICBhcmd1bWVudHMgYWRkZWQgdG8gZm4uIENhbiBiZSBhbnkgSlNPTiB2YWx1ZSBvciBmdW5jdGlvblxuICpcbiAqIEB1c2VzIHByb3RvY29sL2V4ZWN1dGVcbiAqIEB0eXBlIGFjdGlvblxuICovXG5cbmltcG9ydCBlbnN1cmVDbGllbnRTaWRlU2VsZWN0b3JTdXBwb3J0IGZyb20gJy4uL2hlbHBlcnMvZW5zdXJlQ2xpZW50U2lkZVNlbGVjdG9yU3VwcG9ydCdcbmltcG9ydCBjcmVhdGVTZWxlY3RvclNjcmlwdCBmcm9tICcuLi9zY3JpcHRzL2NyZWF0ZVNlbGVjdG9yU2NyaXB0J1xuaW1wb3J0IHsgQ29tbWFuZEVycm9yIH0gZnJvbSAnLi4vdXRpbHMvRXJyb3JIYW5kbGVyJ1xuXG5sZXQgc2VsZWN0b3JFeGVjdXRlQXN5bmMgPSBmdW5jdGlvbiAoLi4uYXJncykge1xuICAgIGxldCBzZWxlY3RvciA9IGFyZ3Muc2hpZnQoKVxuICAgIGxldCBzY3JpcHQgPSBhcmdzLnNoaWZ0KClcblxuICAgIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHNlbGVjdG9yID0gW3NlbGVjdG9yXVxuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2VsZWN0b3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBDb21tYW5kRXJyb3IoYEFyZ3VtZW50ICdzZWxlY3RvcicgbXVzdCBiZSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncy5gKVxuICAgIH1cbiAgICBpZiAoIS9zdHJpbmd8ZnVuY3Rpb24vLnRlc3QodHlwZW9mIHNjcmlwdCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbW1hbmRFcnJvcihgQXJndW1lbnQgJ3NjcmlwdCcgbXVzdCBiZSBhIGZ1bmN0aW9uIG9yIHN0cmluZy5gKVxuICAgIH1cblxuICAgIGxldCBmdWxsU2NyaXB0ID0gY3JlYXRlU2VsZWN0b3JTY3JpcHQuY2FsbCh0aGlzLCBzY3JpcHQsIHNlbGVjdG9yLCBhcmdzKVxuICAgIHJldHVybiBlbnN1cmVDbGllbnRTaWRlU2VsZWN0b3JTdXBwb3J0LmNhbGwodGhpcykuZXhlY3V0ZUFzeW5jKGZ1bGxTY3JpcHQpLnRoZW4oKHJlcykgPT4ge1xuICAgICAgICB2YXIgcmVzdWx0ID0gcmVzICYmIHJlcy52YWx1ZVxuXG4gICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lm1lc3NhZ2UgPT09ICdOb1N1Y2hFbGVtZW50Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbW1hbmRFcnJvcig3KVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdFxuICAgIH0pXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlbGVjdG9yRXhlY3V0ZUFzeW5jXG4iXX0=