Files
BeWoPlaner/BeWoPlanerMobil/node_modules/wd/lib/main.js
Lyndon Jetten fda2c306b5 MoK: Report Viewer hinzugefügt
FaC: Das alte Flag von Terminen, die in die Zeiterfassung übernommen worden sind, wird ebenfalls berücksichtigt.
2023-03-13 19:39:04 +01:00

329 lines
8.9 KiB
JavaScript

var __slice = Array.prototype.slice,
url = require('url'),
SPECIAL_KEYS = require('./special-keys'),
Webdriver = require('./webdriver'),
Element = require('./element'),
utils = require('./utils'),
deprecator = utils.deprecator,
config = require('./config'),
_ = require("lodash"),
Q = require('q'),
actions = require('./actions');
function buildConfigUrl(remoteWdConfig)
{
var configUrl = _(remoteWdConfig).clone();
// for backward compatibility
if( configUrl.host && (configUrl.host.indexOf(':') < 0) && configUrl.port )
{
configUrl.hostname = configUrl.host;
delete configUrl.host;
}
// for backward compatibility
if(configUrl.username){
configUrl.user = configUrl.username;
delete configUrl.username;
}
// for backward compatibility
if(configUrl.accessKey){
configUrl.pwd = configUrl.accessKey;
delete configUrl.accessKey;
}
// for backward compatibility
if(configUrl.https){
configUrl.protocol = 'https:';
delete configUrl.https;
}
// for backward compatibility
if(configUrl.path){
configUrl.pathname = configUrl.path;
delete configUrl.path;
}
// setting auth from user/password
if(configUrl.user && configUrl.pwd){
configUrl.auth = configUrl.user + ':' + configUrl.pwd;
delete configUrl.user;
delete configUrl.pwd;
}
_.defaults(configUrl, {
protocol: 'http:',
hostname: '127.0.0.1',
port: '4444',
pathname: '/wd/hub'
});
// strip any trailing slashes from pathname
var parsed = url.parse(url.format(configUrl), true);
if (parsed.pathname[parsed.pathname.length - 1] === '/') {
parsed.pathname = parsed.pathname.slice(0, parsed.pathname.length - 1);
}
return parsed;
}
// parses server parameters
var parseRemoteWdConfig = function(args) {
var config;
if ((typeof args[0]) === 'object') {
if(args[0].href && args[0].format){
// was constructed with url.parse, so we don't modify it
config = args[0];
} else {
config = buildConfigUrl( args[0] );
}
} else if ((typeof args[0]) === 'string' && (args[0].match(/^https?:\/\//))) {
config = url.parse(args[0]);
} else {
config = buildConfigUrl( {
hostname: args[0],
port: args[1],
user: args[2],
pwd: args[3]
} );
}
// saucelabs automatic config
if( /saucelabs\.com/.exec(config.hostname) )
{
if(!config.auth && process.env.SAUCE_USERNAME && process.env.SAUCE_ACCESS_KEY){
config.auth = process.env.SAUCE_USERNAME + ':' + process.env.SAUCE_ACCESS_KEY;
}
}
return config;
};
var PromiseWebdriver, PromiseElement, PromiseChainWebdriver, PromiseChainElement;
// Creates the Webdriver object
// server parameters can be passed in 4 ways
// - as a url string
// - as a url object, constructed via url.parse
// - as a list of arguments host,port, user, pwd
// - as an option object containing the fields above
// A `driverType` string may be passed at the end of the argument list.
// If it is a valid type it will be detected even if the other arguments
// are ommited. Valide types are: `remote`, `promise` and `promiseChain`.
function remote() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var driverProtos = {
'async': Webdriver,
'promise': PromiseWebdriver,
'promiseChain': PromiseChainWebdriver
};
var driverTypes = _(driverProtos).keys();
var driverType = driverTypes.indexOf(_(args).last())>0 ? args.pop() : 'async';
var rwc = parseRemoteWdConfig(args);
return new (driverProtos[driverType])(rwc);
}
function wrap() {
var promiseProtos = require('./promise-webdriver')(Webdriver, Element, false);
PromiseWebdriver = promiseProtos.PromiseWebdriver;
PromiseElement = promiseProtos.PromiseElement;
var promiseChainProtos = require('./promise-webdriver')(Webdriver, Element, true);
PromiseChainWebdriver = promiseChainProtos.PromiseWebdriver;
PromiseChainElement = promiseChainProtos.PromiseElement;
}
// todo: allow adding element methods
function addPromiseChainMethod(name, method) {
var wrappedMethod = function() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var promise = new Q(method.apply(this, args));
this._enrich(promise);
return promise;
};
PromiseChainWebdriver.prototype[name] = wrappedMethod;
}
function addElementPromiseChainMethod(name, method) {
var wrappedMethod = function() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var promise = new Q(method.apply(this, args));
this._enrich(promise);
return promise;
};
PromiseChainElement.prototype[name] = wrappedMethod;
}
function addPromiseMethod(name, method) {
var wrappedMethod = function() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return new Q(method.apply(this, args));
};
PromiseWebdriver.prototype[name] = wrappedMethod;
addPromiseChainMethod(name, method);
}
function addElementPromiseMethod(name, method) {
var wrappedMethod = function() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
return new Q(method.apply(this, args));
};
PromiseElement.prototype[name] = wrappedMethod;
addElementPromiseChainMethod(name, method);
}
function addAsyncMethod(name, method) {
Webdriver.prototype[name] = method;
PromiseWebdriver.prototype[name] = PromiseWebdriver._wrapAsync(method);
PromiseChainWebdriver.prototype[name] = PromiseChainWebdriver._wrapAsync(method);
}
function addElementAsyncMethod(name, method) {
Element.prototype[name] = method;
PromiseElement.prototype[name] = PromiseWebdriver._wrapAsync(method);
PromiseChainElement.prototype[name] = PromiseChainWebdriver._wrapAsync(method);
}
function removeMethod(name) {
delete Webdriver.prototype[name];
delete PromiseWebdriver.prototype[name];
delete PromiseChainWebdriver.prototype[name];
}
// creates a webdriver object using the Q promise wrap not chained
function asyncRemote() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var rwc = parseRemoteWdConfig(args);
return new Webdriver(rwc);
}
// creates a webdriver object using the Q promise wrap not chained
function promiseRemote() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var rwc = parseRemoteWdConfig(args);
return new PromiseWebdriver(rwc);
}
// creates a webdriver object using the Q promise wrap chained
function promiseChainRemote() {
var args = 1 <= arguments.length ? __slice.call(arguments, 0) : [];
var rwc = parseRemoteWdConfig(args);
return new PromiseChainWebdriver(rwc);
}
// initial wrapping
wrap();
module.exports = {
// Retrieves browser
remote: remote,
asyncRemote: asyncRemote,
// Retrieves wrap browser
promiseRemote: promiseRemote,
promiseChainRemote: promiseChainRemote,
// Webdriver and Wrapper base classes
Webdriver: Webdriver,
webdriver: Webdriver, // for backward compatibility
Element: Element,
PromiseChainWebdriver: PromiseChainWebdriver,
PromiseWebdriver: PromiseWebdriver,
TouchAction: actions.TouchAction,
MultiAction: actions.MultiAction,
InputDevice: actions.InputDevice,
W3CActions: actions.W3CActions,
// Actualizes promise wrappers
rewrap: function() {
deprecator.warn('rewrap',
'rewrap has been deprecated, use addAsyncMethod instead.');
wrap();
},
// config
/**
* wd.configureHttp(opts)
*
* opts example:
* {timeout:60000, retries: 3, 'retryDelay': 15, baseUrl='http://example.com/'}
* more info in README.
*
* @wd
*/
configureHttp: config.configureHttp,
getHttpConfig: function() { return _(config.httpConfig).clone(); },
// deprecation
/**
* wd.showHideDeprecation(boolean)
*
* @wd
*/
showHideDeprecation: deprecator.showHideDeprecation.bind(deprecator),
// add/remove methods
/**
* wd.addAsyncMethod(name, func)
*
* @wd
*/
addAsyncMethod: addAsyncMethod,
/**
* wd.addElementAsyncMethod(name, func)
*
* @wd
*/
addElementAsyncMethod: addElementAsyncMethod,
/**
* wd.addPromiseMethod(name, func)
*
* @wd
*/
addPromiseMethod: addPromiseMethod,
/**
* wd.addElementPromiseMethod(name, func)
*
* @wd
*/
addElementPromiseMethod: addElementPromiseMethod,
/**
* wd.addPromiseChainMethod(name, func)
*
* @wd
*/
addPromiseChainMethod: addPromiseChainMethod,
/**
* wd.addElementPromiseChainMethod(name, func)
*
* @wd
*/
addElementPromiseChainMethod: addElementPromiseChainMethod,
/**
* wd.removeMethod(name, func)
*
* @wd
*/
removeMethod: removeMethod,
// Useful stuff
Asserter: require('./asserters').Asserter,
asserters: require('./asserters'),
SPECIAL_KEYS: SPECIAL_KEYS,
Q: Q,
findCallback: utils.findCallback,
varargs: utils.varargs,
transferPromiseness: utils.transferPromiseness,
// This is for people who write wrapper
// todo: That should not be needed.
utils: utils,
setBaseClasses: function(_Webdriver, _Element) {
Webdriver = _Webdriver;
Element = _Element;
wrap();
}
};