From 816e599db308bfeada04452d43e5a003b4046d9b Mon Sep 17 00:00:00 2001 From: hundredeir <20334754+hundredeir@users.noreply.github.com> Date: Sat, 6 Apr 2019 23:36:11 +0530 Subject: [PATCH 1/4] Add webdriver command Find elements from element --- components/script/script_thread.rs | 9 ++++++ components/script/webdriver_handlers.rs | 21 +++++++++++++ components/script_traits/webdriver_msg.rs | 1 + components/webdriver_server/lib.rs | 37 ++++++++++++++++++++++- 4 files changed, 67 insertions(+), 1 deletion(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 28a9a52566f..e9afeed8cd5 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1872,6 +1872,15 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementElementsCSS(selector,element_id,reply) => { + webdriver_handlers::handle_find_element_elements_css( + &*documents, + pipeline_id, + element_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FocusElement(element_id, reply) => { webdriver_handlers::handle_focus_element( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 89e2df12c9d..e3723ac51cd 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -220,6 +220,27 @@ pub fn handle_find_element_element_css( reply.send(node_id).unwrap(); } +pub fn handle_find_element_elements_css( + documents: &Documents, + pipeline: PipelineId, + element_id: String, + selector: String, + reply: IpcSender, ()>>, +){ + let node_ids = find_node_by_unique_id(documents,pipeline,element_id) + .ok_or(()) + .and_then(|node|{ + node.query_selector_all(DOMString::from(selector)).map_err(|_| ()) + }) + .map(|nodes| { + nodes + .iter() + .map(|x| Some(x.upcast::().unique_id())) + .collect() + }); + reply.send(node_ids).unwrap(); +} + pub fn handle_focus_element( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 157ea3aa7a9..3d4b10ac4b3 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -26,6 +26,7 @@ pub enum WebDriverScriptCommand { FindElementCSS(String, IpcSender, ()>>), FindElementsCSS(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), + FindElementElementsCSS(String, String, IpcSender, ()>>), FocusElement(String, IpcSender>), GetActiveElement(IpcSender>), GetCookie(String, IpcSender>>>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index bf838715a4c..966e6d91ddf 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -803,6 +803,38 @@ impl Handler { } } + + // https://w3c.github.io/webdriver/#find-elements-from-element + fn handle_find_element_elements(&self, + element: &WebElement, parameters: &LocatorParameters + ) -> WebDriverResult{ + if parameters.using != LocatorStrategy::CSSSelector { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy" + )); + } + + let (sender,receiver) = ipc::channel().unwrap(); + let cmd = WebDriverScriptCommand::FindElementElementsCSS( + parameters.value.clone(),element.id.clone(),sender); + + self.browsing_context_script_command(cmd)?; + + match receiver.recv().unwrap(){ + Ok(value) => { + let value_resp = value.into_iter() //maybe into_iter is superfluous + .map(|x| serde_json::to_value(WebElement::new(x)) .unwrap()) + .collect::>(); + let value_resp = serde_json::to_value(value_resp).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 { let (sender, receiver) = ipc::channel().unwrap(); @@ -1242,6 +1274,9 @@ impl WebDriverHandler for Handler { WebDriverCommand::FindElementElement(ref element, ref parameters) => { self.handle_find_element_element(element, parameters) }, + WebDriverCommand::FindElementElements(ref element,ref parameters) => { + self.handle_find_element_elements(element, parameters) + }, WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), WebDriverCommand::GetCookies => self.handle_get_cookies(), WebDriverCommand::GetActiveElement => self.handle_active_element(), @@ -1270,7 +1305,7 @@ impl WebDriverHandler for Handler { }, _ => Err(WebDriverError::new( ErrorStatus::UnsupportedOperation, - "Command not implemented", + format!("Command not implemented: {:?}", msg.command), )), } } From d191874479356a9250786ab68bf977cdfd244d5a Mon Sep 17 00:00:00 2001 From: hundredeir <20334754+hundredeir@users.noreply.github.com> Date: Sat, 6 Apr 2019 23:40:01 +0530 Subject: [PATCH 2/4] Formatted code --- components/script/script_thread.rs | 2 +- components/script/webdriver_handlers.rs | 9 +++---- components/webdriver_server/lib.rs | 32 +++++++++++++++---------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e9afeed8cd5..6a89aa1edf5 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1872,7 +1872,7 @@ impl ScriptThread { reply, ) }, - WebDriverScriptCommand::FindElementElementsCSS(selector,element_id,reply) => { + WebDriverScriptCommand::FindElementElementsCSS(selector, element_id, reply) => { webdriver_handlers::handle_find_element_elements_css( &*documents, pipeline_id, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index e3723ac51cd..428f8b283f8 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -226,11 +226,12 @@ pub fn handle_find_element_elements_css( element_id: String, selector: String, reply: IpcSender, ()>>, -){ - let node_ids = find_node_by_unique_id(documents,pipeline,element_id) +) { + let node_ids = find_node_by_unique_id(documents, pipeline, element_id) .ok_or(()) - .and_then(|node|{ - node.query_selector_all(DOMString::from(selector)).map_err(|_| ()) + .and_then(|node| { + node.query_selector_all(DOMString::from(selector)) + .map_err(|_| ()) }) .map(|nodes| { nodes diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 966e6d91ddf..c7980d31bff 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -803,36 +803,42 @@ impl Handler { } } - // https://w3c.github.io/webdriver/#find-elements-from-element - fn handle_find_element_elements(&self, - element: &WebElement, parameters: &LocatorParameters - ) -> WebDriverResult{ + fn handle_find_element_elements( + &self, + element: &WebElement, + parameters: &LocatorParameters, + ) -> WebDriverResult { if parameters.using != LocatorStrategy::CSSSelector { return Err(WebDriverError::new( ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy" + "Unsupported locator strategy", )); } - let (sender,receiver) = ipc::channel().unwrap(); + let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::FindElementElementsCSS( - parameters.value.clone(),element.id.clone(),sender); + parameters.value.clone(), + element.id.clone(), + sender, + ); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap(){ + match receiver.recv().unwrap() { Ok(value) => { - let value_resp = value.into_iter() //maybe into_iter is superfluous - .map(|x| serde_json::to_value(WebElement::new(x)) .unwrap()) + let value_resp = value + .into_iter() //maybe into_iter is superfluous + .map(|x| serde_json::to_value(WebElement::new(x)).unwrap()) .collect::>(); let value_resp = serde_json::to_value(value_resp).unwrap(); Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) }, Err(_) => Err(WebDriverError::new( - ErrorStatus::InvalidSelector,"Invalid Selector",)) + ErrorStatus::InvalidSelector, + "Invalid Selector", + )), } - } // https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect @@ -1274,7 +1280,7 @@ impl WebDriverHandler for Handler { WebDriverCommand::FindElementElement(ref element, ref parameters) => { self.handle_find_element_element(element, parameters) }, - WebDriverCommand::FindElementElements(ref element,ref parameters) => { + WebDriverCommand::FindElementElements(ref element, ref parameters) => { self.handle_find_element_elements(element, parameters) }, WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), From a00b5b20530bc0c25d8f0918270f742e4d98b261 Mon Sep 17 00:00:00 2001 From: hundredeir <20334754+hundredeir@users.noreply.github.com> Date: Sat, 6 Apr 2019 23:40:01 +0530 Subject: [PATCH 3/4] Formatted code --- components/script/script_thread.rs | 2 +- components/script/webdriver_handlers.rs | 9 +++---- components/webdriver_server/lib.rs | 32 +++++++++++++++---------- 3 files changed, 25 insertions(+), 18 deletions(-) diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index e9afeed8cd5..6a89aa1edf5 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -1872,7 +1872,7 @@ impl ScriptThread { reply, ) }, - WebDriverScriptCommand::FindElementElementsCSS(selector,element_id,reply) => { + WebDriverScriptCommand::FindElementElementsCSS(selector, element_id, reply) => { webdriver_handlers::handle_find_element_elements_css( &*documents, pipeline_id, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index e3723ac51cd..428f8b283f8 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -226,11 +226,12 @@ pub fn handle_find_element_elements_css( element_id: String, selector: String, reply: IpcSender, ()>>, -){ - let node_ids = find_node_by_unique_id(documents,pipeline,element_id) +) { + let node_ids = find_node_by_unique_id(documents, pipeline, element_id) .ok_or(()) - .and_then(|node|{ - node.query_selector_all(DOMString::from(selector)).map_err(|_| ()) + .and_then(|node| { + node.query_selector_all(DOMString::from(selector)) + .map_err(|_| ()) }) .map(|nodes| { nodes diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 966e6d91ddf..41e91235ee1 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -803,36 +803,42 @@ impl Handler { } } - // https://w3c.github.io/webdriver/#find-elements-from-element - fn handle_find_element_elements(&self, - element: &WebElement, parameters: &LocatorParameters - ) -> WebDriverResult{ + fn handle_find_element_elements( + &self, + element: &WebElement, + parameters: &LocatorParameters, + ) -> WebDriverResult { if parameters.using != LocatorStrategy::CSSSelector { return Err(WebDriverError::new( ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy" + "Unsupported locator strategy", )); } - let (sender,receiver) = ipc::channel().unwrap(); + let (sender, receiver) = ipc::channel().unwrap(); let cmd = WebDriverScriptCommand::FindElementElementsCSS( - parameters.value.clone(),element.id.clone(),sender); + parameters.value.clone(), + element.id.clone(), + sender, + ); self.browsing_context_script_command(cmd)?; - match receiver.recv().unwrap(){ + match receiver.recv().unwrap() { Ok(value) => { - let value_resp = value.into_iter() //maybe into_iter is superfluous - .map(|x| serde_json::to_value(WebElement::new(x)) .unwrap()) + let value_resp = value + .into_iter() + .map(|x| serde_json::to_value(WebElement::new(x)).unwrap()) .collect::>(); let value_resp = serde_json::to_value(value_resp).unwrap(); Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) }, Err(_) => Err(WebDriverError::new( - ErrorStatus::InvalidSelector,"Invalid Selector",)) + ErrorStatus::InvalidSelector, + "Invalid Selector", + )), } - } // https://w3c.github.io/webdriver/webdriver-spec.html#get-element-rect @@ -1274,7 +1280,7 @@ impl WebDriverHandler for Handler { WebDriverCommand::FindElementElement(ref element, ref parameters) => { self.handle_find_element_element(element, parameters) }, - WebDriverCommand::FindElementElements(ref element,ref parameters) => { + WebDriverCommand::FindElementElements(ref element, ref parameters) => { self.handle_find_element_elements(element, parameters) }, WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), From 6dcd7fd3c21800201022915111a0ff159e158411 Mon Sep 17 00:00:00 2001 From: hundredeir <20334754+hundredeir@users.noreply.github.com> Date: Wed, 10 Apr 2019 20:08:49 +0530 Subject: [PATCH 4/4] Refactor code --- components/webdriver_server/lib.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index 41e91235ee1..07c056a0e07 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -804,7 +804,7 @@ impl Handler { } // https://w3c.github.io/webdriver/#find-elements-from-element - fn handle_find_element_elements( + fn handle_find_elements_from_element( &self, element: &WebElement, parameters: &LocatorParameters, @@ -828,10 +828,10 @@ impl Handler { match receiver.recv().unwrap() { Ok(value) => { let value_resp = value - .into_iter() + .into_iter() .map(|x| serde_json::to_value(WebElement::new(x)).unwrap()) .collect::>(); - let value_resp = serde_json::to_value(value_resp).unwrap(); + let value_resp = serde_json::Value::Array(value_resp); Ok(WebDriverResponse::Generic(ValueResponse(value_resp))) }, Err(_) => Err(WebDriverError::new( @@ -1281,7 +1281,7 @@ impl WebDriverHandler for Handler { self.handle_find_element_element(element, parameters) }, WebDriverCommand::FindElementElements(ref element, ref parameters) => { - self.handle_find_element_elements(element, parameters) + self.handle_find_elements_from_element(element, parameters) }, WebDriverCommand::GetNamedCookie(ref name) => self.handle_get_cookie(name), WebDriverCommand::GetCookies => self.handle_get_cookies(),