API Docs for: 0.0.6
Show:

File: lib/commands/element.js

/*!
 *
 * Copyright (c) 2013 Sebastian Golasch
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 *
 */

'use strict';

// ext. libs
var Q = require('q');

/**
 * Element related methods
 *
 * @module Driver
 * @class Element
 * @namespace Dalek.DriverNative.Commands
 */

var Element = {

  /**
   * Checks if an element exists
   *
   * @method exists
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  exists: function (selector, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this._existsCb.bind(this, selector, hash));
    return this;
  },

  /**
   * Sends out an event with the results of the `exists` call
   *
   * @method _existsCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} result Serialized JSON with the reuslts of the exists call
   * @return {object} promise Exists promise
   * @private
   */

  _existsCb: function (selector, hash, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'exists', selector: selector, hash: hash, value: (JSON.parse(result).value === -1 || JSON.parse(result).status === 7 ? 'false' : 'true')});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element is visible
   *
   * @method visible
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  visible: function (selector, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.displayed.bind(this.webdriverClient, selector));
    this.actionQueue.push(this._visibleCb.bind(this, selector, hash));
    return this;
  },

  /**
   * Sends out an event with the results of the `visible` call
   *
   * @method _visibleCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} result Serialized JSON with the reuslts of the visible call
   * @return {object} promise Visible promise
   * @private
   */

  _visibleCb: function (selector, hash, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'visible', selector: selector, hash: hash, value: JSON.parse(result).value});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element has the expected text
   *
   * @method text
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected text content
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  text: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.text.bind(this.webdriverClient, selector));
    this.actionQueue.push(this._textCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `text` call
   *
   * @method _textCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} expected The expected text content
   * @param {string} result Serialized JSON with the reuslts of the text call
   * @return {object} Promise
   * @private
   */

  _textCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'text', hash: hash, expected: expected, selector: selector, value: JSON.parse(result).value});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element has the expected css property/value pairs
   *
   * @method css
   * @param {string} selector Selector expression to find the element
   * @param {string} property The css property to check
   * @param {string} expected The expected css value
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  css: function (selector, property, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.cssProperty.bind(this.webdriverClient, property));
    this.actionQueue.push(this._cssCb.bind(this, selector, property, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `css` call
   *
   * @method _cssCb
   * @param {string} selector Selector expression to find the element
   * @param {string} property The css property to check
   * @param {string} expected The expected css value
   * @param {string} hash Unique hash of that fn call
   * @param {string} result Serialized JSON with the reuslts of the text call
   * @return {object} Promise
   * @private
   */
  
  _cssCb: function (selector, property, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'css', hash: hash, property: property, expected: expected, selector: selector, value: JSON.parse(result).value});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks th width of an element
   *
   * @method width
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected width value
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  width: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.size.bind(this.webdriverClient));
    this.actionQueue.push(this._widthCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `width` call
   *
   * @method _widthCb
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected width value
   * @param {string} hash Unique hash of that fn call
   * @param {string} result Serialized JSON with the reuslts of the text call
   * @return {object} Promise
   * @private
   */

  _widthCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'width', hash: hash, expected: expected, selector: selector, value: JSON.parse(result).value.width});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks th height of an element
   *
   * @method height
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected height value
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  height: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.size.bind(this.webdriverClient));
    this.actionQueue.push(this._heightCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `height` call
   *
   * @method _heightCb
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected height value
   * @param {string} hash Unique hash of that fn call
   * @param {string} result Serialized JSON with the reuslts of the text call
   * @return {object} Promise
   * @private
   */

  _heightCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'height', hash: hash, expected: expected, selector: selector, value: JSON.parse(result).value.height});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element has an attribute with the expected value
   *
   * @method attribute
   * @param {string} selector Selector expression to find the element
   * @param {string} attribute The attribute that should be checked
   * @param {string} expected The expected text content
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  attribute: function (selector, attribute, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.getAttribute.bind(this.webdriverClient, attribute));
    this.actionQueue.push(this._attributeCb.bind(this, selector, hash, attribute, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `attribute` call
   *
   * @method _attributeCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} attribute The attribute that should be checked
   * @param {string} expected The expected attribute content
   * @param {string} result Serialized JSON with the results of the attribute call
   * @return {object} promise Attribute promise
   * @private
   */

  _attributeCb: function (selector, hash, attribute, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'attribute', selector: selector, hash: hash, expected: expected, value: JSON.parse(result).value });
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element has the expected value
   *
   * @method val
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected content
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  val: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.getAttribute.bind(this.webdriverClient, 'value'));
    this.actionQueue.push(this._valCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `val` call
   *
   * @method _valCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} expected The expected content
   * @param {string} result Serialized JSON with the results of the val call
   * @return {object} Promise
   * @private
   */

  _valCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'val', selector: selector, hash: hash, expected: expected, value: JSON.parse(result).value });
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element is selected
   *
   * @method selected
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected content
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  selected: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.selected.bind(this.webdriverClient));
    this.actionQueue.push(this._selectedCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `selected` call
   *
   * @method _selectedCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} expected The expected content
   * @param {string} result Serialized JSON with the results of the selected call
   * @return {object} Promise
   * @private
   */

  _selectedCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'selected', selector: selector, hash: hash, expected: expected, value: JSON.parse(result).value });
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Checks if an element is enabled
   *
   * @method enabled
   * @param {string} selector Selector expression to find the element
   * @param {string} expected The expected content
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  enabled: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.enabled.bind(this.webdriverClient));
    this.actionQueue.push(this._enabledCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `enabled` call
   *
   * @method _enabledCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} expected The expected content
   * @param {string} result Serialized JSON with the results of the selected call
   * @return {object} Promise
   * @private
   */

  _enabledCb: function (selector, hash, expected, result) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'enabled', selector: selector, hash: hash, expected: expected, value: JSON.parse(result).value });
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Submits a form
   *
   * @method submit
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  submit: function (selector, hash, uuid) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.submit.bind(this.webdriverClient));
    this.actionQueue.push(this._submitCb.bind(this, selector, hash, uuid));
    return this;
  },

  /**
   * Sends out an event with the results of the `submit` call
   *
   * @method _submitCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @return {object} promise Click promise
   * @private
   */

  _submitCb: function (selector, hash, uuid) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'submit', value: selector, uuid: uuid, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Clicks an element
   *
   * @method click
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  click: function (selector, hash, uuid) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.click.bind(this.webdriverClient));
    this.actionQueue.push(this._clickCb.bind(this, selector, hash, uuid));
    return this;
  },

  /**
   * Sends out an event with the results of the `click` call
   *
   * @method _clickCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @return {object} promise Click promise
   * @private
   */

  _clickCb: function (selector, hash, uuid) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'click', value: selector, uuid: uuid, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Scrolls from an element to a location defined in pixels
   *
   * @method scroll
   * @param {string} selector Selector expression to find the element
   * @param {object} options X offset, Y offset, Speed
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  scroll: function (selector, options, hash, uuid) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector, options));
    this.actionQueue.push(this.webdriverClient.scroll.bind(this.webdriverClient));
    this.actionQueue.push(this._clickCb.bind(this, selector, options, hash, uuid));
    return this;
  },

  /**
   * Sends out an event with the results of the `scroll` call
   *
   * @method _scrollCb
   * @param {string} selector Selector expression to find the element
   * @param {object} options X offset, Y offset, Speed
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @return {object} promise Scroll promise
   * @private
   */

  _scrollCb: function (selector, options, hash, uuid) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'scroll', value: selector, uuid: uuid, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Clicks an element
   *
   * @method click
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  type: function (selector, keystrokes, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.val.bind(this.webdriverClient, keystrokes));
    this.actionQueue.push(this._typeCb.bind(this, selector, keystrokes, hash));
    return this;
  },

  /**
   * Sends out an event with the results of the `type` call
   *
   * @method _typeCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @return {object} promise Type promise
   * @private
   */

  _typeCb: function (selector, keystrokes, hash) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'type', value: selector, keystrokes: keystrokes, uuid: hash, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Set a value to an Element
   *
   * @method setValue
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  setValue: function (selector, keystrokes, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.clear.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.val.bind(this.webdriverClient, keystrokes));
    this.actionQueue.push(this._setValueCb.bind(this, selector, keystrokes, hash));
    return this;
  },

  /**
   * Sends out an event with the results of the `setvalue` call
   *
   * @method _setValueCb
   * @param {string} selector Selector expression to find the element
   * @param {string} keystrokes Value to set
   * @param {string} hash Unique hash of that fn call
   * @return {object} promise Type promise
   * @private
   */

  _setValueCb: function (selector, keystrokes, hash) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'setValue', value: selector, keystrokes: keystrokes, uuid: hash, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Sends keys to an element (whether or not it is an input)
   *
   * @method sendKeys
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @chainable
   */

  sendKeys: function (selector, keystrokes, hash) {
    this.actionQueue.push(this.webdriverClient.element.bind(this.webdriverClient, selector));
    this.actionQueue.push(this.webdriverClient.sendKeys.bind(this.webdriverClient, keystrokes));
    this.actionQueue.push(this._sendKeysCb.bind(this, selector, keystrokes, hash));
    return this;
  },

  /**
   * Sends out an event with the results of the `sendKeys` call
   *
   * @method _sendKeysCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @return {object} promise Type promise
   * @private
   */

  _sendKeysCb: function (selector, keystrokes, hash) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'sendKeys', value: selector, keystrokes: keystrokes, uuid: hash, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Wait for an element for a specific amount of time
   *
   * @method waitForElement
   * @param {string} selector Selector expression to find the element
   * @param {integer} timeout Time to wait in ms
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  waitForElement: function (selector, timeout, hash, uuid) {
    this.actionQueue.push(this.webdriverClient.implicitWait.bind(this.webdriverClient, timeout));
    this.actionQueue.push(this._waitForElementCb.bind(this, selector, hash, uuid));
    return this;
  },

  /**
   * Sends out an event with the results of the `waitForElement` call
   *
   * @method _waitForElementCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {string} uuid Unique hash of that fn call
   * @return {object} promise WaitForElement promise
   * @private
   */

  _waitForElementCb: function (selector, hash, uuid) {
    var deferred = Q.defer();
    this.events.emit('driver:message', {key: 'waitForElement', selector: selector, value: selector, uuid: uuid, hash: hash});
    deferred.resolve();
    return deferred.promise;
  },

  /**
   * Returns the number of elements matched by the selector
   *
   * @method getNumberOfElements
   * @param {string} selector Selector expression to find the elements
   * @param {integer} expected Expected number of matched elements
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  getNumberOfElements: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.elements.bind(this.webdriverClient, selector));
    this.actionQueue.push(this._getNumberOfElementsCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `getNumberOfElements` call
   *
   * @method _getNumberOfElementsCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {integer} expected Expected number of matched elements
   * @param {string} res Serialized JSON with the results of the getNumberOfElements call
   * @return {object} promise GetNumberOfElements promise
   * @private
   */

  _getNumberOfElementsCb: function (selector, hash, expected, res) {
    var deferred = Q.defer();
    var result = JSON.parse(res);
    // check if the expression matched any element
    if (result.value === -1) {
      this.events.emit('driver:message', {key: 'numberOfElements', hash: hash, selector: selector, expected: expected, value: 0});
    } else {
      this.events.emit('driver:message', {key: 'numberOfElements', selector: selector, expected: expected, hash: hash, value: result.value.length});
    }

    deferred.resolve();
    return deferred.promise;
  },


  /**
   * Returns the number of visible elements matched by the selector
   *
   * @method getNumberOfVisibleElements
   * @param {string} selector Selector expression to find the elements
   * @param {integer} expected Expected number of matched elements
   * @param {string} uuid Unique hash of that fn call
   * @chainable
   */

  getNumberOfVisibleElements: function (selector, expected, hash) {
    this.actionQueue.push(this.webdriverClient.elements.bind(this.webdriverClient, selector));
    this.actionQueue.push(function (result) {
      var deferred = Q.defer();
      var res = JSON.parse(result);
      var resLength = res.value.length;
      var curLength = 0;
      var visibleElement = [];

      res.value.forEach(function (element) {
        var fakeResponse = JSON.stringify({sessionId: res.sessionId, status: 0, value: element.ELEMENT});
        this.webdriverClient.options.id = element.ELEMENT;
        this.webdriverClient.displayed.bind(this.webdriverClient, selector)(fakeResponse).then(function (visRes) {
          curLength++;
          if (JSON.parse(visRes).value === true) {
            visibleElement.push(element);
          }
          if (curLength === resLength) {
            deferred.resolve(JSON.stringify({sessionId: res.sessionId, status: 0, value: visibleElement}));
          }
        });
      }.bind(this));

      return deferred.promise;
    }.bind(this));
    this.actionQueue.push(this._getNumberOfVisibleElementsCb.bind(this, selector, hash, expected));
    return this;
  },

  /**
   * Sends out an event with the results of the `getNumberOfVisibleElements` call
   *
   * @method _getNumberOfElementsCb
   * @param {string} selector Selector expression to find the element
   * @param {string} hash Unique hash of that fn call
   * @param {integer} expected Expected number of matched elements
   * @param {string} res Serialized JSON with the results of the getNumberOfVisibleElements call
   * @return {object} promise GetNumberOfElements promise
   * @private
   */

  _getNumberOfVisibleElementsCb: function (selector, hash, expected, res) {
    var deferred = Q.defer();
    var result = JSON.parse(res);

    // check if the expression matched any element
    if (result.value === -1) {
      this.events.emit('driver:message', {key: 'numberOfVisibleElements', hash: hash, selector: selector, expected: expected, value: 0});
    } else {
      this.events.emit('driver:message', {key: 'numberOfVisibleElements', selector: selector, expected: expected, hash: hash, value: result.value.length});
    }

    deferred.resolve();
    return deferred.promise;
  }

};

/**
 * Mixes in element methods
 *
 * @param {Dalek.DriverNative} DalekNative Native driver base class
 * @return {Dalek.DriverNative} DalekNative Native driver base class
 */

module.exports = function (DalekNative) {
  // mixin methods
  Object.keys(Element).forEach(function (fn) {
    DalekNative.prototype[fn] = Element[fn];
  });

  return DalekNative;
};