// 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 Ready to inject atoms for manipulating the DOM. */ goog.provide('webdriver.atoms.inject.action'); goog.require('bot.action'); goog.require('bot.inject'); goog.require('goog.json'); goog.require('webdriver.atoms.element'); goog.require('webdriver.atoms.inject'); goog.require('webdriver.atoms.inputs'); /** * Sends key events to simulating typing on an element. * * @param {bot.inject.JsonElement} element The element to submit. * @param {!Array.} keys The keys to type. * @param {bot.inject.JsonWindow=} opt_window The optional window * containing the element. * @return {string} A stringified {@link bot.response.ResponseObject}. */ webdriver.atoms.inject.action.type = function(element, keys, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.element.type, [element, keys], opt_window); }; /** * Submits the form containing the given element. * * @param {bot.inject.JsonElement} element The element to submit. * @param {bot.inject.JsonWindow=} opt_window The optional window * containing the element. * @return {string} A stringified {@link bot.response.ResponseObject}. * @deprecated Click on a submit button or type ENTER in a text box instead. */ webdriver.atoms.inject.action.submit = function(element, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_(bot.action.submit, [element], opt_window); }; /** * Clear an element. * * @param {bot.inject.JsonElement} element The element to clear. * @param {bot.inject.JsonWindow=} opt_window The optional window * containing the element. * @return {string} A stringified {@link bot.response.ResponseObject}. * @see bot.action.clear */ webdriver.atoms.inject.action.clear = function(element, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_(bot.action.clear, [element], opt_window); }; /** * Click an element. * * @param {bot.inject.JsonElement} element The element to click. * @param {bot.inject.JsonWindow=} opt_window The optional window * containing the element. * @return {string} A stringified {@link bot.response.ResponseObject}. * @see bot.action.click */ webdriver.atoms.inject.action.click = function (element, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_(bot.action.click, [element], opt_window); }; /** * JSON representation of a {@link bot.Mouse.State} object. * @typedef {{buttonPressed: ?bot.Mouse.Button, * elementPressed: ?bot.inject.JsonElement, * clientXY: {x: number, y: number}, * nextClickIsDoubleClick: boolean, * hasEverInteracted: boolean, * element: ?bot.inject.JsonElement}} */ webdriver.atoms.inject.action.JsonMouseState; /** * Clicks a mouse button. * * @param {bot.Mouse.Button} button The button to press. * @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The * current state of the mouse. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * mouse's new state, as a * {@link webdriver.atoms.inject.action.JsonMouseState} will be included * as the response value. */ webdriver.atoms.inject.action.mouseClick = function( button, opt_mouseState, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.mouseClick, [button, opt_mouseState], opt_window); }; /** * Types a sequence of key strokes on the active element. * @param {!Array.} keys The keys to type. * @param {bot.Keyboard.State=} opt_keyboardState The keyboard's state. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * keyboard's new state, as a {@link bot.Keyboard.State} will be included * as the response value. */ webdriver.atoms.inject.action.sendKeysToActiveElement = function( keys, opt_keyboardState, opt_window) { var persistModifiers = true; return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.sendKeys, [null, keys, opt_keyboardState, persistModifiers], opt_window); }; /** * Moves the mouse to a specific element and/or coordinate location. * * @param {?bot.inject.JsonElement} element The element to move the mouse * relative to, or `null` to use the mouse's current position. * @param {?number} xOffset A horizontal offset, relative to the left edge of * the given element, or the mouse's current position if no element is * specified. * @param {?number} yOffset A vertical offset, relative to the top edge of * the given element, or the mouse's current position if no element * is specified. * @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The * current state of the mouse. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * mouse's new state, as a * {@link webdriver.atoms.inject.action.JsonMouseState} will be included * as the response value. */ webdriver.atoms.inject.action.mouseMove = function( element, xOffset, yOffset, opt_mouseState, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.mouseMove, [element, xOffset, yOffset, opt_mouseState], opt_window); }; /** * Presses the primary mouse button at the current location. * * @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The * current state of the mouse. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * mouse's new state, as a * {@link webdriver.atoms.inject.action.JsonMouseState} will be included * as the response value. */ webdriver.atoms.inject.action.mouseButtonDown = function(opt_mouseState, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.mouseButtonDown, [opt_mouseState], opt_window); }; /** * Releases the primary mouse button at the current location. * * @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The * current state of the mouse. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * mouse's new state, as a * {@link webdriver.atoms.inject.action.JsonMouseState} will be included * as the response value. */ webdriver.atoms.inject.action.mouseButtonUp = function(opt_mouseState, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.mouseButtonUp, [opt_mouseState], opt_window); }; /** * Double-clicks the primary mouse button. * * @param {webdriver.atoms.inject.action.JsonMouseState=} opt_mouseState The * current state of the mouse. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} A stringified {@link bot.response.ResponseObject}. The * mouse's new state, as a * {@link webdriver.atoms.inject.action.JsonMouseState} will be included * as the response value. */ webdriver.atoms.inject.action.doubleClick = function ( opt_mouseState, opt_window) { return webdriver.atoms.inject.action.executeActionFunction_( webdriver.atoms.inputs.doubleClick, [opt_mouseState], opt_window); }; /** * @param {!Function} fn The function to call. * @param {!Array.<*>} args An array of function arguments for the function. * @param {bot.inject.JsonWindow=} opt_window The window context for * the execution of the function. * @return {string} The serialized JSON wire protocol result of the function. * @private */ webdriver.atoms.inject.action.executeActionFunction_ = function ( fn, args, opt_window) { var response; try { var targetWindow = webdriver.atoms.inject.getWindow(opt_window); var unwrappedArgs = /** @type {Array} */(bot.inject.unwrapValue( args, targetWindow.document)); var functionResult = fn.apply(null, unwrappedArgs); response = bot.inject.wrapResponse(functionResult); } catch (ex) { response = bot.inject.wrapError(ex); } return goog.json.serialize(response); };