diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 6263628ea3a..7b0aa00564c 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -2035,6 +2035,14 @@ impl ScriptThread { reply, ) }, + WebDriverScriptCommand::FindElementsTagName(selector, reply) => { + webdriver_handlers::handle_find_elements_tag_name( + &*documents, + pipeline_id, + selector, + reply, + ) + }, WebDriverScriptCommand::FindElementElementCSS(selector, element_id, reply) => { webdriver_handlers::handle_find_element_element_css( &*documents, diff --git a/components/script/webdriver_handlers.rs b/components/script/webdriver_handlers.rs index 05f02cebe93..2a5c6179da9 100644 --- a/components/script/webdriver_handlers.rs +++ b/components/script/webdriver_handlers.rs @@ -223,6 +223,25 @@ pub fn handle_find_elements_css( reply.send(node_ids).unwrap(); } +pub fn handle_find_elements_tag_name( + documents: &Documents, + pipeline: PipelineId, + selector: String, + reply: IpcSender, ()>>, +) { + let node_ids = documents + .find_document(pipeline) + .ok_or(()) + .and_then(|doc| Ok(doc.GetElementsByTagName(DOMString::from(selector)))) + .map(|nodes| { + nodes + .elements_iter() + .map(|x| x.upcast::().unique_id()) + .collect::>() + }); + reply.send(node_ids).unwrap(); +} + pub fn handle_find_element_element_css( documents: &Documents, pipeline: PipelineId, diff --git a/components/script_traits/webdriver_msg.rs b/components/script_traits/webdriver_msg.rs index 98e99afd14c..39d382862bd 100644 --- a/components/script_traits/webdriver_msg.rs +++ b/components/script_traits/webdriver_msg.rs @@ -27,6 +27,7 @@ pub enum WebDriverScriptCommand { FindElementCSS(String, IpcSender, ()>>), FindElementTagName(String, IpcSender, ()>>), FindElementsCSS(String, IpcSender, ()>>), + FindElementsTagName(String, IpcSender, ()>>), FindElementElementCSS(String, String, IpcSender, ()>>), FindElementElementsCSS(String, String, IpcSender, ()>>), FocusElement(String, IpcSender>), diff --git a/components/webdriver_server/lib.rs b/components/webdriver_server/lib.rs index b714520c8be..6b91f2d473c 100644 --- a/components/webdriver_server/lib.rs +++ b/components/webdriver_server/lib.rs @@ -902,20 +902,31 @@ impl Handler { Ok(WebDriverResponse::Void) } + // https://w3c.github.io/webdriver/#find-elements fn handle_find_elements( &self, parameters: &LocatorParameters, ) -> WebDriverResult { - if parameters.using != LocatorStrategy::CSSSelector { - return Err(WebDriverError::new( - ErrorStatus::UnsupportedOperation, - "Unsupported locator strategy", - )); + let (sender, receiver) = ipc::channel().unwrap(); + + match parameters.using { + LocatorStrategy::CSSSelector => { + let cmd = WebDriverScriptCommand::FindElementsCSS(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + LocatorStrategy::TagName => { + let cmd = + WebDriverScriptCommand::FindElementsTagName(parameters.value.clone(), sender); + self.browsing_context_script_command(cmd)?; + }, + _ => { + return Err(WebDriverError::new( + ErrorStatus::UnsupportedOperation, + "Unsupported locator strategy", + )); + }, } - let (sender, receiver) = ipc::channel().unwrap(); - let cmd = WebDriverScriptCommand::FindElementsCSS(parameters.value.clone(), sender); - self.browsing_context_script_command(cmd)?; match receiver.recv().unwrap() { Ok(value) => { let resp_value: Vec = value diff --git a/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini b/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini index a0a124a2b28..27b11b2d6ad 100644 --- a/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini +++ b/tests/wpt/metadata/webdriver/tests/find_elements/find.py.ini @@ -5,9 +5,6 @@ [test_find_elements_link_text[LINK TEXT-LINK TEXT\]] expected: FAIL - [test_htmldocument[tag name-html\]] - expected: FAIL - [test_find_elements_link_text[link text-link text\]] expected: FAIL @@ -50,9 +47,6 @@ [test_find_elements[xpath-//a\]] expected: FAIL - [test_find_elements[tag name-a\]] - expected: FAIL - [test_find_elements_partial_link_text[partial link text-LINK\]] expected: FAIL