Support KeyUp, KeyDown operator actions. Make coordinates into floats

This commit is contained in:
Debanjum
2025-05-08 15:18:48 -06:00
parent b279060e2c
commit c3bfb15fab
2 changed files with 40 additions and 15 deletions

View File

@@ -5,8 +5,8 @@ from pydantic import BaseModel
class Point(BaseModel):
x: int
y: int
x: float
y: float
class BaseAction(BaseModel):
@@ -15,32 +15,32 @@ class BaseAction(BaseModel):
class ClickAction(BaseAction):
type: Literal["click"] = "click"
x: int
y: int
x: float
y: float
button: Literal["left", "right", "middle", "wheel"] = "left"
modifiers: str = None
class DoubleClickAction(BaseAction):
type: Literal["double_click"] = "double_click"
x: int
y: int
x: float
y: float
class TripleClickAction(BaseAction):
type: Literal["triple_click"] = "triple_click"
x: int
y: int
x: float
y: float
class ScrollAction(BaseAction):
type: Literal["scroll"] = "scroll"
x: Optional[int] = None
y: Optional[int] = None
scroll_x: Optional[int] = None
scroll_y: Optional[int] = None
x: Optional[float] = None
y: Optional[float] = None
scroll_x: Optional[float] = None
scroll_y: Optional[float] = None
scroll_direction: Optional[Literal["up", "down", "left", "right"]] = None
scroll_amount: Optional[int] = 2
scroll_amount: Optional[float] = 2.0
class KeypressAction(BaseAction):
@@ -64,8 +64,8 @@ class ScreenshotAction(BaseAction):
class MoveAction(BaseAction):
type: Literal["move"] = "move"
x: int
y: int
x: float
y: float
class DragAction(BaseAction):
@@ -89,6 +89,16 @@ class HoldKeyAction(BaseAction):
duration: float = 1.0
class KeyUpAction(BaseAction):
type: Literal["key_up"] = "key_up"
key: str
class KeyDownAction(BaseAction):
type: Literal["key_down"] = "key_down"
key: str
class CursorPositionAction(BaseAction):
type: Literal["cursor_position"] = "cursor_position"
@@ -123,7 +133,10 @@ OperatorAction = Union[
MouseDownAction,
MouseUpAction,
HoldKeyAction,
KeyDownAction,
KeyUpAction,
CursorPositionAction,
GotoAction,
BackAction,
RequestUserAction,
]

View File

@@ -243,6 +243,18 @@ class BrowserEnvironment(Environment):
output = f"Held key{'s' if len(keys) > 1 else ''} {keys_to_parse} for {duration} seconds"
logger.debug(f"Action: {action.type} '{keys_to_parse}' for {duration}s")
case "key_down":
key = action.key
await self.page.keyboard.down(key)
output = f"Key down: {key}"
logger.debug(f"Action: {action.type} {key}")
case "key_up":
key = action.key
await self.page.keyboard.up(key)
output = f"Key up: {key}"
logger.debug(f"Action: {action.type} {key}")
case "cursor_position":
# Playwright doesn't directly expose mouse position easily without JS injection
# Returning a placeholder for now