eyes.selenium.v68patch
Version:
Applitools Eyes SDK For Selenium JavaScript WebDriver
148 lines (128 loc) • 5.64 kB
JavaScript
/*
---
name: ElementFinderWrapper
description: Wraps Protractor's ElementFinder to make sure we return our own Web Element.
---
*/
(function () {
"use strict";
var EyesUtils = require('eyes.utils'),
EyesRemoteWebElement = require('./EyesRemoteWebElement');
var GeneralUtils = EyesUtils.GeneralUtils;
// functions in ElementFinder that return a new ElementFinder and therefore we must wrap and return our own
var ELEMENT_FINDER_TO_ELEMENT_FINDER_FUNCTIONS = ['element', '$', 'evaluate', 'allowAnimations'];
// functions in ElementFinder that return a new ElementArrayFinder and therefore we must wrap and return our own
var ELEMENT_FINDER_TO_ELEMENT_ARRAY_FINDER_FUNCTIONS = ['all', '$$'];
// function in ElementArrayFinder that return a new ElementFinder and therefore we must wrap and return our own
var ELEMENT_ARRAY_FINDER_TO_ELEMENT_FINDER_FUNCTIONS = ['get', 'first', 'last'];
/**
* Wrapper for ElementFinder object from Protractor
*
* @param {ElementFinder} finder
* @param {EyesWebDriver} eyesDriver
* @param {Logger} logger
* @constructor
**/
function ElementFinderWrapper(finder, eyesDriver, logger) {
GeneralUtils.mixin(this, finder);
this._logger = logger;
this._eyesDriver = eyesDriver;
this._finder = finder;
var that = this;
ELEMENT_FINDER_TO_ELEMENT_FINDER_FUNCTIONS.forEach(function (fnName) {
that[fnName] = function () {
return new ElementFinderWrapper(that._finder[fnName].apply(that._finder, arguments), that._eyesDriver, that._logger);
};
});
ELEMENT_FINDER_TO_ELEMENT_ARRAY_FINDER_FUNCTIONS.forEach(function (fnName) {
that[fnName] = function () {
return new ElementArrayFinderWrapper(that._finder[fnName].apply(that._finder, arguments), that._eyesDriver, that._logger);
};
});
}
/**
* Wrap the getWebElement function
*
* @returns {EyesRemoteWebElement}
*/
ElementFinderWrapper.prototype.getWebElement = function () {
this._logger.verbose("ElementFinderWrapper:getWebElement - called");
return new EyesRemoteWebElement(this._finder.getWebElement.apply(this._finder), this._eyesDriver, this._logger);
};
/**
* Wrap the click function
*
* @returns {Promise.<EyesRemoteWebElement>}
*/
ElementFinderWrapper.prototype.click = function () {
var that = this;
that._logger.verbose("ElementFinderWrapper:click - called");
return that._finder.getWebElement().then(function (element) {
return EyesRemoteWebElement.registerClick(element, that._eyesDriver, that._logger);
}).then(function () {
return new EyesRemoteWebElement(that._finder.click.apply(that._finder), that._eyesDriver, that._logger);
});
};
/**
* Wrap the functions that return objects that require pre-wrapping
*
* @returns {Promise.<EyesRemoteWebElement>}
*/
ElementFinderWrapper.prototype.sendKeys = function () {
var that = this, args = Array.prototype.slice.call(arguments, 0);
that._logger.verbose("ElementFinderWrapper:sendKeys - called");
return that._finder.getWebElement().then(function (element) {
return EyesRemoteWebElement.registerSendKeys(element, that._eyesDriver, that._logger, args);
}).then(function () {
return new EyesRemoteWebElement(that._finder.sendKeys.apply(that._finder, args), that._eyesDriver, that._logger);
});
};
/**
* Wrapper for ElementArrayFinder object from Protractor
*
* @param {ElementArrayFinder} arrayFinder
* @param {EyesWebDriver} eyesDriver
* @param {Logger} logger
* @constructor
**/
function ElementArrayFinderWrapper(arrayFinder, eyesDriver, logger) {
GeneralUtils.mixin(this, arrayFinder);
this._logger = logger;
this._eyesDriver = eyesDriver;
this._arrayFinder = arrayFinder;
var that = this;
// Wrap the functions that return objects that require pre-wrapping
ELEMENT_ARRAY_FINDER_TO_ELEMENT_FINDER_FUNCTIONS.forEach(function (fnName) {
that[fnName] = function () {
return new ElementFinderWrapper(that._arrayFinder[fnName].apply(that._arrayFinder, arguments), that._eyesDriver, that._logger);
};
});
// Patch this internal function.
var originalFn = that._arrayFinder.asElementFinders_;
that._arrayFinder.asElementFinders_ = function () {
return originalFn.apply(that._arrayFinder).then(function (arr) {
var list = [];
arr.forEach(function (finder) {
list.push(new ElementFinderWrapper(finder, that._eyesDriver, that._logger));
});
return list;
});
}
}
/**
* Wrap the getWebElements function
*
* @returns {EyesRemoteWebElement[]}
*/
ElementArrayFinderWrapper.prototype.getWebElements = function () {
var that = this;
that._logger.verbose("ElementArrayFinderWrapper:getWebElements - called");
var res = [];
that._arrayFinder.getWebElements.apply(that._arrayFinder).forEach(function (el) {
res.push(new EyesRemoteWebElement(el, that._eyesDriver, that._logger));
});
return res;
};
module.exports.ElementFinderWrapper = ElementFinderWrapper;
module.exports.ElementArrayFinderWrapper = ElementArrayFinderWrapper;
}());