browser_use/tools/
navigate.rs

1use crate::error::Result;
2use crate::tools::{Tool, ToolContext, ToolResult};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6/// Parameters for the navigate tool
7#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
8pub struct NavigateParams {
9    /// URL to navigate to
10    pub url: String,
11
12    /// Wait for navigation to complete (default: true)
13    #[serde(default = "default_wait")]
14    pub wait_for_load: bool,
15}
16
17fn default_wait() -> bool {
18    true
19}
20
21/// Tool for navigating to a URL
22#[derive(Default)]
23pub struct NavigateTool;
24
25impl Tool for NavigateTool {
26    type Params = NavigateParams;
27
28    fn name(&self) -> &str {
29        "navigate"
30    }
31
32    fn execute_typed(
33        &self,
34        params: NavigateParams,
35        context: &mut ToolContext,
36    ) -> Result<ToolResult> {
37        // Navigate to URL
38        context.session.navigate(&params.url)?;
39
40        // Wait for navigation if requested
41        if params.wait_for_load {
42            context.session.wait_for_navigation()?;
43        }
44
45        Ok(ToolResult::success_with(serde_json::json!({
46            "url": params.url,
47            "waited": params.wait_for_load
48        })))
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    use super::*;
55
56    #[test]
57    fn test_navigate_params_default() {
58        let json = serde_json::json!({
59            "url": "https://example.com"
60        });
61
62        let params: NavigateParams = serde_json::from_value(json).unwrap();
63        assert_eq!(params.url, "https://example.com");
64        assert!(params.wait_for_load);
65    }
66
67    #[test]
68    fn test_navigate_params_explicit_wait() {
69        let json = serde_json::json!({
70            "url": "https://example.com",
71            "wait_for_load": false
72        });
73
74        let params: NavigateParams = serde_json::from_value(json).unwrap();
75        assert_eq!(params.url, "https://example.com");
76        assert!(!params.wait_for_load);
77    }
78
79    #[test]
80    fn test_navigate_tool_metadata() {
81        let tool = NavigateTool;
82        assert_eq!(tool.name(), "navigate");
83        let schema = tool.parameters_schema();
84        assert!(schema.is_object());
85    }
86}