diff --git a/src/marionette/message.rs b/src/marionette/message.rs index bb174ca..4066213 100644 --- a/src/marionette/message.rs +++ b/src/marionette/message.rs @@ -69,6 +69,13 @@ pub struct GetTitleResponse { pub value: String, } +#[derive(Debug, Deserialize)] +#[serde(rename_all = "camelCase")] +#[allow(dead_code)] +pub struct GetCurrentUrlResponse { + pub value: String, +} + #[derive(Debug, Serialize)] #[serde(rename_all = "camelCase")] #[allow(dead_code)] @@ -85,4 +92,6 @@ pub enum Command { GetTitle, #[serde(rename = "WebDriver:Navigate")] Navigate(NavigateParams), + #[serde(rename = "WebDriver:GetCurrentURL")] + GetCurrentUrl, } diff --git a/src/marionette/mod.rs b/src/marionette/mod.rs index a8f049e..ee8c021 100644 --- a/src/marionette/mod.rs +++ b/src/marionette/mod.rs @@ -18,8 +18,8 @@ use tracing::{debug, error, trace, warn}; pub use error::{CommandError, ConnectionError, ErrorResponse, MessageError}; use message::{ - Command, GetTitleResponse, Hello, NavigateParams, NewSessionParams, - NewSessionResponse, + Command, GetCurrentUrlResponse, GetTitleResponse, Hello, NavigateParams, + NewSessionParams, NewSessionResponse, }; #[derive(Debug, Deserialize, Serialize)] @@ -174,6 +174,13 @@ impl Marionette { Ok(res.value) } + pub async fn get_current_url(&mut self) -> Result { + let res: GetCurrentUrlResponse = + self.conn.send_message(Command::GetCurrentUrl).await?.unwrap(); + debug!("Received message: {:?}", res); + Ok(res.value) + } + pub async fn navigate(&mut self, url: U) -> Result<(), CommandError> where U: Into, diff --git a/src/session.rs b/src/session.rs index 59820de..3d193cd 100644 --- a/src/session.rs +++ b/src/session.rs @@ -136,8 +136,13 @@ impl<'a> crate::mqtt::MessageHandler for MessageHandler<'a> { if let Err(e) = self.marionette.navigate(url.to_string()).await { error!("Failed to navigate: {}", e); } - if let Err(e) = publisher.publish_url(screen, &url).await { - error!("Failed to publish title: {}", e); + match self.marionette.get_current_url().await { + Ok(u) => { + if let Err(e) = publisher.publish_url(screen, &u).await { + error!("Failed to publish URL: {}", e); + } + } + Err(e) => error!("Failed to get current browser URL: {}", e), } match self.marionette.get_title().await { Ok(t) => {