// Licensed to the Software Freedom Conservancy (SFC) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The SFC licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. /** * @fileoverview Contains several classes for handling commands. */ 'use strict'; /** * Describes a command to execute. * @final */ class Command { /** @param {string} name The name of this command. */ constructor(name) { /** @private {string} */ this.name_ = name; /** @private {!Object<*>} */ this.parameters_ = {}; } /** @return {string} This command's name. */ getName() { return this.name_; } /** * Sets a parameter to send with this command. * @param {string} name The parameter name. * @param {*} value The parameter value. * @return {!Command} A self reference. */ setParameter(name, value) { this.parameters_[name] = value; return this; } /** * Sets the parameters for this command. * @param {!Object<*>} parameters The command parameters. * @return {!Command} A self reference. */ setParameters(parameters) { this.parameters_ = parameters; return this; } /** * Returns a named command parameter. * @param {string} key The parameter key to look up. * @return {*} The parameter value, or undefined if it has not been set. */ getParameter(key) { return this.parameters_[key]; } /** * @return {!Object<*>} The parameters to send with this command. */ getParameters() { return this.parameters_; } } /** * Enumeration of predefined names command names that all command processors * will support. * @enum {string} */ // TODO: Delete obsolete command names. const Name = { GET_SERVER_STATUS: 'getStatus', NEW_SESSION: 'newSession', GET_SESSIONS: 'getSessions', DESCRIBE_SESSION: 'getSessionCapabilities', CLOSE: 'close', QUIT: 'quit', GET_CURRENT_URL: 'getCurrentUrl', GET: 'get', GO_BACK: 'goBack', GO_FORWARD: 'goForward', REFRESH: 'refresh', ADD_COOKIE: 'addCookie', GET_COOKIE: 'getCookie', GET_ALL_COOKIES: 'getCookies', DELETE_COOKIE: 'deleteCookie', DELETE_ALL_COOKIES: 'deleteAllCookies', GET_ACTIVE_ELEMENT: 'getActiveElement', FIND_ELEMENT: 'findElement', FIND_ELEMENTS: 'findElements', FIND_CHILD_ELEMENT: 'findChildElement', FIND_CHILD_ELEMENTS: 'findChildElements', CLEAR_ELEMENT: 'clearElement', CLICK_ELEMENT: 'clickElement', SEND_KEYS_TO_ELEMENT: 'sendKeysToElement', SUBMIT_ELEMENT: 'submitElement', GET_CURRENT_WINDOW_HANDLE: 'getCurrentWindowHandle', GET_WINDOW_HANDLES: 'getWindowHandles', GET_WINDOW_POSITION: 'getWindowPosition', SET_WINDOW_POSITION: 'setWindowPosition', GET_WINDOW_SIZE: 'getWindowSize', SET_WINDOW_SIZE: 'setWindowSize', MAXIMIZE_WINDOW: 'maximizeWindow', SWITCH_TO_WINDOW: 'switchToWindow', SWITCH_TO_FRAME: 'switchToFrame', GET_PAGE_SOURCE: 'getPageSource', GET_TITLE: 'getTitle', EXECUTE_SCRIPT: 'executeScript', EXECUTE_ASYNC_SCRIPT: 'executeAsyncScript', GET_ELEMENT_TEXT: 'getElementText', GET_ELEMENT_TAG_NAME: 'getElementTagName', IS_ELEMENT_SELECTED: 'isElementSelected', IS_ELEMENT_ENABLED: 'isElementEnabled', IS_ELEMENT_DISPLAYED: 'isElementDisplayed', GET_ELEMENT_LOCATION: 'getElementLocation', GET_ELEMENT_LOCATION_IN_VIEW: 'getElementLocationOnceScrolledIntoView', GET_ELEMENT_SIZE: 'getElementSize', GET_ELEMENT_ATTRIBUTE: 'getElementAttribute', GET_ELEMENT_VALUE_OF_CSS_PROPERTY: 'getElementValueOfCssProperty', ELEMENT_EQUALS: 'elementEquals', SCREENSHOT: 'screenshot', TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot', IMPLICITLY_WAIT: 'implicitlyWait', SET_SCRIPT_TIMEOUT: 'setScriptTimeout', GET_TIMEOUT: 'getTimeout', SET_TIMEOUT: 'setTimeout', ACCEPT_ALERT: 'acceptAlert', DISMISS_ALERT: 'dismissAlert', GET_ALERT_TEXT: 'getAlertText', SET_ALERT_TEXT: 'setAlertValue', SET_ALERT_CREDENTIALS: 'setAlertCredentials', EXECUTE_SQL: 'executeSQL', GET_LOCATION: 'getLocation', SET_LOCATION: 'setLocation', GET_APP_CACHE: 'getAppCache', GET_APP_CACHE_STATUS: 'getStatus', CLEAR_APP_CACHE: 'clearAppCache', IS_BROWSER_ONLINE: 'isBrowserOnline', SET_BROWSER_ONLINE: 'setBrowserOnline', GET_LOCAL_STORAGE_ITEM: 'getLocalStorageItem', GET_LOCAL_STORAGE_KEYS: 'getLocalStorageKeys', SET_LOCAL_STORAGE_ITEM: 'setLocalStorageItem', REMOVE_LOCAL_STORAGE_ITEM: 'removeLocalStorageItem', CLEAR_LOCAL_STORAGE: 'clearLocalStorage', GET_LOCAL_STORAGE_SIZE: 'getLocalStorageSize', 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', // These belong to the Advanced user interactions - an element is // optional for these commands. CLICK: 'mouseClick', DOUBLE_CLICK: 'mouseDoubleClick', MOUSE_DOWN: 'mouseButtonDown', MOUSE_UP: 'mouseButtonUp', MOVE_TO: 'mouseMoveTo', SEND_KEYS_TO_ACTIVE_ELEMENT: 'sendKeysToActiveElement', // These belong to the Advanced Touch API TOUCH_SINGLE_TAP: 'touchSingleTap', TOUCH_DOWN: 'touchDown', TOUCH_UP: 'touchUp', TOUCH_MOVE: 'touchMove', TOUCH_SCROLL: 'touchScroll', TOUCH_DOUBLE_TAP: 'touchDoubleTap', TOUCH_LONG_PRESS: 'touchLongPress', TOUCH_FLICK: 'touchFlick', GET_AVAILABLE_LOG_TYPES: 'getAvailableLogTypes', GET_LOG: 'getLog', GET_SESSION_LOGS: 'getSessionLogs', // Non-standard commands used by the standalone Selenium server. UPLOAD_FILE: 'uploadFile' }; /** * Handles the execution of WebDriver {@link Command commands}. * @interface */ class Executor { /** * Executes the given {@code command}. If there is an error executing the * command, the provided callback will be invoked with the offending error. * Otherwise, the callback will be invoked with a null Error and non-null * response object. * * @param {!Command} command The command to execute. * @return {!Promise} A promise that will be fulfilled with the command * result. */ execute(command) {} } // PUBLIC API module.exports = { Command: Command, Name: Name, Executor: Executor };