webdriver_server: Implement find element(s) from element according to spec (#37521)

Report `InvalidArgument` and `NoSuchElement` properly for [Find Element
from
Element](https://w3c.github.io/webdriver/#find-element-from-element) +
[Find Elements from
Element](https://w3c.github.io/webdriver/#find-elements-from-element)

Testing: `./mach test-wpt -r
.\tests\wpt\tests\webdriver\tests\classic\element_click
.\tests\wpt\tests\webdriver\tests\classic\find_* --product servodriver`

---------

Signed-off-by: Euclid Ye <yezhizhenjiakang@gmail.com>
This commit is contained in:
Euclid Ye 2025-06-18 14:39:55 +08:00 committed by GitHub
parent 96ef92b9ac
commit e26532e19b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 18 additions and 39 deletions

View file

@ -1167,12 +1167,16 @@ impl Handler {
}
}
// https://w3c.github.io/webdriver/#find-element-from-element
/// <https://w3c.github.io/webdriver/#find-element-from-element>
fn handle_find_element_element(
&self,
element: &WebElement,
parameters: &LocatorParameters,
) -> WebDriverResult<WebDriverResponse> {
// Step 4. If selector is undefined, return error with error code invalid argument.
if parameters.value.is_empty() {
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
}
let (sender, receiver) = ipc::channel().unwrap();
match parameters.using {
@ -1208,24 +1212,30 @@ impl Handler {
));
},
}
// Step 9. If result is empty, return error with error code no such element.
// Otherwise, return the first element of result.
match wait_for_script_response(receiver)? {
Ok(value) => {
let value_resp = serde_json::to_value(
value.map(|x| serde_json::to_value(WebElement(x)).unwrap()),
)?;
Ok(WebDriverResponse::Generic(ValueResponse(value_resp)))
Ok(value) => match value {
Some(value) => {
let value_resp = serde_json::to_value(WebElement(value))?;
Ok(WebDriverResponse::Generic(ValueResponse(value_resp)))
},
None => Err(WebDriverError::new(ErrorStatus::NoSuchElement, "")),
},
Err(error) => Err(WebDriverError::new(error, "")),
}
}
// https://w3c.github.io/webdriver/#find-elements-from-element
/// <https://w3c.github.io/webdriver/#find-elements-from-element>
fn handle_find_elements_from_element(
&self,
element: &WebElement,
parameters: &LocatorParameters,
) -> WebDriverResult<WebDriverResponse> {
// Step 4. If selector is undefined, return error with error code invalid argument.
if parameters.value.is_empty() {
return Err(WebDriverError::new(ErrorStatus::InvalidArgument, ""));
}
let (sender, receiver) = ipc::channel().unwrap();
match parameters.using {