Skip to main content

browser_commander/core/
constants.rs

1//! Common constants used across the browser automation library.
2//!
3//! This module contains timing constants and Chrome arguments used for
4//! browser operations.
5
6use std::time::Duration;
7
8/// Common Chrome arguments used across both browser engines.
9///
10/// These arguments are used to configure Chrome/Chromium in a way that
11/// optimizes for automation and reduces user interruptions.
12pub const CHROME_ARGS: &[&str] = &[
13    "--disable-session-crashed-bubble",
14    "--hide-crash-restore-bubble",
15    "--disable-infobars",
16    "--password-store=basic",
17    "--no-first-run",
18    "--no-default-browser-check",
19    "--disable-crash-restore",
20];
21
22/// Timing constants for browser operations.
23///
24/// These durations are used throughout the library to control
25/// wait times, timeouts, and animation durations.
26#[derive(Debug, Clone, Copy)]
27pub struct Timing {
28    /// Wait time for scroll animations to complete.
29    pub scroll_animation_wait: Duration,
30    /// Default wait after scrolling to element.
31    pub default_wait_after_scroll: Duration,
32    /// Timeout for quick visibility checks.
33    pub visibility_check_timeout: Duration,
34    /// Default timeout for most operations.
35    pub default_timeout: Duration,
36    /// Default timeout for navigation operations.
37    pub navigation_timeout: Duration,
38    /// Default timeout for action verification.
39    pub verification_timeout: Duration,
40    /// Interval between verification retries.
41    pub verification_retry_interval: Duration,
42}
43
44impl Default for Timing {
45    fn default() -> Self {
46        Self {
47            scroll_animation_wait: Duration::from_millis(300),
48            default_wait_after_scroll: Duration::from_millis(1000),
49            visibility_check_timeout: Duration::from_millis(100),
50            default_timeout: Duration::from_millis(5000),
51            navigation_timeout: Duration::from_millis(30000),
52            verification_timeout: Duration::from_millis(3000),
53            verification_retry_interval: Duration::from_millis(100),
54        }
55    }
56}
57
58/// Default timing configuration.
59pub static TIMING: std::sync::LazyLock<Timing> = std::sync::LazyLock::new(Timing::default);
60
61#[cfg(test)]
62mod tests {
63    use super::*;
64
65    #[test]
66    fn chrome_args_is_not_empty() {
67        assert!(!CHROME_ARGS.is_empty());
68    }
69
70    #[test]
71    fn chrome_args_contains_expected_arguments() {
72        assert!(CHROME_ARGS.contains(&"--disable-infobars"));
73        assert!(CHROME_ARGS.contains(&"--password-store=basic"));
74        assert!(CHROME_ARGS.contains(&"--no-first-run"));
75        assert!(CHROME_ARGS.contains(&"--no-default-browser-check"));
76    }
77
78    #[test]
79    fn chrome_args_contains_crash_related_flags() {
80        assert!(CHROME_ARGS.contains(&"--disable-session-crashed-bubble"));
81        assert!(CHROME_ARGS.contains(&"--hide-crash-restore-bubble"));
82        assert!(CHROME_ARGS.contains(&"--disable-crash-restore"));
83    }
84
85    #[test]
86    fn chrome_args_has_at_least_5_arguments() {
87        assert!(CHROME_ARGS.len() >= 5);
88    }
89
90    #[test]
91    fn timing_default_values_are_reasonable() {
92        let timing = Timing::default();
93
94        // All timeouts should be positive
95        assert!(timing.scroll_animation_wait > Duration::ZERO);
96        assert!(timing.default_wait_after_scroll > Duration::ZERO);
97        assert!(timing.visibility_check_timeout > Duration::ZERO);
98        assert!(timing.default_timeout > Duration::ZERO);
99        assert!(timing.navigation_timeout > Duration::ZERO);
100        assert!(timing.verification_timeout > Duration::ZERO);
101        assert!(timing.verification_retry_interval > Duration::ZERO);
102
103        // Navigation timeout should be longer than default timeout
104        assert!(timing.navigation_timeout > timing.default_timeout);
105    }
106
107    #[test]
108    fn timing_scroll_animation_wait_is_300ms() {
109        let timing = Timing::default();
110        assert_eq!(timing.scroll_animation_wait, Duration::from_millis(300));
111    }
112
113    #[test]
114    fn timing_default_wait_after_scroll_is_1000ms() {
115        let timing = Timing::default();
116        assert_eq!(
117            timing.default_wait_after_scroll,
118            Duration::from_millis(1000)
119        );
120    }
121
122    #[test]
123    fn timing_visibility_check_timeout_is_100ms() {
124        let timing = Timing::default();
125        assert_eq!(timing.visibility_check_timeout, Duration::from_millis(100));
126    }
127
128    #[test]
129    fn timing_default_timeout_is_5000ms() {
130        let timing = Timing::default();
131        assert_eq!(timing.default_timeout, Duration::from_millis(5000));
132    }
133
134    #[test]
135    fn timing_navigation_timeout_is_30000ms() {
136        let timing = Timing::default();
137        assert_eq!(timing.navigation_timeout, Duration::from_millis(30000));
138    }
139}