diff options
author | George Roman <george.roman.99@gmail.com> | 2019-03-03 10:28:10 +0200 |
---|---|---|
committer | George Roman <george.roman.99@gmail.com> | 2019-03-09 16:56:51 +0200 |
commit | 46cd0d17ee728c2ff28553e560b8d3458149f76c (patch) | |
tree | e33bfb1bcc2cf771ea5ebf9c03e2f0566627f31a /components/webdriver_server/lib.rs | |
parent | db29cb01b0450c29d0ac45c6de2819a4f87e400a (diff) | |
download | servo-46cd0d17ee728c2ff28553e560b8d3458149f76c.tar.gz servo-46cd0d17ee728c2ff28553e560b8d3458149f76c.zip |
Implement WebDriver FindElementFromElement command
Diffstat (limited to 'components/webdriver_server/lib.rs')
-rw-r--r-- | components/webdriver_server/lib.rs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index e67a185c8ae..7adf57bca9f 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -766,6 +766,42 @@ impl Handler { } } + // https://w3c.github.io/webdriver/#find-element-from-element + fn handle_find_element_element( + &self, + element: &WebElement, + parameters: &LocatorParameters, + ) -> WebDriverResult<WebDriverResponse> { + if parameters.using != LocatorStrategy::CSSSelector { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + } + + let (sender, receiver) = ipc::channel().unwrap(); + let cmd = WebDriverScriptCommand::FindElementElementCSS( + parameters.value.clone(), + element.id.clone(), + sender, + ); + + self.browsing_context_script_command(cmd)?; + + match receiver.recv().unwrap() { + Ok(value) => { + let value_resp = serde_json::to_value( + value.map(|x| serde_json::to_value(WebElement::new(x)).unwrap()), + )?; + Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) + }, + Err(_) => Err(WebDriverError::new( + ErrorStatus::InvalidSelector, + "Invalid selector", + )), + } + } + // https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect fn handle_element_rect(&self, element: &WebElement) -> WebDriverResult<WebDriverResponse> { let (sender, receiver) = ipc::channel().unwrap(); @@ -1192,6 +1228,9 @@ impl WebDriverHandler<ServoExtensionRoute> for Handler { WebDriverCommand::SwitchToParentFrame => self.handle_switch_to_parent_frame(), WebDriverCommand::FindElement(ref parameters) => self.handle_find_element(parameters), WebDriverCommand::FindElements(ref parameters) => self.handle_find_elements(parameters), + WebDriverCommand::FindElementElement(ref element, ref parameters) => { + self.handle_find_element_element(element, parameters) + }, WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), WebDriverCommand::GetCookies => self.handle_get_cookies(), WebDriverCommand::GetActiveElement => self.handle_active_element(), |