use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BrowserConfig {
pub webdriver_url: String,
pub browser: BrowserType,
pub headless: bool,
pub viewport_width: u32,
pub viewport_height: u32,
pub page_load_timeout_secs: u64,
pub script_timeout_secs: u64,
pub implicit_wait_secs: u64,
pub user_agent: Option<String>,
pub browser_args: Vec<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum BrowserType {
Chrome,
Firefox,
Safari,
Edge,
}
impl Default for BrowserConfig {
fn default() -> Self {
Self {
webdriver_url: "http://localhost:4444".to_string(),
browser: BrowserType::Chrome,
headless: true,
viewport_width: 1920,
viewport_height: 1080,
page_load_timeout_secs: 30,
script_timeout_secs: 30,
implicit_wait_secs: 10,
user_agent: None,
browser_args: Vec::new(),
}
}
}
impl BrowserConfig {
pub fn new() -> Self {
Self::default()
}
pub fn webdriver_url(mut self, url: impl Into<String>) -> Self {
self.webdriver_url = url.into();
self
}
pub fn browser(mut self, browser: BrowserType) -> Self {
self.browser = browser;
self
}
pub fn headless(mut self, headless: bool) -> Self {
self.headless = headless;
self
}
pub fn viewport(mut self, width: u32, height: u32) -> Self {
self.viewport_width = width;
self.viewport_height = height;
self
}
pub fn page_load_timeout(mut self, secs: u64) -> Self {
self.page_load_timeout_secs = secs;
self
}
pub fn user_agent(mut self, ua: impl Into<String>) -> Self {
self.user_agent = Some(ua.into());
self
}
pub fn add_arg(mut self, arg: impl Into<String>) -> Self {
self.browser_args.push(arg.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = BrowserConfig::default();
assert_eq!(config.webdriver_url, "http://localhost:4444");
assert!(config.headless);
assert_eq!(config.viewport_width, 1920);
}
#[test]
fn test_builder() {
let config =
BrowserConfig::new().browser(BrowserType::Firefox).headless(false).viewport(1280, 720);
assert_eq!(config.browser, BrowserType::Firefox);
assert!(!config.headless);
assert_eq!(config.viewport_width, 1280);
}
}