212 lines
No EOL
10 KiB
JavaScript
Executable file
212 lines
No EOL
10 KiB
JavaScript
Executable file
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
/**
|
|
* Utilities for parsing WebDriver commands from HTTP Requests.
|
|
*/
|
|
const events = require("events");
|
|
var CommandName;
|
|
(function (CommandName) {
|
|
CommandName[CommandName["NewSession"] = 0] = "NewSession";
|
|
CommandName[CommandName["DeleteSession"] = 1] = "DeleteSession";
|
|
CommandName[CommandName["Status"] = 2] = "Status";
|
|
CommandName[CommandName["GetTimeouts"] = 3] = "GetTimeouts";
|
|
CommandName[CommandName["SetTimeouts"] = 4] = "SetTimeouts";
|
|
CommandName[CommandName["Go"] = 5] = "Go";
|
|
CommandName[CommandName["GetCurrentURL"] = 6] = "GetCurrentURL";
|
|
CommandName[CommandName["Back"] = 7] = "Back";
|
|
CommandName[CommandName["Forward"] = 8] = "Forward";
|
|
CommandName[CommandName["Refresh"] = 9] = "Refresh";
|
|
CommandName[CommandName["GetTitle"] = 10] = "GetTitle";
|
|
CommandName[CommandName["FindElement"] = 11] = "FindElement";
|
|
CommandName[CommandName["FindElements"] = 12] = "FindElements";
|
|
CommandName[CommandName["FindElementFromElement"] = 13] = "FindElementFromElement";
|
|
CommandName[CommandName["FindElementsFromElement"] = 14] = "FindElementsFromElement";
|
|
CommandName[CommandName["IsElementSelected"] = 15] = "IsElementSelected";
|
|
CommandName[CommandName["GetElementAttribute"] = 16] = "GetElementAttribute";
|
|
CommandName[CommandName["GetElementProperty"] = 17] = "GetElementProperty";
|
|
CommandName[CommandName["GetElementCSSValue"] = 18] = "GetElementCSSValue";
|
|
CommandName[CommandName["GetElementText"] = 19] = "GetElementText";
|
|
CommandName[CommandName["GetElementTagName"] = 20] = "GetElementTagName";
|
|
CommandName[CommandName["GetElementRect"] = 21] = "GetElementRect";
|
|
CommandName[CommandName["IsElementEnabled"] = 22] = "IsElementEnabled";
|
|
CommandName[CommandName["ElementClick"] = 23] = "ElementClick";
|
|
CommandName[CommandName["ElementClear"] = 24] = "ElementClear";
|
|
CommandName[CommandName["ElementSendKeys"] = 25] = "ElementSendKeys";
|
|
CommandName[CommandName["WireMoveTo"] = 26] = "WireMoveTo";
|
|
CommandName[CommandName["WireButtonDown"] = 27] = "WireButtonDown";
|
|
CommandName[CommandName["WireButtonUp"] = 28] = "WireButtonUp";
|
|
CommandName[CommandName["GetAlertText"] = 29] = "GetAlertText";
|
|
CommandName[CommandName["AcceptAlert"] = 30] = "AcceptAlert";
|
|
CommandName[CommandName["DismissAlert"] = 31] = "DismissAlert";
|
|
CommandName[CommandName["UNKNOWN"] = 32] = "UNKNOWN";
|
|
})(CommandName = exports.CommandName || (exports.CommandName = {}));
|
|
/**
|
|
* Represents an endpoint in the WebDriver spec. Endpoints are defined by
|
|
* the CommandName enum and the url pattern that they match.
|
|
*
|
|
* For example, the pattern
|
|
* /session/:sessionId/element/:elementId/click
|
|
* will match urls such as
|
|
* /session/d9e52b96-9b6a-4cb3-b017-76e8b4236646/element/1c2855ba-213d-4466-ba16-b14a7e6c3699/click
|
|
*
|
|
* @param pattern The url pattern
|
|
* @param method The HTTP method, ie GET, POST, DELETE
|
|
* @param name The CommandName of this endpoint.
|
|
*/
|
|
class Endpoint {
|
|
constructor(pattern, method, name) {
|
|
this.pattern = pattern;
|
|
this.method = method;
|
|
this.name = name;
|
|
}
|
|
/**
|
|
* Tests whether a given url from a request matches this endpoint.
|
|
*
|
|
* @param url A url from a request to test against the endpoint.
|
|
* @param method The HTTP method.
|
|
* @returns {boolean} Whether the endpoint matches.
|
|
*/
|
|
matches(url, method) {
|
|
let urlParts = url.split('/');
|
|
let patternParts = this.pattern.split('/');
|
|
if (method != this.method || urlParts.length != patternParts.length) {
|
|
return false;
|
|
}
|
|
// TODO: Replace this naive search with better parsing.
|
|
for (let idx in patternParts) {
|
|
if (!patternParts[idx].startsWith(':') && patternParts[idx] != urlParts[idx]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
/**
|
|
* Given a url from a http request, create an object containing parameters from the URL.
|
|
*
|
|
* Parameters are the parts of the endpoint's pattern that start with ':'. The ':' is dropped
|
|
* from the parameter key.
|
|
*
|
|
* @param url The url from the request.
|
|
* @returns An object mapping parameter keys to values from the url.
|
|
*/
|
|
getParams(url) {
|
|
let urlParts = url.split('/');
|
|
let patternParts = this.pattern.split('/');
|
|
let params = {};
|
|
for (let idx in patternParts) {
|
|
if (patternParts[idx].startsWith(':')) {
|
|
let paramName = patternParts[idx].slice(1);
|
|
params[paramName] = urlParts[idx];
|
|
}
|
|
}
|
|
return params;
|
|
}
|
|
}
|
|
/**
|
|
* An instance of a WebDriver command, containing the params and data for that request.
|
|
*
|
|
* @param commandName The enum identifying the command.
|
|
* @param params Parameters for the command taken from the request's url.
|
|
* @param data Optional data included with the command, taken from the body of the request.
|
|
*/
|
|
class WebDriverCommand extends events.EventEmitter {
|
|
constructor(commandName, url, method, params) {
|
|
super();
|
|
this.commandName = commandName;
|
|
this.url = url;
|
|
this.method = method;
|
|
this.params = params;
|
|
}
|
|
// All WebDriver commands have a session Id, except for two.
|
|
// NewSession will have a session Id in the data
|
|
// Status just doesn't
|
|
get sessionId() {
|
|
if (!this.getParam('sessionId') && this.url.startsWith('/session')) {
|
|
return this.url.split('/')[2];
|
|
}
|
|
return this.getParam('sessionId');
|
|
}
|
|
getParam(key) {
|
|
return this.params[key];
|
|
}
|
|
handleData(data) {
|
|
try {
|
|
this.data = JSON.parse(data);
|
|
}
|
|
catch (err) {
|
|
this.data = data;
|
|
}
|
|
this.emit('data');
|
|
}
|
|
handleResponse(statusCode, data) {
|
|
this.responseStatus = statusCode;
|
|
try {
|
|
this.responseData = JSON.parse(data);
|
|
}
|
|
catch (err) {
|
|
this.responseData = data;
|
|
}
|
|
this.emit('response');
|
|
}
|
|
}
|
|
exports.WebDriverCommand = WebDriverCommand;
|
|
/**
|
|
* The set of known endpoints.
|
|
*/
|
|
let endpoints = [];
|
|
function addWebDriverCommand(command, method, pattern) {
|
|
endpoints.push(new Endpoint(pattern, method, command));
|
|
}
|
|
/**
|
|
* Returns a new WebdriverCommand object for the resource at the given URL.
|
|
*/
|
|
function parseWebDriverCommand(url, method) {
|
|
for (let endpoint of endpoints) {
|
|
if (endpoint.matches(url, method)) {
|
|
let params = endpoint.getParams(url);
|
|
return new WebDriverCommand(endpoint.name, url, method, params);
|
|
}
|
|
}
|
|
return new WebDriverCommand(CommandName.UNKNOWN, url, method, {});
|
|
}
|
|
exports.parseWebDriverCommand = parseWebDriverCommand;
|
|
let sessionPrefix = '/session/:sessionId';
|
|
addWebDriverCommand(CommandName.NewSession, 'POST', '/session');
|
|
addWebDriverCommand(CommandName.DeleteSession, 'DELETE', '/session/:sessionId');
|
|
addWebDriverCommand(CommandName.Status, 'GET', '/status');
|
|
addWebDriverCommand(CommandName.GetTimeouts, 'GET', sessionPrefix + '/timeouts');
|
|
addWebDriverCommand(CommandName.SetTimeouts, 'POST', sessionPrefix + '/timeouts');
|
|
addWebDriverCommand(CommandName.Go, 'POST', sessionPrefix + '/url');
|
|
addWebDriverCommand(CommandName.GetCurrentURL, 'GET', sessionPrefix + '/url');
|
|
addWebDriverCommand(CommandName.Back, 'POST', sessionPrefix + '/back');
|
|
addWebDriverCommand(CommandName.Forward, 'POST', sessionPrefix + '/forward');
|
|
addWebDriverCommand(CommandName.Refresh, 'POST', sessionPrefix + '/refresh');
|
|
addWebDriverCommand(CommandName.GetTitle, 'GET', sessionPrefix + '/title');
|
|
addWebDriverCommand(CommandName.FindElement, 'POST', sessionPrefix + '/element');
|
|
addWebDriverCommand(CommandName.FindElements, 'POST', sessionPrefix + '/elements');
|
|
addWebDriverCommand(CommandName.FindElementFromElement, 'POST', sessionPrefix + '/element/:elementId/element');
|
|
addWebDriverCommand(CommandName.FindElementsFromElement, 'POST', sessionPrefix + '/element/:elementId/elements');
|
|
addWebDriverCommand(CommandName.IsElementSelected, 'POST', sessionPrefix + '/element/:elementId/selected');
|
|
addWebDriverCommand(CommandName.GetElementAttribute, 'GET', sessionPrefix + '/element/:elementId/attribute/:attributeName');
|
|
addWebDriverCommand(CommandName.GetElementProperty, 'GET', sessionPrefix + '/element/:elementId/property/:propertyName');
|
|
addWebDriverCommand(CommandName.GetElementCSSValue, 'GET', sessionPrefix + '/element/:elementId/css/:cssPropertyName');
|
|
addWebDriverCommand(CommandName.GetElementText, 'GET', sessionPrefix + '/element/:elementId/text');
|
|
addWebDriverCommand(CommandName.GetElementTagName, 'GET', sessionPrefix + '/element/:elementId/name');
|
|
addWebDriverCommand(CommandName.GetElementRect, 'GET', sessionPrefix + '/element/:elementId/rect');
|
|
addWebDriverCommand(CommandName.GetElementRect, 'GET', sessionPrefix + '/element/:elementId/size');
|
|
addWebDriverCommand(CommandName.IsElementEnabled, 'GET', sessionPrefix + '/element/:elementId/enabled');
|
|
addWebDriverCommand(CommandName.ElementClick, 'POST', sessionPrefix + '/element/:elementId/click');
|
|
addWebDriverCommand(CommandName.ElementClear, 'POST', sessionPrefix + '/element/:elementId/clear');
|
|
addWebDriverCommand(CommandName.ElementSendKeys, 'POST', sessionPrefix + '/element/:elementId/value');
|
|
addWebDriverCommand(CommandName.GetAlertText, 'GET', sessionPrefix + '/alert_text');
|
|
addWebDriverCommand(CommandName.GetAlertText, 'GET', sessionPrefix + '/alert/text');
|
|
addWebDriverCommand(CommandName.AcceptAlert, 'POST', sessionPrefix + '/alert/accept');
|
|
addWebDriverCommand(CommandName.AcceptAlert, 'POST', sessionPrefix + '/accept_alert');
|
|
addWebDriverCommand(CommandName.DismissAlert, 'POST', sessionPrefix + '/alert/dismiss');
|
|
addWebDriverCommand(CommandName.DismissAlert, 'POST', sessionPrefix + '/dismiss_alert');
|
|
// These commands are part of the JSON protocol, and were replaced by Perform Actions in the W3C
|
|
// spec
|
|
addWebDriverCommand(CommandName.WireMoveTo, 'POST', sessionPrefix + '/moveto');
|
|
addWebDriverCommand(CommandName.WireButtonDown, 'POST', sessionPrefix + '/buttondown');
|
|
addWebDriverCommand(CommandName.WireButtonUp, 'POST', sessionPrefix + '/buttonup');
|
|
//# sourceMappingURL=webdriver_commands.js.map
|