thirtyfour/common/capabilities/
chrome.rsuse crate::error::WebDriverResult;
use crate::Capabilities;
use crate::CapabilitiesHelper;
use serde::de::DeserializeOwned;
use serde::Serialize;
use serde_json::{from_value, json, to_value};
use std::ops::{Deref, DerefMut};
use std::path::Path;
#[derive(Debug, Clone, Serialize)]
#[serde(transparent)]
pub struct ChromeCapabilities {
capabilities: Capabilities,
}
impl Default for ChromeCapabilities {
fn default() -> Self {
let mut capabilities = Capabilities::new();
capabilities.insert("browserName".to_string(), json!("chrome"));
ChromeCapabilities {
capabilities,
}
}
}
impl ChromeCapabilities {
pub fn new() -> Self {
ChromeCapabilities::default()
}
pub fn add_chrome_option<T>(&mut self, key: &str, value: T) -> WebDriverResult<()>
where
T: Serialize,
{
self.add_subkey("goog:chromeOptions", key, value)
}
pub fn get_chrome_option<T>(&self, key: &str) -> T
where
T: DeserializeOwned + Default,
{
self.capabilities
.get("goog:chromeOptions")
.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_chrome_option("args")
}
pub fn get_extensions(&self) -> Vec<String> {
self.get_chrome_option("extensions")
}
pub fn get_binary(&self) -> String {
self.get_chrome_option("binary")
}
pub fn set_binary(&mut self, path: &str) -> WebDriverResult<()> {
self.add_chrome_option("binary", path)
}
pub fn get_debugger_address(&self) -> String {
self.get_chrome_option("debuggerAddress")
}
pub fn set_debugger_address(&mut self, address: &str) -> WebDriverResult<()> {
self.add_chrome_option("debuggerAddress", address)
}
pub fn add_chrome_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_chrome_option("args", to_value(args)?)
}
pub fn remove_chrome_arg(&mut self, arg: &str) -> WebDriverResult<()> {
let mut args = self.get_args();
if args.is_empty() {
Ok(())
} else {
args.retain(|v| v != arg);
self.add_chrome_option("args", to_value(args)?)
}
}
pub fn add_encoded_extension(&mut self, extension_base64: &str) -> WebDriverResult<()> {
let mut extensions = self.get_extensions();
let ext_string = extension_base64.to_string();
if !extensions.contains(&ext_string) {
extensions.push(ext_string);
}
self.add_chrome_option("extensions", to_value(extensions)?)
}
pub fn remove_encoded_extension(&mut self, extension_base64: &str) -> WebDriverResult<()> {
let mut extensions = self.get_extensions();
if extensions.is_empty() {
Ok(())
} else {
extensions.retain(|v| v != extension_base64);
self.add_chrome_option("extensions", to_value(extensions)?)
}
}
pub fn add_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> {
let contents = std::fs::read(crx_file)?;
let b64_contents = base64::encode(contents);
self.add_encoded_extension(&b64_contents)
}
pub fn remove_extension(&mut self, crx_file: &Path) -> WebDriverResult<()> {
let contents = std::fs::read(crx_file)?;
let b64_contents = base64::encode(contents);
self.remove_encoded_extension(&b64_contents)
}
pub fn set_headless(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--headless")
}
pub fn unset_headless(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--headless")
}
pub fn set_disable_web_security(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--disable-web-security")
}
pub fn unset_disable_web_security(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--disable-web-security")
}
pub fn set_ignore_certificate_errors(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--ignore-certificate-errors")
}
pub fn unset_ignore_certificate_errors(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--ignore-certificate-errors")
}
pub fn set_no_sandbox(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--no-sandbox")
}
pub fn unset_no_sandbox(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--no-sandbox")
}
pub fn set_disable_gpu(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--disable-gpu")
}
pub fn unset_disable_gpu(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--disable-gpu")
}
pub fn set_disable_dev_shm_usage(&mut self) -> WebDriverResult<()> {
self.add_chrome_arg("--disable-dev-shm-usage")
}
pub fn unset_disable_dev_shm_usage(&mut self) -> WebDriverResult<()> {
self.remove_chrome_arg("--disable-dev-shm-usage")
}
}
impl From<ChromeCapabilities> for Capabilities {
fn from(caps: ChromeCapabilities) -> Capabilities {
caps.capabilities
}
}
impl Deref for ChromeCapabilities {
type Target = Capabilities;
fn deref(&self) -> &Self::Target {
&self.capabilities
}
}
impl DerefMut for ChromeCapabilities {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.capabilities
}
}