Files
BeWoPlaner/BeWoPlanerMobil/node_modules/wd/lib/actions.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

508 lines
11 KiB
JavaScript

var __slice = Array.prototype.slice,
_ = require('lodash'),
Webdriver = require('./webdriver'),
Element = require('./element');
/**
* new wd.TouchAction()
* TouchAction constructor
*
* @actions
*/
var TouchAction = function (driver) {
this.driver = driver;
this.gestures = [];
};
TouchAction.prototype.addGesture = function(action, opts) {
opts = opts || {};
var el = opts.element || opts.el;
if(el && !(el instanceof Element)) {
throw new Error('Invalid element or el field passed');
}
// preparing opts
var finalOpts = {};
_(opts).each(function(value, name) {
if(_.isNumber(value)) {
finalOpts[name] = value;
} else if(value instanceof Element) {
finalOpts[name] = value.value;
} else if(value) {
finalOpts[name] = value;
}
});
if(finalOpts.el) {
finalOpts.element = finalOpts.el;
delete finalOpts.el;
}
// adding action
this.gestures.push({
action: action,
options: finalOpts
});
};
TouchAction.prototype.toJSON = function() {
return this.gestures;
};
/**
* touchAction.longPress({el, x, y})
* pass el or (x,y) or both
*
* @actions
*/
TouchAction.prototype.longPress = function (opts) {
this.addGesture('longPress', opts);
return this;
};
/**
* touchAction.moveTo({el, x, y})
* pass el or (x,y) or both
*
* @actions
*/
TouchAction.prototype.moveTo = function (opts) {
this.addGesture('moveTo', opts);
return this;
};
/**
* touchAction.press({el, x, y})
* pass el or (x,y) or both
*
* @actions
*/
TouchAction.prototype.press = function (opts) {
this.addGesture('press', opts);
return this;
};
/**
* touchAction.release()
*
* @actions
*/
TouchAction.prototype.release = function () {
this.addGesture('release', {});
return this;
};
/**
* touchAction.tap({el, x, y, count})
* pass el or (x,y) or both
* count is optional
*
* @actions
*/
TouchAction.prototype.tap = function (opts) {
this.addGesture('tap', opts);
return this;
};
/**
* touchAction.wait({ms})
* touchAction.wait(ms)
* ms is optional
*
* @actions
*/
TouchAction.prototype.wait = function (opts) {
if(_.isNumber(opts)) { opts = {ms: opts}; }
this.addGesture('wait', opts);
return this;
};
/**
* cancel the action
*
* @actions
*/
TouchAction.prototype.cancel = function () {
this.gestures = [];
};
/**
* perform the action
*
* @actions
*/
TouchAction.prototype.perform = function(cb) {
if(typeof cb === 'function') {
this.driver.performTouchAction(this, cb);
} else {
return this.driver.performTouchAction(this);
}
};
/**
* new wd.MultiAction()
* MultiAction constructor
*
* @actions
*/
var MultiAction = function (browserOrElement) {
if(browserOrElement instanceof Element) {
this.element = browserOrElement;
this.browser = this.element.browser;
} else if (browserOrElement instanceof Webdriver) {
this.browser = browserOrElement;
}
this.actions = [];
};
MultiAction.prototype.toJSON = function() {
var output = {};
if(this.element) { output.elementId = this.element.value; }
output.actions = _(this.actions).map(function(action) {
return action.toJSON();
}).value();
return output;
};
/**
* multiAction.add(touchAction)
*
* @actions
*/
MultiAction.prototype.add = function () {
var actions = __slice.call(arguments, 0);
this.actions = this.actions.concat(actions);
return this;
};
/**
* multiAction.cancel()
*
* @actions
*/
MultiAction.prototype.cancel = function() {
this.actions = [];
};
/**
* multiAction.perform()
*
* @actions
*/
MultiAction.prototype.perform = function(cb) {
if(typeof cb === 'function') {
if(this.element){
this.element.performMultiAction(this, cb);
} else {
this.browser.performMultiAction(this, cb);
}
} else {
if(this.element){
return this.element.performMultiAction(this);
} else {
return this.browser.performMultiAction(this);
}
}
};
/**
* new InputDevice({type?, id?})
*
* type is either pointer, key, or none (default is 'none')
*/
var InputDevice = function (opts) {
opts = opts || {};
this.type = opts.type || "none";
this.id = opts.id;
if (this.type === "pointer") {
if (opts.pointerType) {
this.parameters = {};
this.parameters.pointerType = opts.pointerType;
} else if (_.isObject(opts.parameters)) {
this.parameters = opts.parameters;
} else {
// Defaults to 'touch' because
this.parameters = {
pointerType: 'touch'
};
}
}
this.actions = [];
};
InputDevice.ACTION_TYPES = {
KEY: "key",
POINTER: "pointer",
NONE: "none"
};
// Map special keys to unicode characters
InputDevice.KEYS = {
"UNIDENTIFIED": "\uE000",
"CANCEL": "\uE001",
"HELP": "\uE002",
"BACKSPACCE": "\uE003",
"TAB": "\uE004",
"CLEAR": "\uE005",
"RETURN": "\uE006",
"ENTER": "\uE007",
"SHIFT": "\uE008",
"CONTROL": "\uE009",
"ALT": "\uE00A",
"PAUSE": "\uE00B",
"ESCAPE": "\uE00C",
"WHITESPACE": "\uE00D",
"PAGE_UP": "\uE00E",
"PAGE_DOWN": "\uE00F",
"END": "\uE010",
"HOME": "\uE011",
"ARROW_LEFT": "\uE012",
"ARROW_UP": "\uE013",
"ARROW_RIGHT": "\uE014",
"ARROW_DOWN": "\uE015",
"INSERT": "\uE016",
"DELETE": "\uE017",
";": "\uE018",
"=": "\uE019",
"0": "\uE01A",
"1": "\uE01B",
"2": "\uE01C",
"3": "\uE01D",
"4": "\uE01E",
"5": "\uE01F",
"6": "\uE020",
"7": "\uE021",
"8": "\uE022",
"9": "\uE023",
"*": "\uE024",
"+": "\uE025",
",": "\uE026",
"-": "\uE027",
".": "\uE028",
"/": "\uE029",
"F1": "\uE031",
"F2": "\uE032",
"F3": "\uE033",
"F4": "\uE034",
"F5": "\uE035",
"F6": "\uE036",
"F7": "\uE037",
"F8": "\uE038",
"F9": "\uE039",
"F10": "\uE03A",
"F11": "\uE03B",
"F12": "\uE03C",
"META": "\uE03D",
"ZENKAKU_HANKAKU": "\uE040"
};
InputDevice.prototype.addAction = function (actionType, opts) {
// preparing opts
var finalOpts = {};
_(opts).each(function(value, name) {
if(_.isNumber(value)) {
finalOpts[name] = value;
} else if(value instanceof Element) {
finalOpts[name] = value.value;
} else if(value) {
finalOpts[name] = value;
}
});
this.actions.push(Object.assign({
type: actionType
}, finalOpts));
};
/**
* pause(duration)
*
* Pause this input source for a duration (in ms)
*
* value is a string containing a single Unicode code point (any value in the Unicode code space)
*
* @actions
*/
InputDevice.prototype.pause = function(opts) {
var duration = _.isNumber(opts) ? opts : opts.duration;
this.addAction("pause", {duration: duration});
};
/**
* keyDown({value})
*
* Press a key.
*
* value is a string containing a single Unicode code point (any value in the Unicode code space)
*
* @actions
*/
InputDevice.prototype.keyDown = function(opts) {
return this.keyPressEvent("keyDown", opts);
};
/**
* keyUp({value})
*
* Release a key press.
*
* value is a string containing a single Unicode code point (any value in the Unicode code space)
*
* @actions
*/
InputDevice.prototype.keyUp = function (opts) {
return this.keyPressEvent("keyUp", opts);
};
InputDevice.prototype.keyPressEvent = function (type, opts) {
opts = opts || {};
if (_.isString(opts)) {
opts = {value: opts};
}
this.addAction(type, opts);
return this;
};
/**
* pointerDown({button})
*
* Depress a pointer button. Defaults to 0.
*
* @actions
*/
InputDevice.prototype.pointerDown = function (opts) {
return this.pointerButtonAction("pointerDown", opts);
};
/**
* pointerUp({button})
*
* Release a pointer button. Defaults to 0.
*
* @actions
*/
InputDevice.prototype.pointerUp = function (opts) {
return this.pointerButtonAction("pointerUp", opts);
};
InputDevice.prototype.pointerButtonAction = function (type, opts) {
opts = opts || {};
if (_.isNumber(opts)) {
opts = {button: opts};
} else if (_.isNil(opts.button)) {
opts.button = 0;
}
this.addAction(type, opts);
return this;
};
InputDevice.prototype.pointerCancel = function (opts) {
this.addAction("pointerCancel", _.defaults(opts, {
button: 0
}));
return this;
};
/**
* pointerMove({el, duration, origin, x, y})
*
* * 'origin' must be either viewport or pointer (default is 'viewport').
* * If el is set, origin will be that element
* * 'x, y' Are coordinates relative to the origin
* * 'duration' is an optional time in ms that determines how long the movement takes (default 0)
*
* @param {*} opts
*/
InputDevice.prototype.pointerMove = function (opts) {
opts = opts || {};
var el = opts.el || opts.element;
if(el && !(el instanceof Element)) {
throw new Error('Invalid element or el field passed');
}
if(el instanceof Element) {
opts.origin = {"element-6066-11e4-a52e-4f735466cecf": el.value};
}
this.addAction("pointerMove", opts);
};
InputDevice.prototype.toJSON = function () {
return _.omitBy(this, _.isFunction);
};
var W3CActions = function (driver) {
this.driver = driver;
this.touchCount = 1;
this.inputs = {};
};
/**
* w3cActions.addInputDevice(inputSource)
*
* @actions
*/
W3CActions.prototype.addInputDevice = function (inputSource) {
if (_.isNil(inputSource.id)) {
if (inputSource.type === "pointer") {
var pointerType = inputSource.parameters.pointerType;
if (pointerType === "touch") {
inputSource.id = "finger" + this.touchCount; // finger1, finger2, etc... for multi touch
this.touchCount++;
} else if(pointerType === "mouse") {
inputSource.id = "default mouse"; // Same name as what Java client uses
} else {
inputSource.id = pointerType;
}
} else {
inputSource.id = inputSource.type === "key" ? "keyboard" : inputSource.type;
}
this.inputs[inputSource.id] = new InputDevice(inputSource);
}
return this.inputs[inputSource.id];
};
W3CActions.prototype.addTouchInput = function () {
return this.addInputDevice({type: "pointer", parameters: {pointerType: "touch"}});
};
W3CActions.prototype.addMouseInput = function () {
return this.addInputDevice({type: "pointer", parameters: {pointerType: "mouse"}});
};
W3CActions.prototype.addPenInput = function () {
return this.addInputDevice({type: "pointer", parameters: {pointerType: "pen"}});
};
W3CActions.prototype.addKeyInput = function () {
return this.addInputDevice({type: "key"});
};
/**
* multiAction.perform()
*
* @actions
*/
W3CActions.prototype.perform = function(cb) {
if(typeof cb === 'function') {
return this.driver.performW3CActions(this, cb);
} else {
return this.driver.performW3CActions(this);
}
};
W3CActions.prototype.toJSON = function () {
var actions = _.values(this.inputs, function (input) { input.toJSON(); });
return {
actions: actions
};
};
module.exports = {
TouchAction: TouchAction,
MultiAction: MultiAction,
InputDevice: InputDevice,
W3CActions: W3CActions
};