browser_use/tools/
press_key.rs

1use crate::error::{BrowserError, Result};
2use crate::tools::{Tool, ToolContext, ToolResult};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6/// Parameters for the press_key tool
7#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
8pub struct PressKeyParams {
9    /// Name of the key to press (e.g., "Enter", "Tab", "Escape", "ArrowDown", "F1", etc.)
10    pub key: String,
11}
12
13/// Tool for pressing keyboard keys
14#[derive(Default)]
15pub struct PressKeyTool;
16
17impl Tool for PressKeyTool {
18    type Params = PressKeyParams;
19
20    fn name(&self) -> &str {
21        "press_key"
22    }
23
24    fn execute_typed(
25        &self,
26        params: PressKeyParams,
27        context: &mut ToolContext,
28    ) -> Result<ToolResult> {
29        context.session.tab()?.press_key(&params.key).map_err(|e| {
30            BrowserError::ToolExecutionFailed {
31                tool: "press_key".to_string(),
32                reason: e.to_string(),
33            }
34        })?;
35
36        Ok(ToolResult::success_with(serde_json::json!({
37            "key": params.key
38        })))
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_press_key_tool_metadata() {
48        let tool = PressKeyTool;
49        assert_eq!(tool.name(), "press_key");
50        let schema = tool.parameters_schema();
51        assert!(schema.is_object());
52    }
53
54    #[test]
55    fn test_press_key_params_various_keys() {
56        let test_keys = vec![
57            "Enter",
58            "Tab",
59            "Escape",
60            "Backspace",
61            "Delete",
62            "ArrowLeft",
63            "ArrowRight",
64            "ArrowUp",
65            "ArrowDown",
66            "Home",
67            "End",
68            "PageUp",
69            "PageDown",
70            "F1",
71            "F12",
72            "ShiftLeft",
73            "MetaLeft",
74            "Space",
75        ];
76
77        for key in test_keys {
78            let json = serde_json::json!({ "key": key });
79            let params: PressKeyParams = serde_json::from_value(json).unwrap();
80            assert_eq!(params.key, key);
81        }
82    }
83}