| // 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 to find elements in the page. |
| */ |
| |
| goog.provide('webdriver.atoms.inject.locators'); |
| |
| goog.require('bot.inject'); |
| goog.require('bot.inject.cache'); |
| goog.require('bot.locators'); |
| goog.require('goog.json'); |
| goog.require('webdriver.atoms.inject'); |
| |
| |
| /** |
| * Finds an element by using the given lookup strategy. |
| * @param {string} strategy The strategy to use to locate the element. |
| * @param {string} using The locator to use. |
| * @param {?{ELEMENT: string}=} opt_root The WebElement reference for the |
| * element to perform the search under. If not specified, will use |
| * `document` for the target page. |
| * @param {{WINDOW: string}=} opt_window The serialized window object for the |
| * page to find the element in. The referenced window must exist in the |
| * page executing this script's cache. |
| * @return {string} A JSON serialized {@link bot.response.ResponseObject}. |
| */ |
| webdriver.atoms.inject.locators.findElement = function( |
| strategy, using, opt_root, opt_window) { |
| return webdriver.atoms.inject.locators.performSearch_( |
| strategy, using, bot.locators.findElement, opt_root, opt_window); |
| }; |
| |
| |
| /** |
| * Finds all elements by using the given lookup strategy. |
| * @param {string} strategy The strategy to use to locate the element. |
| * @param {string} using The locator to use. |
| * @param {?{ELEMENT: string}=} opt_root The WebElement reference for the |
| * element to perform the search under. If not specified, will use |
| * `document` for the target page. |
| * @param {{WINDOW: string}=} opt_window The serialized window object for the |
| * page to find the element in. The referenced window must exist in the |
| * page executing this script's cache. |
| * @return {string} A JSON serialized {@link bot.response.ResponseObject}. |
| */ |
| webdriver.atoms.inject.locators.findElements = function( |
| strategy, using, opt_root, opt_window) { |
| return webdriver.atoms.inject.locators.performSearch_( |
| strategy, using, bot.locators.findElements, opt_root, opt_window); |
| }; |
| |
| |
| /** |
| * Performs a search for one or more elements. |
| * @param {string} strategy The strategy to use to locate the element. |
| * @param {string} target The locator to use. |
| * @param {(function(!Object, (Document|Element)=): Element| |
| * function(!Object, (Document|Element)=): !IArrayLike)} |
| * searchFn The search function to invoke. |
| * @param {?{ELEMENT: string}=} opt_root The WebElement reference for the |
| * element to perform the search under. If not specified, will use |
| * `document` for the target page. |
| * @param {{WINDOW: string}=} opt_window The serialized window object for the |
| * page to find the element in. The referenced window must exist in the |
| * page executing this script's cache. |
| * @return {string} A JSON serialized {@link bot.response.ResponseObject}. |
| * @private |
| */ |
| webdriver.atoms.inject.locators.performSearch_ = function( |
| strategy, target, searchFn, opt_root, opt_window) { |
| var locator = {}; |
| locator[strategy] = target; |
| |
| var response; |
| try { |
| // Step 1: find the window we are locating the element in. |
| var targetWindow = webdriver.atoms.inject.getWindow(opt_window); |
| |
| // Step 2: decode the root of our search. |
| var root; |
| if (opt_root) { |
| root = /** @type {!Element} */ (bot.inject.cache.getElement( |
| opt_root[bot.inject.ELEMENT_KEY], targetWindow.document)); |
| } else { |
| root = targetWindow.document; |
| } |
| |
| // Step 3: perform the search. |
| var found = searchFn(locator, root); |
| |
| // Step 4: encode our response. |
| response = bot.inject.wrapResponse(found); |
| } catch (ex) { |
| response = bot.inject.wrapError(ex); |
| } |
| return goog.json.serialize(response); |
| }; |