selenium_webdriver/
firefoxoptions.rs

1use super::reqs::*;
2use std::collections::HashMap;
3/// Utility struct to adjust the firefox browser session
4/// 
5/// For more info on FF Options please check
6/// https://developer.mozilla.org/en-US/docs/Web/WebDriver/Capabilities/firefoxOptions
7pub struct FirefoxOptions{
8    pub(crate) string_for_session:String,
9}
10impl FirefoxOptions{
11    pub fn new()->Self{
12        FirefoxOptions{
13            string_for_session: String::from(r#""moz:firefoxOptions":{}"#),
14        }
15    }
16    ///Absolute path to the custom Firefox binary to use.
17    pub fn add_binary(&mut self,path: &str)->&mut Self{
18        if self.string_for_session.contains("binary"){panic!("The options already contain path to binary");}
19        self.string_for_session.pop();
20        let bin = format!(r#""binary":"{}","#,path);
21        self.string_for_session.push_str(&bin);
22        self.string_for_session.push('}');
23        self
24    }
25    ///More info on the FF args here:
26    ///https://developer.mozilla.org/en-US/docs/Mozilla/Command_Line_Options?redirectlocale=en-US&redirectslug=Command_Line_Options
27    pub fn add_args(&mut self, args: Vec<&str>)->&mut Self{
28        if self.string_for_session.contains("args"){panic!("The options already contain args");}
29        self.string_for_session.pop();
30        let mut inner_args = String::from("\"args\":");
31        let vec_to_str = from_str_vec_to_str(args);
32        inner_args.push_str(&vec_to_str);
33        self.string_for_session.push_str(&inner_args);
34        self.string_for_session.push('}');
35        self
36    }
37    ///As there are various prefs types, this methods takes a string representation of json.
38    /// # Examples
39    /// ```
40    /// # use selenium_webdriver::*;
41    /// let mut ff = FirefoxOptions::new();
42    /// let prefs = r#"{dom.ipc.processCount": 8,"javascript.options.showInConsole": false}"#;
43    /// ff.add_prefs(prefs);
44    /// ```
45    pub fn add_prefs(&mut self, prefs:&str)->&mut Self{
46        if self.string_for_session.contains("prefs"){panic!("The options already contain prefs");}
47        self.string_for_session.pop();
48        let text = format!(r#""prefs":{},"#,prefs);
49        self.string_for_session.push_str(&text);
50        self.string_for_session.push('}');
51        self
52    }
53    ///Option to increase the logging verbosity of geckodriver
54    pub fn add_log(&mut self, log_level:LogLevel)->&mut Self{
55        if self.string_for_session.contains("log"){panic!("The options already contain log");}
56        self.string_for_session.pop();
57        let lev_to_str = match log_level{
58            LogLevel::Trace=>"trace",
59            LogLevel::Debug=>"debug",
60            LogLevel::Config=>"config",
61            LogLevel::Info=>"info",
62            LogLevel::Warn=>"warn",
63            LogLevel::Error=>"error",
64            LogLevel::Fatal=>"fatal"
65        };
66        let text = format!(r#""log":{{"level":"{}"}},"#,lev_to_str);
67        self.string_for_session.push_str(&text);
68        self.string_for_session.push('}');
69        self
70    }
71    ///Map of environment variable name to environment variable value
72    pub fn add_env(&mut self,env_vars: HashMap<&str,&str>)->&mut Self{
73        if self.string_for_session.contains("env"){panic!("The options already contain env vars");}
74        self.string_for_session.pop();
75        let mut temp_string = String::from("\"env\":{");
76        for i in env_vars{
77            let temp = format!(r#""{}":"{}","#,i.0,i.1);
78            temp_string.push_str(&temp);
79        }
80        temp_string.pop();
81        temp_string.push('}');
82        temp_string.push(',');
83        self.string_for_session.push_str(&temp_string);
84        self.string_for_session.push('}');
85        self
86    }
87}
88pub enum LogLevel{
89    Trace,
90    Debug,
91    Config,
92    Info,
93    Warn,
94    Error,
95    Fatal
96}
97
98mod firefox_tests{
99    use super::*;
100    #[test]
101    fn firef_opts() {
102        let map = r#"{"one":2,"two":"two_val"}"#;
103        let mut ff = FirefoxOptions::new();
104        ff.add_binary("C\\Users\\Me");
105        ff.add_prefs(map);
106        ff.add_args(vec!["-headless","-devtools"]);
107        ff.add_log(LogLevel::Error);
108        let mut m = HashMap::new();
109        m.insert("first var","first var val");
110        ff.add_env(m);
111        let x = r#""moz:firefoxOptions":{"binary":"C\Users\Me","prefs":{"one":2,"two":"two_val"},"args":["-headless","-devtools"],"log":{"level":"error"},"env":{"first var":"first var val"},}"#;
112        assert_eq!(x,ff.string_for_session);
113    }
114}