Bug 1408509 - Support web elements, frames, and windows in geckodriver. r?whimboo draft
authorAndreas Tolfsen <ato@sny.no>
Tue, 19 Jun 2018 19:04:36 +0100
changeset 810825 673335c7b62c4163d894d5a39fc8b7aa0195b280
parent 810823 348090c6b5c421c67b9dccc48742b54a854d6d0e
child 810826 73b4fe068be41301f0d98b5a3be6ee3a6ae47c12
push id114124
push userbmo:ato@sny.no
push dateTue, 26 Jun 2018 15:47:34 +0000
reviewerswhimboo
bugs1408509
milestone63.0a1
Bug 1408509 - Support web elements, frames, and windows in geckodriver. r?whimboo This makes geckodriver support WebDriver web elements, web frames, and web windows. Marionette sends back JSON Objects such as {<element key>: <uuid>} where the element key is one of the unique strings this patch adds to geckodriver::marionette. MozReview-Commit-ID: HegkGFqxkms
testing/geckodriver/CHANGES.md
testing/geckodriver/src/marionette.rs
testing/webdriver/src/common.rs
--- a/testing/geckodriver/CHANGES.md
+++ b/testing/geckodriver/CHANGES.md
@@ -1,14 +1,23 @@
 Change log
 ==========
 
 All notable changes to this program is documented in this file.
 
 
+Unreleased
+----------
+
+### Added
+
+- Support for WebDriver web element, web frame, and web window
+  identifiers from Firefox.
+
+
 0.21.0 (2018-06-15)
 -------------------
 
 Note that with this release of geckodriver the minimum recommended
 Firefox and Selenium versions have changed:
 
   - Firefox 57 (and greater)
   - Selenium 3.11 (and greater)
--- a/testing/geckodriver/src/marionette.rs
+++ b/testing/geckodriver/src/marionette.rs
@@ -40,17 +40,17 @@ use webdriver::command::WebDriverCommand
 use webdriver::command::{
     NewSessionParameters, GetParameters, WindowRectParameters, SwitchToWindowParameters,
     SwitchToFrameParameters, LocatorParameters, JavascriptCommandParameters,
     GetNamedCookieParameters, AddCookieParameters, TimeoutsParameters,
     ActionsParameters, TakeScreenshotParameters};
 use webdriver::response::{CloseWindowResponse, Cookie, CookieResponse, CookiesResponse,
                           ElementRectResponse, NewSessionResponse, TimeoutsResponse,
                           ValueResponse, WebDriverResponse, WindowRectResponse};
-use webdriver::common::{Date, ELEMENT_KEY, FrameId, Nullable, WebElement};
+use webdriver::common::{Date, ELEMENT_KEY, FrameId, FRAME_KEY, Nullable, WebElement, WINDOW_KEY};
 use webdriver::error::{ErrorStatus, WebDriverError, WebDriverResult};
 use webdriver::server::{WebDriverHandler, Session};
 use webdriver::httpapi::{WebDriverExtensionRoute};
 
 use capabilities::{FirefoxCapabilities, FirefoxOptions};
 use logging;
 use prefs;
 
@@ -646,29 +646,39 @@ impl MarionetteSession {
                         "Unable to convert session id to string");
                 self.session_id = session_id.to_string().clone();
             },
             _ => {}
         }
         Ok(())
     }
 
+    /// Converts a Marionette JSON response into a `WebElement`.
+    ///
+    /// Note that it currently coerces all chrome elements, web frames, and web
+    /// windows also into web elements.  This will change at a later point.
     fn to_web_element(&self, json_data: &Json) -> WebDriverResult<WebElement> {
         let data = try_opt!(
             json_data.as_object(),
             ErrorStatus::UnknownError,
             "Failed to convert data to an object"
         );
 
-        let web_element = data.get(ELEMENT_KEY);
         let chrome_element = data.get(CHROME_ELEMENT_KEY);
+        let element = data.get(ELEMENT_KEY);
+        let frame = data.get(FRAME_KEY);
         let legacy_element = data.get(LEGACY_ELEMENT_KEY);
+        let window = data.get(WINDOW_KEY);
 
         let value = try_opt!(
-            web_element.or(chrome_element).or(legacy_element),
+            element
+                .or(legacy_element)
+                .or(chrome_element)
+                .or(frame)
+                .or(window),
             ErrorStatus::UnknownError,
             "Failed to extract web element from Marionette response"
         );
         let id = try_opt!(
             value.as_string(),
             ErrorStatus::UnknownError,
             "Failed to convert web element reference value to string"
         ).to_string();
--- a/testing/webdriver/src/common.rs
+++ b/testing/webdriver/src/common.rs
@@ -1,15 +1,17 @@
 use rustc_serialize::{Encodable, Encoder};
 use rustc_serialize::json::{Json, ToJson};
 use std::collections::BTreeMap;
 
 use error::{WebDriverResult, WebDriverError, ErrorStatus};
 
 pub static ELEMENT_KEY: &'static str = "element-6066-11e4-a52e-4f735466cecf";
+pub static FRAME_KEY: &'static str = "frame-075b-4da1-b6ba-e579c2d3230a";
+pub static WINDOW_KEY: &'static str = "window-fcc6-11e5-b4f8-330a88ab9d7f";
 
 #[derive(Clone, Debug, PartialEq, RustcEncodable)]
 pub struct Date(pub u64);
 
 impl Date {
     pub fn new(timestamp: u64) -> Date {
         Date(timestamp)
     }