Skip to content

Commit

Permalink
[js] Clean-up command mappings to better track W3C compliance.
Browse files Browse the repository at this point in the history
Also add missing commands:

GET /session/{session id}/cookie/{name}
POST /session/{session id}/frame/parent
  • Loading branch information
jleyba committed Jan 8, 2018
1 parent c5e4a58 commit f3eafa0
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 48 deletions.
5 changes: 5 additions & 0 deletions javascript/node/selenium-webdriver/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,11 @@ mode.
Google's Chrome and Microsoft's Edge browsers support the new API.

* All window manipulation commands are now supported.
* Added `driver.switchTo().parentFrame()`
* When a named cookie is requested, attempt to fetch it directly using the
W3C endpoint, `GET /session/{session id}/cookie/{name}`. If this command is
not recognized by the remote end, fallback to fetching all cookies and then
searching for the desired name.


## v3.6.0
Expand Down
15 changes: 1 addition & 14 deletions javascript/node/selenium-webdriver/lib/command.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ const Name = {

SWITCH_TO_WINDOW: 'switchToWindow',
SWITCH_TO_FRAME: 'switchToFrame',
SWITCH_TO_FRAME_PARENT: 'switchToFrameParent',
GET_PAGE_SOURCE: 'getPageSource',
GET_TITLE: 'getTitle',

Expand All @@ -147,7 +148,6 @@ const Name = {
GET_ELEMENT_SIZE: 'getElementSize',
GET_ELEMENT_ATTRIBUTE: 'getElementAttribute',
GET_ELEMENT_VALUE_OF_CSS_PROPERTY: 'getElementValueOfCssProperty',
ELEMENT_EQUALS: 'elementEquals',

SCREENSHOT: 'screenshot',
TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot',
Expand All @@ -163,19 +163,6 @@ const Name = {
SET_ALERT_TEXT: 'setAlertValue',
SET_ALERT_CREDENTIALS: 'setAlertCredentials',

GET_LOCATION: 'getLocation',
SET_LOCATION: 'setLocation',

GET_SESSION_STORAGE_ITEM: 'getSessionStorageItem',
GET_SESSION_STORAGE_KEYS: 'getSessionStorageKey',
SET_SESSION_STORAGE_ITEM: 'setSessionStorageItem',
REMOVE_SESSION_STORAGE_ITEM: 'removeSessionStorageItem',
CLEAR_SESSION_STORAGE: 'clearSessionStorage',
GET_SESSION_STORAGE_SIZE: 'getSessionStorageSize',

SET_SCREEN_ORIENTATION: 'setScreenOrientation',
GET_SCREEN_ORIENTATION: 'getScreenOrientation',

GET_AVAILABLE_LOG_TYPES: 'getAvailableLogTypes',
GET_LOG: 'getLog',
GET_SESSION_LOGS: 'getSessionLogs',
Expand Down
78 changes: 62 additions & 16 deletions javascript/node/selenium-webdriver/lib/http.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,6 @@ const COMMAND_MAP = new Map([
[cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/size')],
[cmd.Name.GET_ELEMENT_ATTRIBUTE, get('/session/:sessionId/element/:id/attribute/:name')],
[cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, get('/session/:sessionId/element/:id/css/:propertyName')],
[cmd.Name.ELEMENT_EQUALS, get('/session/:sessionId/element/:id/equals/:other')],
[cmd.Name.TAKE_ELEMENT_SCREENSHOT, get('/session/:sessionId/element/:id/screenshot')],
[cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
[cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/current/maximize')],
Expand Down Expand Up @@ -250,30 +249,77 @@ const COMMAND_MAP = new Map([

/** @const {!Map<string, (CommandSpec|CommandTransformer)>} */
const W3C_COMMAND_MAP = new Map([
// Server status.
[cmd.Name.GET_SERVER_STATUS, get('/status')],
// Session management.
[cmd.Name.NEW_SESSION, post('/session')],
[cmd.Name.QUIT, del('/session/:sessionId')],
[cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')],
[cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
// Navigation.
[cmd.Name.GET_CURRENT_URL, get('/session/:sessionId/url')],
[cmd.Name.GET, post('/session/:sessionId/url')],
[cmd.Name.GO_BACK, post('/session/:sessionId/back')],
[cmd.Name.GO_FORWARD, post('/session/:sessionId/forward')],
[cmd.Name.REFRESH, post('/session/:sessionId/refresh')],
// Page inspection.
[cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
[cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
// Script execution.
[cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute/sync')],
[cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute/async')],
// Frame selection.
[cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
[cmd.Name.SWITCH_TO_FRAME_PARENT, post('/session/:sessionId/frame/parent')],
// Window management.
[cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')],
[cmd.Name.CLOSE, del('/session/:sessionId/window')],
[cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
[cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window/handles')],
[cmd.Name.GET_WINDOW_RECT, get('/session/:sessionId/window/rect')],
[cmd.Name.SET_WINDOW_RECT, post('/session/:sessionId/window/rect')],
[cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')],
[cmd.Name.MINIMIZE_WINDOW, post('/session/:sessionId/window/minimize')],
[cmd.Name.FULLSCREEN_WINDOW, post('/session/:sessionId/window/fullscreen')],
// Actions.
[cmd.Name.ACTIONS, post('/session/:sessionId/actions')],
[cmd.Name.CLEAR_ACTIONS, del('/session/:sessionId/actions')],
// Locating elements.
[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.FIND_ELEMENT, post('/session/:sessionId/element')],
[cmd.Name.FIND_ELEMENTS, post('/session/:sessionId/elements')],
[cmd.Name.FIND_CHILD_ELEMENT, post('/session/:sessionId/element/:id/element')],
[cmd.Name.FIND_CHILD_ELEMENTS, post('/session/:sessionId/element/:id/elements')],
// Element interaction.
[cmd.Name.GET_ELEMENT_TAG_NAME, get('/session/:sessionId/element/:id/name')],
[cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, get('/session/:sessionId/element/:id/css/:propertyName')],
[cmd.Name.GET_ELEMENT_LOCATION, get('/session/:sessionId/element/:id/rect')],
[cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/rect')],
[cmd.Name.CLEAR_ELEMENT, post('/session/:sessionId/element/:id/clear')],
[cmd.Name.CLICK_ELEMENT, post('/session/:sessionId/element/:id/click')],
[cmd.Name.SEND_KEYS_TO_ELEMENT, post('/session/:sessionId/element/:id/value')],
[cmd.Name.GET_ELEMENT_TEXT, get('/session/:sessionId/element/:id/text')],
[cmd.Name.IS_ELEMENT_ENABLED, get('/session/:sessionId/element/:id/enabled')],
[cmd.Name.GET_ELEMENT_ATTRIBUTE, (cmd) => {
return toExecuteAtomCommand(cmd, Atom.GET_ATTRIBUTE, 'id', 'name');
}],
[cmd.Name.GET_ELEMENT_LOCATION, get('/session/:sessionId/element/:id/rect')],
[cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/rect')],
[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.MINIMIZE_WINDOW, post('/session/:sessionId/window/minimize')],
[cmd.Name.FULLSCREEN_WINDOW, post('/session/:sessionId/window/fullscreen')],
[cmd.Name.GET_WINDOW_RECT, get('/session/:sessionId/window/rect')],
[cmd.Name.SET_WINDOW_RECT, post('/session/:sessionId/window/rect')],
[cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')],
[cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window/handles')],
// Cookie management.
[cmd.Name.GET_ALL_COOKIES, get('/session/:sessionId/cookie')],
[cmd.Name.ADD_COOKIE, post('/session/:sessionId/cookie')],
[cmd.Name.DELETE_ALL_COOKIES, del('/session/:sessionId/cookie')],
[cmd.Name.GET_COOKIE, get('/session/:sessionId/cookie/:name')],
[cmd.Name.DELETE_COOKIE, del('/session/:sessionId/cookie/:name')],
// Alert management.
[cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/alert/accept')],
[cmd.Name.DISMISS_ALERT, post('/session/:sessionId/alert/dismiss')],
[cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert/text')],
[cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert/text')],
// Screenshots.
[cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
[cmd.Name.TAKE_ELEMENT_SCREENSHOT, get('/session/:sessionId/element/:id/screenshot')],
]);


Expand Down
50 changes: 32 additions & 18 deletions javascript/node/selenium-webdriver/lib/webdriver.js
Original file line number Diff line number Diff line change
Expand Up @@ -1178,13 +1178,26 @@ class Options {
* with the named cookie, or `null` if there is no such cookie.
*/
async getCookie(name) {
const cookies = await this.getCookies();
for (let cookie of cookies) {
if (cookie && cookie['name'] === name) {
return cookie;
try {
const cookie =
await this.driver_.execute(
new command.Command(command.Name.GET_COOKIE)
.setParameter('name', name));
return cookie;
} catch (err) {
if (!(err instanceof error.UnknownCommandError)
&& !(err instanceof error.UnsupportedOperationError)) {
throw err;
}

const cookies = await this.getCookies();
for (let cookie of cookies) {
if (cookie && cookie['name'] === name) {
return cookie;
}
}
return null;
}
return null;
}

/**
Expand Down Expand Up @@ -1638,6 +1651,19 @@ class TargetLocator {
setParameter('id', id));
}

/**
* Changes the focus of all future commands to the parent frame of the
* currently selected frame. This command has no effect if the driver is
* already focused on the top-level browsing context.
*
* @return {!Promise<void>} A promise that will be resolved when the command
* has completed.
*/
parentFrame() {
return this.driver_.execute(
new command.Command(command.Name.SWITCH_TO_FRAME_PARENT));
}

/**
* Changes the focus of all future commands to another window. Windows may be
* specified by their {@code window.name} attribute or by its handle
Expand Down Expand Up @@ -1765,19 +1791,7 @@ class WebElement {
if (a === b) {
return true;
}

let ids = await Promise.all([a.getId(), b.getId()]);
// If the two element's have the same ID, they should be considered
// equal. Otherwise, they may still be equivalent, but we'll need to
// ask the server to check for us.
if (ids[0] === ids[1]) {
return true;
}

let cmd = new command.Command(command.Name.ELEMENT_EQUALS);
cmd.setParameter('id', ids[0]);
cmd.setParameter('other', ids[1]);
return a.driver_.execute(cmd);
return a.driver_.executeScript('arguments[0] === arguments[1]', a, b);
}

/** @return {!WebDriver} The parent driver for this instance. */
Expand Down

0 comments on commit f3eafa0

Please sign in to comment.