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

65.63% Statements 21/32
83.33% Branches 10/12
16.67% Functions 1/6
15.38% Lines 2/13
15 statements, 1 function, 10 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 94 95 96 97 98 99 100 101 102 103 104 105 106                                                                                                                                                                                                                 
/**
 *
 * This wait command is your universal weapon if you want to wait on
 * something. It expects a condition and waits until that condition
 * is fulfilled with an truthy value. A condition can be either a promise
 * or a command that returns a promise.
 *
 * A common example is to wait until a certain element contains a certain
 * text.
 *
 * <example>
    :example.html
    <div id="someText">I am some text</div>
    <script>
      setTimeout(function() {
        $('#someText').html('I am now different');
      }, 1000);
    </script>
 
    :waitUntil.js
    client.waitUntil(function() {
      return this.getText('#someText').then(function(text) {
        return text === 'I am now different'
      });
    });
 * </example>
 *
 *
 * @param {Function|Promise} condition  condition to wait on
 * @param {Number=}          ms         timeout in ms (default: 500)
 * @param {Number=}          interval   interval between condition checks (default: 250)
 *
 * @uses utility/pause
 * @type utility
 *
 */
 
'use strict';
 
Object.defineProperty(exports, '__esModule', {
    value: true
});
 
var _utilsErrorHandler = require('../utils/ErrorHandler');
 
var REJECT_MESSAGE = 'Promise never resolved with an truthy value';

function waitUntilPrivate(condition, timeout, interval, starttime) {
    // istanbul ignore next
 
    var _this = this;
 
    var promise = undefined;

    var now = new Date().getTime();
    var timeLeft = timeout - (now - starttime);
    timeLeft = timeLeft < 0 ? 0 : timeLeft;
 
    if (!timeLeft) {
        return Promise.reject(new _utilsErrorHandler.CommandError(REJECT_MESSAGE));
    }
 
    if (typeof condition === 'function') {
        promise = condition.call(this);
    } else {
        promise = Promise.resolve(condition);
    }
 
    return new Promise(function (resolve, reject) {
        var timeoutId = setTimeout(function () {
            reject(new _utilsErrorHandler.CommandError(REJECT_MESSAGE));
        }, timeLeft);

        promise.then(function (res) {
            clearTimeout(timeoutId);

            if (!res) {
                return resolve(_this.pause(interval).then(waitUntilPrivate.bind(_this, condition, timeout, interval, starttime)));
            }
 
            resolve(res);
        }, function (err) {
            clearTimeout(timeoutId);
            reject(new _utilsErrorHandler.CommandError('Promise was fulfilled but got rejected with the following reason: ' + err));
        });
    });
}
 
exports['default'] = function (condition, timeout, interval) {
    /*!
     * ensure that timeout and interval are set properly
     */
    if (typeof timeout !== 'number') {
        timeout = this.options.waitforTimeout;
    }
 
    if (typeof interval !== 'number') {
        interval = this.options.waitforInterval;
    }
 
    var starttime = new Date().getTime();
    return waitUntilPrivate.call(this, condition, timeout, interval, starttime);
};
 
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9jaHJpc3RpYW5icm9tYW5uL1NpdGVzL1dlYnByb2pla3RlL3dlYmRyaXZlcmpzL0RFVi9saWIvY29tbWFuZHMvd2FpdFVudGlsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7aUNBcUM2Qix1QkFBdUI7O0FBRXBELElBQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFBOztBQUVwRSxTQUFTLGdCQUFnQixDQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRTs7Ozs7QUFDaEUsUUFBSSxPQUFPLFlBQUEsQ0FBQTs7QUFFWCxRQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFBO0FBQzlCLFFBQUksUUFBUSxHQUFHLE9BQU8sSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFBLEFBQUMsQ0FBQTtBQUMxQyxZQUFRLEdBQUcsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFBOztBQUV0QyxRQUFJLENBQUMsUUFBUSxFQUFFO0FBQ1gsZUFBTyxPQUFPLENBQUMsTUFBTSxDQUFDLG9DQUFpQixjQUFjLENBQUMsQ0FBQyxDQUFBO0tBQzFEOztBQUVELFFBQUksT0FBTyxTQUFTLEtBQUssVUFBVSxFQUFFO0FBQ2pDLGVBQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO0tBQ2pDLE1BQU07QUFDSCxlQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQTtLQUN2Qzs7QUFFRCxXQUFPLElBQUksT0FBTyxDQUFDLFVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBSztBQUNwQyxZQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsWUFBTTtBQUM3QixrQkFBTSxDQUFDLG9DQUFpQixjQUFjLENBQUMsQ0FBQyxDQUFBO1NBQzNDLEVBQUUsUUFBUSxDQUFDLENBQUE7O0FBRVosZUFBTyxDQUFDLElBQUksQ0FBQyxVQUFDLEdBQUcsRUFBSztBQUNsQix3QkFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBOztBQUV2QixnQkFBSSxDQUFDLEdBQUcsRUFBRTtBQUNOLHVCQUFPLE9BQU8sQ0FBQyxNQUFLLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQ3BDLGdCQUFnQixDQUFDLElBQUksUUFBTyxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FDdkUsQ0FBQyxDQUFBO2FBQ0w7O0FBRUQsbUJBQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQTtTQUNmLEVBQUUsVUFBQyxHQUFHLEVBQUs7QUFDUix3QkFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQ3ZCLGtCQUFNLENBQUMsMkdBQXNGLEdBQUcsQ0FBRyxDQUFDLENBQUE7U0FDdkcsQ0FBQyxDQUFBO0tBQ0wsQ0FBQyxDQUFBO0NBQ0w7O3FCQUVjLFVBQVUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUU7Ozs7QUFJbkQsUUFBSSxPQUFPLE9BQU8sS0FBSyxRQUFRLEVBQUU7QUFDN0IsZUFBTyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFBO0tBQ3hDOztBQUVELFFBQUksT0FBTyxRQUFRLEtBQUssUUFBUSxFQUFFO0FBQzlCLGdCQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUE7S0FDMUM7O0FBRUQsUUFBSSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtBQUNwQyxXQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUE7Q0FDOUUiLCJmaWxlIjoiL1VzZXJzL2NocmlzdGlhbmJyb21hbm4vU2l0ZXMvV2VicHJvamVrdGUvd2ViZHJpdmVyanMvREVWL2xpYi9jb21tYW5kcy93YWl0VW50aWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKiBUaGlzIHdhaXQgY29tbWFuZCBpcyB5b3VyIHVuaXZlcnNhbCB3ZWFwb24gaWYgeW91IHdhbnQgdG8gd2FpdCBvblxuICogc29tZXRoaW5nLiBJdCBleHBlY3RzIGEgY29uZGl0aW9uIGFuZCB3YWl0cyB1bnRpbCB0aGF0IGNvbmRpdGlvblxuICogaXMgZnVsZmlsbGVkIHdpdGggYW4gdHJ1dGh5IHZhbHVlLiBBIGNvbmRpdGlvbiBjYW4gYmUgZWl0aGVyIGEgcHJvbWlzZVxuICogb3IgYSBjb21tYW5kIHRoYXQgcmV0dXJucyBhIHByb21pc2UuXG4gKlxuICogQSBjb21tb24gZXhhbXBsZSBpcyB0byB3YWl0IHVudGlsIGEgY2VydGFpbiBlbGVtZW50IGNvbnRhaW5zIGEgY2VydGFpblxuICogdGV4dC5cbiAqXG4gKiA8ZXhhbXBsZT5cbiAgICA6ZXhhbXBsZS5odG1sXG4gICAgPGRpdiBpZD1cInNvbWVUZXh0XCI+SSBhbSBzb21lIHRleHQ8L2Rpdj5cbiAgICA8c2NyaXB0PlxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgJCgnI3NvbWVUZXh0JykuaHRtbCgnSSBhbSBub3cgZGlmZmVyZW50Jyk7XG4gICAgICB9LCAxMDAwKTtcbiAgICA8L3NjcmlwdD5cblxuICAgIDp3YWl0VW50aWwuanNcbiAgICBjbGllbnQud2FpdFVudGlsKGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgnI3NvbWVUZXh0JykudGhlbihmdW5jdGlvbih0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0ID09PSAnSSBhbSBub3cgZGlmZmVyZW50J1xuICAgICAgfSk7XG4gICAgfSk7XG4gKiA8L2V4YW1wbGU+XG4gKlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb258UHJvbWlzZX0gY29uZGl0aW9uICBjb25kaXRpb24gdG8gd2FpdCBvblxuICogQHBhcmFtIHtOdW1iZXI9fSAgICAgICAgICBtcyAgICAgICAgIHRpbWVvdXQgaW4gbXMgKGRlZmF1bHQ6IDUwMClcbiAqIEBwYXJhbSB7TnVtYmVyPX0gICAgICAgICAgaW50ZXJ2YWwgICBpbnRlcnZhbCBiZXR3ZWVuIGNvbmRpdGlvbiBjaGVja3MgKGRlZmF1bHQ6IDI1MClcbiAqXG4gKiBAdXNlcyB1dGlsaXR5L3BhdXNlXG4gKiBAdHlwZSB1dGlsaXR5XG4gKlxuICovXG5cbmltcG9ydCB7IENvbW1hbmRFcnJvciB9IGZyb20gJy4uL3V0aWxzL0Vycm9ySGFuZGxlcidcblxuY29uc3QgUkVKRUNUX01FU1NBR0UgPSAnUHJvbWlzZSBuZXZlciByZXNvbHZlZCB3aXRoIGFuIHRydXRoeSB2YWx1ZSdcblxuZnVuY3Rpb24gd2FpdFVudGlsUHJpdmF0ZSAoY29uZGl0aW9uLCB0aW1lb3V0LCBpbnRlcnZhbCwgc3RhcnR0aW1lKSB7XG4gICAgbGV0IHByb21pc2VcblxuICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIHZhciB0aW1lTGVmdCA9IHRpbWVvdXQgLSAobm93IC0gc3RhcnR0aW1lKVxuICAgIHRpbWVMZWZ0ID0gdGltZUxlZnQgPCAwID8gMCA6IHRpbWVMZWZ0XG5cbiAgICBpZiAoIXRpbWVMZWZ0KSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQ29tbWFuZEVycm9yKFJFSkVDVF9NRVNTQUdFKSlcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbmRpdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwcm9taXNlID0gY29uZGl0aW9uLmNhbGwodGhpcylcbiAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmRpdGlvbilcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBsZXQgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICByZWplY3QobmV3IENvbW1hbmRFcnJvcihSRUpFQ1RfTUVTU0FHRSkpXG4gICAgICAgIH0sIHRpbWVMZWZ0KVxuXG4gICAgICAgIHByb21pc2UudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElkKVxuXG4gICAgICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRoaXMucGF1c2UoaW50ZXJ2YWwpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIHdhaXRVbnRpbFByaXZhdGUuYmluZCh0aGlzLCBjb25kaXRpb24sIHRpbWVvdXQsIGludGVydmFsLCBzdGFydHRpbWUpXG4gICAgICAgICAgICAgICAgKSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShyZXMpXG4gICAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpXG4gICAgICAgICAgICByZWplY3QobmV3IENvbW1hbmRFcnJvcihgUHJvbWlzZSB3YXMgZnVsZmlsbGVkIGJ1dCBnb3QgcmVqZWN0ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHJlYXNvbjogJHtlcnJ9YCkpXG4gICAgICAgIH0pXG4gICAgfSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKGNvbmRpdGlvbiwgdGltZW91dCwgaW50ZXJ2YWwpIHtcbiAgICAvKiFcbiAgICAgKiBlbnN1cmUgdGhhdCB0aW1lb3V0IGFuZCBpbnRlcnZhbCBhcmUgc2V0IHByb3Blcmx5XG4gICAgICovXG4gICAgaWYgKHR5cGVvZiB0aW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aW1lb3V0ID0gdGhpcy5vcHRpb25zLndhaXRmb3JUaW1lb3V0XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBpbnRlcnZhbCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgaW50ZXJ2YWwgPSB0aGlzLm9wdGlvbnMud2FpdGZvckludGVydmFsXG4gICAgfVxuXG4gICAgbGV0IHN0YXJ0dGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgcmV0dXJuIHdhaXRVbnRpbFByaXZhdGUuY2FsbCh0aGlzLCBjb25kaXRpb24sIHRpbWVvdXQsIGludGVydmFsLCBzdGFydHRpbWUpXG59XG4iXX0=