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
--- 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)
}