serenium/
session.rs

1use std::result::Result;
2use std::error::Error;
3use reqwest::Client;
4use serde::Serialize;
5use serde_json::Value;
6use super::capabilities::*;
7use super::errors::{ResponseError};
8
9#[derive(Serialize)]
10struct CapabilitiesContainer<'a> {
11    capabilities: MatchContainer<'a>
12}
13
14impl<'a> CapabilitiesContainer<'a> {
15    fn new(capabilities: &'a Capabilities) -> CapabilitiesContainer<'a> {
16        CapabilitiesContainer {
17            capabilities: MatchContainer {
18                always_math: capabilities
19            }
20        }
21    }
22}
23
24#[derive(Serialize)]
25struct MatchContainer<'a> {
26    #[serde(rename = "alwaysMatch")]
27    always_math: &'a Capabilities<'a>,
28}
29
30pub struct Session<'a> {
31    server_address: String,
32    session_id: String,
33    pub timeout: &'a Timeout,
34}
35
36impl<'a> Session<'a> {
37    pub fn new_session<'b>(server_address: &str, browser_capabilities: &'b Capabilities) -> Result<Session<'b>, Box<Error>> {
38        let capabilities_json = serde_json::to_string(&CapabilitiesContainer::new(browser_capabilities)).unwrap(); // TODO: Proper error handling
39
40        dbg!(&capabilities_json);
41
42        let client = Client::new();
43        let mut response = client
44            .post((server_address.to_owned() + "/session").as_str())
45            .body(capabilities_json)
46            .send()?;
47
48        let json_data = &response.text()?;
49        dbg!(json_data);
50        let result: Value = serde_json::from_str(json_data.as_str())?;
51        dbg!(&result);
52        return Ok(Session {
53            server_address: server_address.to_owned(),
54            session_id: result["value"]["sessionId"].as_str().unwrap().to_owned(),
55            timeout: browser_capabilities.timeouts.clone(),
56        });
57    }
58
59    pub fn set_timeouts(&mut self, timeouts: &Timeout) -> Result<(), Box<Error>> {
60        let client = Client::new();
61        let url = format!("{}/session/{}/timeouts", self.server_address, self.session_id);
62        let serialized_timeouts = serde_json::to_string(timeouts)?;
63
64        client
65            .post(&url)
66            .body(serialized_timeouts)
67            .send()?;
68
69        Ok(())
70    }
71
72    pub fn current_url(&self) -> Result<String, Box<Error>> {
73        let client = Client::new();
74        let url = format!("{}/session/{}/url", self.server_address, self.session_id);
75        let mut response = client
76            .get(&url)
77            .send()?;
78        let response_deserialized: Value = serde_json::from_str(&response.text()?)?;
79        let current_url = response_deserialized["value"].as_str();
80        return match current_url {
81            Some(url) => {
82                return Ok(url.to_owned());
83            }
84            _ => Err(Box::new(
85                ResponseError{
86                    description: "Value in json was null".to_owned(),
87                    side: None,
88                }
89            ))
90        };
91    }
92
93    pub fn navigate(&self,url: &str) -> Result<(),Box<Error>> {
94        #[derive(Serialize)]
95        struct RequestData<'a> {
96            url: &'a str
97        }
98
99        let client = Client::new();
100        let request_data = RequestData{url};
101        let url = format!("{}/session/{}/url", self.server_address, self.session_id);
102
103        client
104            .post(&url)
105            .body(serde_json::to_string(&request_data)?)
106            .send()?;
107
108        Ok(())
109    }
110
111    pub fn refresh(&self) -> Result<(),Box<Error>> {
112        let client = Client::new();
113        let url = format!("{}/session/{}/refresh",self.server_address,self.session_id);
114        client
115            .post(&url)
116            .send()?;
117
118        Ok(())
119    }
120
121    pub fn navigate_back(&self) -> Result<(),Box<Error>> {
122        let client = Client::new();
123        let url = format!("{}/session/{}/back",self.server_address,self.session_id);
124        client
125            .post(&url)
126            .send()?;
127
128        Ok(())
129    }
130}
131
132impl<'a> Drop for Session<'a> {
133    fn drop(&mut self) {
134        let request_url = format!("{}/session/{}", self.server_address, self.session_id);
135        reqwest::Client::new().delete(request_url.as_str()).send();
136    }
137}