From 978d59ea6d3ae748db3c761a2cd8204299214821 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Schj=C3=B8lberg?= Date: Fri, 28 Jun 2024 08:48:21 +0200 Subject: [PATCH 1/5] Resolve webdriver api paths relative to server_url --- thirtyfour/src/common/command.rs | 120 +++++++++++++++---------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/thirtyfour/src/common/command.rs b/thirtyfour/src/common/command.rs index bcf8939..7f5538a 100644 --- a/thirtyfour/src/common/command.rs +++ b/thirtyfour/src/common/command.rs @@ -181,7 +181,7 @@ pub trait ExtensionCommand: Debug { /// HTTP method accepting by the webdriver fn method(&self) -> Method; - /// Endpoint URL without `/session/{sessionId}` prefix + /// Endpoint URL without `session/{sessionId}` prefix /// /// Example:- `/moz/addon/install` fn endpoint(&self) -> Arc; @@ -264,75 +264,75 @@ impl FormatRequestData for Command { match self { Command::NewSession(caps) => { let w3c_caps = make_w3c_caps(caps); - RequestData::new(Method::POST, "/session").add_body(json!({ + RequestData::new(Method::POST, "session").add_body(json!({ "capabilities": w3c_caps, "desiredCapabilities": caps })) } Command::DeleteSession => { - RequestData::new(Method::DELETE, format!("/session/{}", session_id)) + RequestData::new(Method::DELETE, format!("session/{}", session_id)) } Command::Status => RequestData::new(Method::GET, "/status"), Command::GetTimeouts => { - RequestData::new(Method::GET, format!("/session/{}/timeouts", session_id)) + RequestData::new(Method::GET, format!("session/{}/timeouts", session_id)) } Command::SetTimeouts(timeout_configuration) => { - RequestData::new(Method::POST, format!("/session/{}/timeouts", session_id)) + RequestData::new(Method::POST, format!("session/{}/timeouts", session_id)) .add_body(json!(timeout_configuration)) } Command::NavigateTo(url) => { - RequestData::new(Method::POST, format!("/session/{}/url", session_id)) + RequestData::new(Method::POST, format!("session/{}/url", session_id)) .add_body(json!({ "url": url })) } Command::GetCurrentUrl => { - RequestData::new(Method::GET, format!("/session/{}/url", session_id)) + RequestData::new(Method::GET, format!("session/{}/url", session_id)) } Command::Back => { - RequestData::new(Method::POST, format!("/session/{}/back", session_id)) + RequestData::new(Method::POST, format!("session/{}/back", session_id)) .add_body(json!({})) } Command::Forward => { - RequestData::new(Method::POST, format!("/session/{}/forward", session_id)) + RequestData::new(Method::POST, format!("session/{}/forward", session_id)) .add_body(json!({})) } Command::Refresh => { - RequestData::new(Method::POST, format!("/session/{}/refresh", session_id)) + RequestData::new(Method::POST, format!("session/{}/refresh", session_id)) .add_body(json!({})) } Command::GetTitle => { - RequestData::new(Method::GET, format!("/session/{}/title", session_id)) + RequestData::new(Method::GET, format!("session/{}/title", session_id)) } Command::GetWindowHandle => { - RequestData::new(Method::GET, format!("/session/{}/window", session_id)) + RequestData::new(Method::GET, format!("session/{}/window", session_id)) } Command::CloseWindow => { - RequestData::new(Method::DELETE, format!("/session/{}/window", session_id)) + RequestData::new(Method::DELETE, format!("session/{}/window", session_id)) } Command::SwitchToWindow(window_handle) => { - RequestData::new(Method::POST, format!("/session/{}/window", session_id)) + RequestData::new(Method::POST, format!("session/{}/window", session_id)) .add_body(json!({ "handle": window_handle.to_string() })) } Command::GetWindowHandles => { - RequestData::new(Method::GET, format!("/session/{}/window/handles", session_id)) + RequestData::new(Method::GET, format!("session/{}/window/handles", session_id)) } Command::NewWindow => { - RequestData::new(Method::POST, format!("/session/{}/window/new", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/new", session_id)) .add_body(json!({"type": "window"})) } Command::NewTab => { - RequestData::new(Method::POST, format!("/session/{}/window/new", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/new", session_id)) .add_body(json!({"type": "tab"})) } Command::SwitchToFrameDefault => { - RequestData::new(Method::POST, format!("/session/{}/frame", session_id)) + RequestData::new(Method::POST, format!("session/{}/frame", session_id)) .add_body(json!({ "id": serde_json::Value::Null })) } Command::SwitchToFrameNumber(frame_number) => { - RequestData::new(Method::POST, format!("/session/{}/frame", session_id)) + RequestData::new(Method::POST, format!("session/{}/frame", session_id)) .add_body(json!({ "id": frame_number })) } Command::SwitchToFrameElement(element_id) => { - RequestData::new(Method::POST, format!("/session/{}/frame", session_id)).add_body( + RequestData::new(Method::POST, format!("session/{}/frame", session_id)).add_body( json!({"id": { "ELEMENT": element_id.to_string(), MAGIC_ELEMENTID: element_id.to_string() @@ -340,170 +340,170 @@ impl FormatRequestData for Command { ) } Command::SwitchToParentFrame => { - RequestData::new(Method::POST, format!("/session/{}/frame/parent", session_id)) + RequestData::new(Method::POST, format!("session/{}/frame/parent", session_id)) .add_body(json!({})) } Command::GetWindowRect => { - RequestData::new(Method::GET, format!("/session/{}/window/rect", session_id)) + RequestData::new(Method::GET, format!("session/{}/window/rect", session_id)) } Command::SetWindowRect(option_rect) => { - RequestData::new(Method::POST, format!("/session/{}/window/rect", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/rect", session_id)) .add_body(json!(option_rect)) } Command::MaximizeWindow => { - RequestData::new(Method::POST, format!("/session/{}/window/maximize", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/maximize", session_id)) .add_body(json!({})) } Command::MinimizeWindow => { - RequestData::new(Method::POST, format!("/session/{}/window/minimize", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/minimize", session_id)) .add_body(json!({})) } Command::FullscreenWindow => { - RequestData::new(Method::POST, format!("/session/{}/window/fullscreen", session_id)) + RequestData::new(Method::POST, format!("session/{}/window/fullscreen", session_id)) .add_body(json!({})) } Command::GetActiveElement => { - RequestData::new(Method::GET, format!("/session/{}/element/active", session_id)) + RequestData::new(Method::GET, format!("session/{}/element/active", session_id)) } Command::FindElement(selector) => { - RequestData::new(Method::POST, format!("/session/{}/element", session_id)) + RequestData::new(Method::POST, format!("session/{}/element", session_id)) .add_body(json!({"using": selector.name, "value": selector.query})) } Command::FindElements(selector) => { - RequestData::new(Method::POST, format!("/session/{}/elements", session_id)) + RequestData::new(Method::POST, format!("session/{}/elements", session_id)) .add_body(json!({"using": selector.name, "value": selector.query})) } Command::FindElementFromElement(element_id, selector) => RequestData::new( Method::POST, - format!("/session/{}/element/{}/element", session_id, element_id), + format!("session/{}/element/{}/element", session_id, element_id), ) .add_body(json!({"using": selector.name, "value": selector.query})), Command::FindElementsFromElement(element_id, selector) => RequestData::new( Method::POST, - format!("/session/{}/element/{}/elements", session_id, element_id), + format!("session/{}/element/{}/elements", session_id, element_id), ) .add_body(json!({"using": selector.name, "value": selector.query})), Command::IsElementSelected(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/selected", session_id, element_id), + format!("session/{}/element/{}/selected", session_id, element_id), ), Command::IsElementDisplayed(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/displayed", session_id, element_id), + format!("session/{}/element/{}/displayed", session_id, element_id), ), Command::GetElementAttribute(element_id, attribute_name) => RequestData::new( Method::GET, format!( - "/session/{}/element/{}/attribute/{}", + "session/{}/element/{}/attribute/{}", session_id, element_id, attribute_name ), ), Command::GetElementProperty(element_id, property_name) => RequestData::new( Method::GET, format!( - "/session/{}/element/{}/property/{}", + "session/{}/element/{}/property/{}", session_id, element_id, property_name ), ), Command::GetElementCssValue(element_id, property_name) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/css/{}", session_id, element_id, property_name), + format!("session/{}/element/{}/css/{}", session_id, element_id, property_name), ), Command::GetElementText(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/text", session_id, element_id), + format!("session/{}/element/{}/text", session_id, element_id), ), Command::GetElementTagName(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/name", session_id, element_id), + format!("session/{}/element/{}/name", session_id, element_id), ), Command::GetElementRect(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/rect", session_id, element_id), + format!("session/{}/element/{}/rect", session_id, element_id), ), Command::IsElementEnabled(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/enabled", session_id, element_id), + format!("session/{}/element/{}/enabled", session_id, element_id), ), Command::ElementClick(element_id) => RequestData::new( Method::POST, - format!("/session/{}/element/{}/click", session_id, element_id), + format!("session/{}/element/{}/click", session_id, element_id), ) .add_body(json!({})), Command::ElementClear(element_id) => RequestData::new( Method::POST, - format!("/session/{}/element/{}/clear", session_id, element_id), + format!("session/{}/element/{}/clear", session_id, element_id), ) .add_body(json!({})), Command::ElementSendKeys(element_id, typing_data) => RequestData::new( Method::POST, - format!("/session/{}/element/{}/value", session_id, element_id), + format!("session/{}/element/{}/value", session_id, element_id), ) .add_body(json!({"text": typing_data.to_string(), "value": typing_data.as_vec() })), Command::GetPageSource => { - RequestData::new(Method::GET, format!("/session/{}/source", session_id)) + RequestData::new(Method::GET, format!("session/{}/source", session_id)) } Command::ExecuteScript(script, args) => { - RequestData::new(Method::POST, format!("/session/{}/execute/sync", session_id)) + RequestData::new(Method::POST, format!("session/{}/execute/sync", session_id)) .add_body(json!({"script": script, "args": args})) } Command::ExecuteAsyncScript(script, args) => { - RequestData::new(Method::POST, format!("/session/{}/execute/async", session_id)) + RequestData::new(Method::POST, format!("session/{}/execute/async", session_id)) .add_body(json!({"script": script, "args": args})) } Command::GetAllCookies => { - RequestData::new(Method::GET, format!("/session/{}/cookie", session_id)) + RequestData::new(Method::GET, format!("session/{}/cookie", session_id)) } Command::GetNamedCookie(cookie_name) => RequestData::new( Method::GET, - format!("/session/{}/cookie/{}", session_id, cookie_name), + format!("session/{}/cookie/{}", session_id, cookie_name), ), Command::AddCookie(cookie) => { - RequestData::new(Method::POST, format!("/session/{}/cookie", session_id)) + RequestData::new(Method::POST, format!("session/{}/cookie", session_id)) .add_body(json!({ "cookie": cookie })) } Command::DeleteCookie(cookie_name) => RequestData::new( Method::DELETE, - format!("/session/{}/cookie/{}", session_id, cookie_name), + format!("session/{}/cookie/{}", session_id, cookie_name), ), Command::DeleteAllCookies => { - RequestData::new(Method::DELETE, format!("/session/{}/cookie", session_id)) + RequestData::new(Method::DELETE, format!("session/{}/cookie", session_id)) } Command::PerformActions(actions) => { - RequestData::new(Method::POST, format!("/session/{}/actions", session_id)) + RequestData::new(Method::POST, format!("session/{}/actions", session_id)) .add_body(json!({"actions": actions.0})) } Command::ReleaseActions => { - RequestData::new(Method::DELETE, format!("/session/{}/actions", session_id)) + RequestData::new(Method::DELETE, format!("session/{}/actions", session_id)) } Command::DismissAlert => { - RequestData::new(Method::POST, format!("/session/{}/alert/dismiss", session_id)) + RequestData::new(Method::POST, format!("session/{}/alert/dismiss", session_id)) .add_body(json!({})) } Command::AcceptAlert => { - RequestData::new(Method::POST, format!("/session/{}/alert/accept", session_id)) + RequestData::new(Method::POST, format!("session/{}/alert/accept", session_id)) .add_body(json!({})) } Command::GetAlertText => { - RequestData::new(Method::GET, format!("/session/{}/alert/text", session_id)) + RequestData::new(Method::GET, format!("session/{}/alert/text", session_id)) } Command::SendAlertText(typing_data) => { - RequestData::new(Method::POST, format!("/session/{}/alert/text", session_id)) + RequestData::new(Method::POST, format!("session/{}/alert/text", session_id)) .add_body(json!({ "value": typing_data.as_vec(), "text": typing_data.to_string() })) } Command::TakeScreenshot => { - RequestData::new(Method::GET, format!("/session/{}/screenshot", session_id)) + RequestData::new(Method::GET, format!("session/{}/screenshot", session_id)) } Command::TakeElementScreenshot(element_id) => RequestData::new( Method::GET, - format!("/session/{}/element/{}/screenshot", session_id, element_id), + format!("session/{}/element/{}/screenshot", session_id, element_id), ), Command::ExtensionCommand(command) => { let request_data = RequestData::new( command.method(), - format!("/session/{}{}", session_id, command.endpoint()), + format!("session/{}{}", session_id, command.endpoint()), ); match command.parameters_json() { Some(param) => request_data.add_body(param), From 27b01aa684e64d56d88e732aade8ef697a24183e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Schj=C3=B8lberg?= Date: Fri, 28 Jun 2024 10:14:02 +0200 Subject: [PATCH 2/5] Make methods take AsRef instead of &Path --- thirtyfour/src/common/capabilities/chromium.rs | 4 ++-- thirtyfour/src/extensions/addons/firefox/firefoxtools.rs | 2 +- thirtyfour/src/session/handle.rs | 2 +- thirtyfour/src/web_element.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/thirtyfour/src/common/capabilities/chromium.rs b/thirtyfour/src/common/capabilities/chromium.rs index 85b3da2..19b94a4 100644 --- a/thirtyfour/src/common/capabilities/chromium.rs +++ b/thirtyfour/src/common/capabilities/chromium.rs @@ -135,7 +135,7 @@ pub trait ChromiumLikeCapabilities: BrowserCapabilitiesHelper { } /// Add Chrome extension file. This will be a file with a .CRX extension. - fn add_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> { + fn add_extension(&mut self, crx_file: impl AsRef) -> WebDriverResult<()> { let contents = std::fs::read(crx_file)?; let b64_contents = BASE64_STANDARD.encode(contents); self.add_encoded_extension(&b64_contents) @@ -143,7 +143,7 @@ pub trait ChromiumLikeCapabilities: BrowserCapabilitiesHelper { /// Remove the specified Chrome extension file if an identical extension had been added /// previously. - fn remove_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> { + fn remove_extension(&mut self, crx_file: impl AsRef) -> WebDriverResult<()> { let contents = std::fs::read(crx_file)?; let b64_contents = BASE64_STANDARD.encode(contents); self.remove_encoded_extension(&b64_contents) diff --git a/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs b/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs index f1f5728..a610d0b 100644 --- a/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs +++ b/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs @@ -63,7 +63,7 @@ impl FirefoxTools { } /// Take a full-page screenshot of the current window and write it to the specified filename. - pub async fn full_screenshot(&self, path: &Path) -> WebDriverResult<()> { + pub async fn full_screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { let png = self.full_screenshot_as_png().await?; let mut file = File::create(path).await?; file.write_all(&png).await?; diff --git a/thirtyfour/src/session/handle.rs b/thirtyfour/src/session/handle.rs index 43327f5..0a3e031 100644 --- a/thirtyfour/src/session/handle.rs +++ b/thirtyfour/src/session/handle.rs @@ -1036,7 +1036,7 @@ impl SessionHandle { } /// Take a screenshot of the current window and write it to the specified filename. - pub async fn screenshot(&self, path: &Path) -> WebDriverResult<()> { + pub async fn screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { let png = self.screenshot_as_png().await?; let mut file = File::create(path).await?; file.write_all(&png).await?; diff --git a/thirtyfour/src/web_element.rs b/thirtyfour/src/web_element.rs index dc815b4..396cfa6 100644 --- a/thirtyfour/src/web_element.rs +++ b/thirtyfour/src/web_element.rs @@ -651,7 +651,7 @@ impl WebElement { } /// Take a screenshot of this WebElement and write it to the specified filename. - pub async fn screenshot(&self, path: &Path) -> WebDriverResult<()> { + pub async fn screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { let png = self.screenshot_as_png().await?; let mut file = File::create(path).await?; file.write_all(&png).await?; From 1c39697f291e0b05ee79804cb24f02fa9aeaa78d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Schj=C3=B8lberg?= Date: Fri, 27 Sep 2024 15:13:31 +0200 Subject: [PATCH 3/5] Fix webdriver urls used in tests --- thirtyfour/tests/common.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thirtyfour/tests/common.rs b/thirtyfour/tests/common.rs index 7aea216..a25e72c 100644 --- a/thirtyfour/tests/common.rs +++ b/thirtyfour/tests/common.rs @@ -40,8 +40,8 @@ pub fn make_capabilities(s: &str) -> Capabilities { /// Get the WebDriver URL for the specified browser. pub fn webdriver_url(s: &str) -> String { match s { - "firefox" => "http://localhost:4444/wd/hub".to_string(), - "chrome" => "http://localhost:9515/wd/hub".to_string(), + "firefox" => "http://localhost:4444".to_string(), + "chrome" => "http://localhost:9515".to_string(), browser => unimplemented!("unsupported browser backend {}", browser), } } From f01f95e30359da42dbd274b03d7cb4c357b3953d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Schj=C3=B8lberg?= Date: Mon, 4 Nov 2024 14:12:59 +0100 Subject: [PATCH 4/5] Revert "Make methods take AsRef instead of &Path" This reverts commit 27b01aa684e64d56d88e732aade8ef697a24183e. --- thirtyfour/src/common/capabilities/chromium.rs | 4 ++-- thirtyfour/src/extensions/addons/firefox/firefoxtools.rs | 2 +- thirtyfour/src/session/handle.rs | 2 +- thirtyfour/src/web_element.rs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/thirtyfour/src/common/capabilities/chromium.rs b/thirtyfour/src/common/capabilities/chromium.rs index 19b94a4..85b3da2 100644 --- a/thirtyfour/src/common/capabilities/chromium.rs +++ b/thirtyfour/src/common/capabilities/chromium.rs @@ -135,7 +135,7 @@ pub trait ChromiumLikeCapabilities: BrowserCapabilitiesHelper { } /// Add Chrome extension file. This will be a file with a .CRX extension. - fn add_extension(&mut self, crx_file: impl AsRef) -> WebDriverResult<()> { + fn add_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> { let contents = std::fs::read(crx_file)?; let b64_contents = BASE64_STANDARD.encode(contents); self.add_encoded_extension(&b64_contents) @@ -143,7 +143,7 @@ pub trait ChromiumLikeCapabilities: BrowserCapabilitiesHelper { /// Remove the specified Chrome extension file if an identical extension had been added /// previously. - fn remove_extension(&mut self, crx_file: impl AsRef) -> WebDriverResult<()> { + fn remove_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> { let contents = std::fs::read(crx_file)?; let b64_contents = BASE64_STANDARD.encode(contents); self.remove_encoded_extension(&b64_contents) diff --git a/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs b/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs index 662f2f2..e7e88da 100644 --- a/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs +++ b/thirtyfour/src/extensions/addons/firefox/firefoxtools.rs @@ -62,7 +62,7 @@ impl FirefoxTools { } /// Take a full-page screenshot of the current window and write it to the specified filename. - pub async fn full_screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { + pub async fn full_screenshot(&self, path: &Path) -> WebDriverResult<()> { let png = self.full_screenshot_as_png().await?; support::write_file(path, png).await?; Ok(()) diff --git a/thirtyfour/src/session/handle.rs b/thirtyfour/src/session/handle.rs index bd335ed..e0ed717 100644 --- a/thirtyfour/src/session/handle.rs +++ b/thirtyfour/src/session/handle.rs @@ -1058,7 +1058,7 @@ impl SessionHandle { } /// Take a screenshot of the current window and write it to the specified filename. - pub async fn screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { + pub async fn screenshot(&self, path: &Path) -> WebDriverResult<()> { let png = self.screenshot_as_png().await?; support::write_file(path, png).await?; Ok(()) diff --git a/thirtyfour/src/web_element.rs b/thirtyfour/src/web_element.rs index 36e353b..85ebc74 100644 --- a/thirtyfour/src/web_element.rs +++ b/thirtyfour/src/web_element.rs @@ -649,7 +649,7 @@ impl WebElement { } /// Take a screenshot of this WebElement and write it to the specified filename. - pub async fn screenshot(&self, path: impl AsRef) -> WebDriverResult<()> { + pub async fn screenshot(&self, path: &Path) -> WebDriverResult<()> { let png = self.screenshot_as_png().await?; support::write_file(path, png).await?; Ok(()) From afde9fa8c2fd669ecc102c9156ba7be155b789f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Schj=C3=B8lberg?= Date: Mon, 25 Nov 2024 11:20:41 +0100 Subject: [PATCH 5/5] fmt --- thirtyfour/src/common/command.rs | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/thirtyfour/src/common/command.rs b/thirtyfour/src/common/command.rs index 1bdbb83..6df0b29 100644 --- a/thirtyfour/src/common/command.rs +++ b/thirtyfour/src/common/command.rs @@ -289,10 +289,8 @@ impl FormatRequestData for Command { Command::GetCurrentUrl => { RequestData::new(Method::GET, format!("session/{}/url", session_id)) } - Command::Back => { - RequestData::new(Method::POST, format!("session/{}/back", session_id)) - .add_body(json!({})) - } + Command::Back => RequestData::new(Method::POST, format!("session/{}/back", session_id)) + .add_body(json!({})), Command::Forward => { RequestData::new(Method::POST, format!("session/{}/forward", session_id)) .add_body(json!({})) @@ -402,10 +400,7 @@ impl FormatRequestData for Command { ), Command::GetElementProperty(element_id, property_name) => RequestData::new( Method::GET, - format!( - "session/{}/element/{}/property/{}", - session_id, element_id, property_name - ), + format!("session/{}/element/{}/property/{}", session_id, element_id, property_name), ), Command::GetElementCssValue(element_id, property_name) => RequestData::new( Method::GET,