From 7a3df06eb573d36142bd1a8e03c5ce8752d300b3 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 24 May 2017 15:10:37 +0200 Subject: fix build issues and add typedoc --- node_modules/selenium-webdriver/lib/by.js | 8 ++ node_modules/selenium-webdriver/lib/command.js | 2 + .../selenium-webdriver/lib/firefox/webdriver.xpi | Bin 703396 -> 712979 bytes node_modules/selenium-webdriver/lib/http.js | 93 ++++++++------- .../test/data/click_tests/disabled_element.html | 12 ++ .../lib/test/data/nestedElements.html | 11 +- node_modules/selenium-webdriver/lib/test/index.js | 3 +- node_modules/selenium-webdriver/lib/webdriver.js | 127 +++++++++++++++++++-- 8 files changed, 201 insertions(+), 55 deletions(-) create mode 100644 node_modules/selenium-webdriver/lib/test/data/click_tests/disabled_element.html (limited to 'node_modules/selenium-webdriver/lib') diff --git a/node_modules/selenium-webdriver/lib/by.js b/node_modules/selenium-webdriver/lib/by.js index 8c718be64..fc74b2056 100644 --- a/node_modules/selenium-webdriver/lib/by.js +++ b/node_modules/selenium-webdriver/lib/by.js @@ -259,6 +259,14 @@ function check(locator) { if (locator instanceof By || typeof locator === 'function') { return locator; } + + if (locator + && typeof locator === 'object' + && typeof locator.using === 'string' + && typeof locator.value === 'string') { + return new By(locator.using, locator.value); + } + for (let key in locator) { if (locator.hasOwnProperty(key) && By.hasOwnProperty(key)) { return By[key](locator[key]); diff --git a/node_modules/selenium-webdriver/lib/command.js b/node_modules/selenium-webdriver/lib/command.js index c9a366e4e..39db8c451 100644 --- a/node_modules/selenium-webdriver/lib/command.js +++ b/node_modules/selenium-webdriver/lib/command.js @@ -150,6 +150,8 @@ const Name = { TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot', IMPLICITLY_WAIT: 'implicitlyWait', SET_SCRIPT_TIMEOUT: 'setScriptTimeout', + + GET_TIMEOUT: 'getTimeout', SET_TIMEOUT: 'setTimeout', ACCEPT_ALERT: 'acceptAlert', diff --git a/node_modules/selenium-webdriver/lib/firefox/webdriver.xpi b/node_modules/selenium-webdriver/lib/firefox/webdriver.xpi index a7b0fa3a7..6c69f1d32 100644 Binary files a/node_modules/selenium-webdriver/lib/firefox/webdriver.xpi and b/node_modules/selenium-webdriver/lib/firefox/webdriver.xpi differ diff --git a/node_modules/selenium-webdriver/lib/http.js b/node_modules/selenium-webdriver/lib/http.js index 136a48e63..e141bf190 100644 --- a/node_modules/selenium-webdriver/lib/http.js +++ b/node_modules/selenium-webdriver/lib/http.js @@ -225,6 +225,7 @@ const COMMAND_MAP = new Map([ [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute')], [cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute_async')], [cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')], + [cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')], [cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')], [cmd.Name.MOVE_TO, post('/session/:sessionId/moveto')], [cmd.Name.CLICK, post('/session/:sessionId/click')], @@ -256,6 +257,10 @@ const COMMAND_MAP = new Map([ /** @const {!Map} */ const W3C_COMMAND_MAP = new Map([ [cmd.Name.GET_ACTIVE_ELEMENT, get('/session/:sessionId/element/active')], + [cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert/text')], + [cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert/text')], + [cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/alert/accept')], + [cmd.Name.DISMISS_ALERT, post('/session/:sessionId/alert/dismiss')], [cmd.Name.GET_ELEMENT_ATTRIBUTE, (cmd) => { return toExecuteAtomCommand(cmd, Atom.GET_ATTRIBUTE, 'id', 'name'); }], @@ -264,11 +269,15 @@ const W3C_COMMAND_MAP = new Map([ [cmd.Name.IS_ELEMENT_DISPLAYED, (cmd) => { return toExecuteAtomCommand(cmd, Atom.IS_DISPLAYED, 'id'); }], + [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute/sync')], + [cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute/async')], [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')], [cmd.Name.GET_WINDOW_POSITION, get('/session/:sessionId/window/position')], [cmd.Name.SET_WINDOW_POSITION, post('/session/:sessionId/window/position')], [cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/size')], [cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/size')], + [cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')], + [cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window/handles')], ]); @@ -428,34 +437,29 @@ class Executor { return doSend(this, request).then(response => { this.log_.finer(() => `>>>\n${request}\n<<<\n${response}`); - let parsed = - parseHttpResponse( - command, /** @type {!Response} */ (response), this.w3c); + let httpResponse = /** @type {!Response} */(response); + let {isW3C, value} = parseHttpResponse(command, httpResponse); if (command.getName() === cmd.Name.NEW_SESSION || command.getName() === cmd.Name.DESCRIBE_SESSION) { - if (!parsed || !parsed['sessionId']) { + if (!value || !value.sessionId) { throw new error.WebDriverError( - 'Unable to parse new session response: ' + response.body); + `Unable to parse new session response: ${response.body}`); } // The remote end is a W3C compliant server if there is no `status` // field in the response. This is not applicable for the DESCRIBE_SESSION // command, which is not defined in the W3C spec. if (command.getName() === cmd.Name.NEW_SESSION) { - this.w3c = this.w3c || !('status' in parsed); + this.w3c = this.w3c || isW3C; } - return new Session(parsed['sessionId'], parsed['value']); + // No implementations use the `capabilities` key yet... + let capabilities = value.capabilities || value.value; + return new Session(value.sessionId, capabilities); } - if (parsed - && typeof parsed === 'object' - && 'value' in parsed) { - let value = parsed['value']; - return typeof value === 'undefined' ? null : value; - } - return parsed; + return typeof value === 'undefined' ? null : value; }); }); } @@ -481,40 +485,45 @@ function tryParse(str) { * * @param {!cmd.Command} command The command the response is for. * @param {!Response} httpResponse The HTTP response to parse. - * @param {boolean} w3c Whether the response should be processed using the - * W3C wire protocol. - * @return {?} The parsed response. + * @return {{isW3C: boolean, value: ?}} An object describing the parsed + * response. This object will have two fields: `isW3C` indicates whether + * the response looks like it came from a remote end that conforms with the + * W3C WebDriver spec, and `value`, the actual response value. * @throws {WebDriverError} If the HTTP response is an error. */ -function parseHttpResponse(command, httpResponse, w3c) { - let parsed = tryParse(httpResponse.body); - if (parsed !== undefined) { - if (httpResponse.status < 200) { - // This should never happen, but throw the raw response so - // users report it. - throw new error.WebDriverError( - `Unexpected HTTP response:\n${httpResponse}`); - } +function parseHttpResponse(command, httpResponse) { + if (httpResponse.status < 200) { + // This should never happen, but throw the raw response so users report it. + throw new error.WebDriverError( + `Unexpected HTTP response:\n${httpResponse}`); + } - if (w3c) { - if (httpResponse.status > 399) { - error.throwDecodedError(parsed); + let parsed = tryParse(httpResponse.body); + if (parsed && typeof parsed === 'object') { + let value = parsed.value; + let isW3C = + value !== null && typeof value === 'object' + && typeof parsed.status === 'undefined'; + + if (!isW3C) { + error.checkLegacyResponse(parsed); + + // Adjust legacy new session responses to look like W3C to simplify + // later processing. + if (command.getName() === cmd.Name.NEW_SESSION + || command.getName() == cmd.Name.DESCRIBE_SESSION) { + value = parsed; } - return parsed; - } - // If this is a new session command, we need to check for a W3C compliant - // error object. This is necessary since a successful new session command - // is what puts the executor into W3C mode. - if (httpResponse.status > 399 - && (command.getName() == cmd.Name.NEW_SESSION - || command.getName() === cmd.Name.DESCRIBE_SESSION) - && error.isErrorResponse(parsed)) { - error.throwDecodedError(parsed); + } else if (httpResponse.status > 399) { + error.throwDecodedError(value); } - error.checkLegacyResponse(parsed); - return parsed; + return {isW3C, value}; + } + + if (parsed !== undefined) { + return {isW3C: false, value: parsed}; } let value = httpResponse.body.replace(/\r\n/g, '\n'); @@ -527,7 +536,7 @@ function parseHttpResponse(command, httpResponse, w3c) { throw new error.WebDriverError(value); } - return value || null; + return {isW3C: false, value: value || null}; } diff --git a/node_modules/selenium-webdriver/lib/test/data/click_tests/disabled_element.html b/node_modules/selenium-webdriver/lib/test/data/click_tests/disabled_element.html new file mode 100644 index 000000000..7113e1bc0 --- /dev/null +++ b/node_modules/selenium-webdriver/lib/test/data/click_tests/disabled_element.html @@ -0,0 +1,12 @@ + + + + Clicking on a disabled element + + +

See below

+
+ +
+ + \ No newline at end of file diff --git a/node_modules/selenium-webdriver/lib/test/data/nestedElements.html b/node_modules/selenium-webdriver/lib/test/data/nestedElements.html index cf00083cf..88eda51fe 100644 --- a/node_modules/selenium-webdriver/lib/test/data/nestedElements.html +++ b/node_modules/selenium-webdriver/lib/test/data/nestedElements.html @@ -5,6 +5,15 @@

inside

+
+

space

+

css escapes

+
+
+

second copy for testing plural findElements

+

second copy

+
+
Here's a checkbox: