browser_use/tools/
navigate.rs1use crate::error::Result;
2use crate::tools::{Tool, ToolContext, ToolResult};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
8pub struct NavigateParams {
9 pub url: String,
11
12 #[serde(default = "default_wait")]
14 pub wait_for_load: bool,
15}
16
17fn default_wait() -> bool {
18 true
19}
20
21#[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 context.session.navigate(¶ms.url)?;
39
40 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}