browser_use/tools/
press_key.rs1use crate::error::{BrowserError, Result};
2use crate::tools::{Tool, ToolContext, ToolResult};
3use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
8pub struct PressKeyParams {
9 pub key: String,
11}
12
13#[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(¶ms.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}