use crate::common::config::WebDriverConfig;
use crate::error::WebDriverResult;
use crate::session::handle::SessionHandle;
use crate::{Capabilities, SessionId};
use std::ops::Deref;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct WebDriver {
pub handle: Arc<SessionHandle>,
}
impl WebDriver {
pub async fn new<C>(server_url: &str, capabilities: C) -> WebDriverResult<Self>
where
C: Into<Capabilities>,
{
Self::new_with_config(server_url, capabilities, WebDriverConfig::default()).await
}
pub async fn new_with_config<C>(
server_url: &str,
capabilities: C,
config: WebDriverConfig,
) -> WebDriverResult<Self>
where
C: Into<Capabilities>,
{
#[cfg(not(any(feature = "rustls-tls", feature = "native-tls")))]
panic!("please set either the rustls-tls or native-tls feature");
#[cfg(any(feature = "rustls-tls", feature = "native-tls"))]
{
use crate::upstream::ClientBuilder;
use crate::TimeoutConfiguration;
let caps: Capabilities = capabilities.into();
#[cfg(feature = "native-tls")]
let mut builder = ClientBuilder::native();
#[cfg(feature = "rustls-tls")]
let mut builder = ClientBuilder::rustls();
let client = builder.capabilities(caps.clone()).connect(server_url).await?;
let timeouts = TimeoutConfiguration::default();
client.update_timeouts(timeouts).await?;
let session_id = client.session_id().await?.expect("session id is not valid");
Ok(Self {
handle: Arc::new(SessionHandle::new_with_config(
client,
SessionId::from(session_id),
config,
)?),
})
}
}
pub fn clone_with_config(&self, config: WebDriverConfig) -> Self {
Self {
handle: self.handle.clone_with_config(config),
}
}
pub async fn quit(self) -> WebDriverResult<()> {
let client = self.handle.client.clone();
client.close().await?;
Ok(())
}
}
impl Deref for WebDriver {
type Target = Arc<SessionHandle>;
fn deref(&self) -> &Self::Target {
&self.handle
}
}