thirtyfour/common/capabilities/
firefox.rsuse std::ops::{Deref, DerefMut};
use std::path::Path;
use crate::Capabilities;
use crate::CapabilitiesHelper;
use serde::de::DeserializeOwned;
use serde::Serialize;
use serde_json::{from_value, json, to_value, Value};
use crate::error::WebDriverResult;
use crate::PageLoadStrategy;
#[derive(Debug, Clone, Serialize)]
#[serde(transparent)]
pub struct FirefoxCapabilities {
capabilities: Capabilities,
}
impl Default for FirefoxCapabilities {
fn default() -> Self {
let mut capabilities = Capabilities::new();
capabilities.insert("browserName".to_string(), json!("firefox"));
FirefoxCapabilities {
capabilities,
}
}
}
impl FirefoxCapabilities {
pub fn new() -> Self {
FirefoxCapabilities::default()
}
pub fn add_firefox_option<T>(&mut self, key: &str, value: T) -> WebDriverResult<()>
where
T: Serialize,
{
self.add_subkey("moz:firefoxOptions", key, value)
}
pub fn set_logging_prefs(&mut self, component: String, log_level: LoggingPrefsLogLevel) {
self.update("loggingPrefs", json!({ component: log_level }));
}
pub fn set_log_level(&mut self, log_level: LogLevel) -> WebDriverResult<()> {
self.add_firefox_option("log", json!({ "level": log_level }))
}
pub fn set_firefox_binary(&mut self, path: &Path) -> WebDriverResult<()> {
self.add("firefox_binary", path.to_string_lossy().to_string())
}
pub fn set_page_load_strategy(&mut self, strategy: PageLoadStrategy) -> WebDriverResult<()> {
self.add("pageLoadStrategy", strategy)
}
pub fn set_preferences(&mut self, preferences: FirefoxPreferences) -> WebDriverResult<()> {
self.add_firefox_option("prefs", preferences)
}
pub fn add_firefox_arg(&mut self, arg: &str) -> WebDriverResult<()> {
let mut args = self.get_args();
let arg_string = arg.to_string();
if !args.contains(&arg_string) {
args.push(arg_string);
}
self.add_firefox_option("args", to_value(args)?)
}
pub fn get_firefox_option<T>(&self, key: &str) -> T
where
T: DeserializeOwned + Default,
{
self.capabilities
.get("moz:firefoxOptions")
.and_then(|options| options.get(key))
.and_then(|option| from_value(option.clone()).ok())
.unwrap_or_default()
}
pub fn get_args(&self) -> Vec<String> {
self.get_firefox_option("args")
}
pub fn set_headless(&mut self) -> WebDriverResult<()> {
self.add_firefox_arg("--headless")
}
}
impl From<FirefoxCapabilities> for Capabilities {
fn from(caps: FirefoxCapabilities) -> Capabilities {
caps.capabilities
}
}
impl Deref for FirefoxCapabilities {
type Target = Capabilities;
fn deref(&self) -> &Self::Target {
&self.capabilities
}
}
impl DerefMut for FirefoxCapabilities {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.capabilities
}
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "lowercase")]
pub enum LogLevel {
Trace,
Debug,
Config,
Info,
Warn,
Error,
Fatal,
Default,
}
#[derive(Debug, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum LoggingPrefsLogLevel {
Off,
Severe,
Warning,
Info,
Config,
Fine,
Finer,
Finest,
All,
}
#[derive(Debug, Clone, Serialize, Default)]
#[serde(transparent)]
pub struct FirefoxPreferences {
preferences: serde_json::Map<String, Value>,
}
impl FirefoxPreferences {
pub fn new() -> Self {
FirefoxPreferences::default()
}
pub fn set<T>(&mut self, key: &str, value: T) -> WebDriverResult<()>
where
T: Serialize,
{
self.preferences.insert(key.into(), to_value(value)?);
Ok(())
}
pub fn unset(&mut self, key: &str) -> WebDriverResult<()> {
self.preferences.remove(key);
Ok(())
}
pub fn set_accept_untrusted_certs(&mut self, value: bool) -> WebDriverResult<()> {
self.set("webdriver_accept_untrusted_certs", value)
}
pub fn unset_accept_untrusted_certs(&mut self) -> WebDriverResult<()> {
self.unset("webdriver_accept_untrusted_certs")
}
pub fn set_assume_untrusted_issuer(&mut self, value: bool) -> WebDriverResult<()> {
self.set("webdriver_assume_untrusted_issuer", value)
}
pub fn unset_assume_untrusted_issuer(&mut self) -> WebDriverResult<()> {
self.unset("webdriver_assume_untrusted_issuer")
}
pub fn set_log_driver(&mut self, value: FirefoxProfileLogDriver) -> WebDriverResult<()> {
self.set("webdriver.log.driver", value)
}
pub fn unset_log_driver(&mut self) -> WebDriverResult<()> {
self.unset("webdriver.log.driver")
}
pub fn set_log_file(&mut self, value: String) -> WebDriverResult<()> {
self.set("webdriver.log.file", value)
}
pub fn unset_log_file(&mut self) -> WebDriverResult<()> {
self.unset("webdriver.log.file")
}
pub fn set_load_strategy(&mut self, value: String) -> WebDriverResult<()> {
self.set("webdriver.load.strategy", value)
}
pub fn unset_load_strategy(&mut self) -> WebDriverResult<()> {
self.unset("webdriver.load.strategy")
}
pub fn set_webdriver_port(&mut self, value: u16) -> WebDriverResult<()> {
self.set("webdriver_firefox_port", value)
}
pub fn unset_webdriver_port(&mut self) -> WebDriverResult<()> {
self.unset("webdriver_firefox_port")
}
pub fn set_user_agent(&mut self, value: String) -> WebDriverResult<()> {
self.set("general.useragent.override", value)
}
pub fn unset_user_agent(&mut self) -> WebDriverResult<()> {
self.unset("general.useragent.override")
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum FirefoxProfileLogDriver {
Debug,
Info,
Warning,
Error,
Off,
}