1212 PressKeysActionParams ,
1313 MoveMouseActionParams ,
1414 ScreenshotActionParams ,
15+ CursorPositionActionParams ,
16+ ScrollAtCursorActionParams ,
1517 ScrollActionParams ,
1618 TypeTextActionParams ,
1719 Coordinate ,
3840 ComputerAction .MOVE_MOUSE .value : MoveMouseActionParams ,
3941 ComputerAction .PRESS_KEYS .value : PressKeysActionParams ,
4042 ComputerAction .SCREENSHOT .value : ScreenshotActionParams ,
43+ ComputerAction .CURSOR_POSITION .value : CursorPositionActionParams ,
4144 ComputerAction .SCROLL .value : ScrollActionParams ,
4245 ComputerAction .TYPE_TEXT .value : TypeTextActionParams ,
4346 ComputerAction .GET_CLIPBOARD_TEXT .value : GetClipboardTextActionParams ,
4750
4851
4952def _action_param_model (params ):
53+ if isinstance (params , ScrollAtCursorActionParams ):
54+ return ScrollAtCursorActionParams
55+
5056 for model in _ACTION_PARAM_MODELS .values ():
5157 if isinstance (params , model ):
5258 return model
@@ -56,6 +62,8 @@ def _action_param_model(params):
5662 if isinstance (action , ComputerAction ):
5763 action = action .value
5864 model = _ACTION_PARAM_MODELS .get (action )
65+ if model is ScrollActionParams and "x" not in params and "y" not in params :
66+ return ScrollAtCursorActionParams
5967 if model is not None :
6068 return model
6169
@@ -71,18 +79,13 @@ async def _execute_request(
7179 session : Union [SessionDetail , str ],
7280 params : Union [ComputerActionParamsDict , ComputerActionParams ],
7381 ) -> ComputerActionResponse :
82+ payload = dump_request (params , _action_param_model (params ), name = "params" )
7483 if isinstance (session , str ):
7584 session = await self ._client .sessions .get (session )
7685
7786 if not session .computer_action_endpoint :
7887 raise ValueError ("Computer action endpoint not available for this session" )
7988
80- payload = dump_request (
81- params ,
82- _action_param_model (params ),
83- name = "params" ,
84- )
85-
8689 response = await self ._client .transport .post (
8790 session .computer_action_endpoint ,
8891 data = payload ,
@@ -97,12 +100,14 @@ async def click(
97100 button : ComputerActionMouseButton = "left" ,
98101 num_clicks : int = 1 ,
99102 return_screenshot : bool = False ,
103+ keys : Optional [List [str ]] = None ,
100104 ) -> ComputerActionResponse :
101105 params = ClickActionParams (
102106 x = x ,
103107 y = y ,
104108 button = button ,
105109 num_clicks = num_clicks ,
110+ keys = keys ,
106111 return_screenshot = return_screenshot ,
107112 )
108113 return await self ._execute_request (session , params )
@@ -123,6 +128,14 @@ async def screenshot(
123128 params = ScreenshotActionParams ()
124129 return await self ._execute_request (session , params )
125130
131+ async def cursor_position (
132+ self ,
133+ session : Union [SessionDetail , str ],
134+ return_screenshot : bool = False ,
135+ ) -> ComputerActionResponse :
136+ params = CursorPositionActionParams (return_screenshot = return_screenshot )
137+ return await self ._execute_request (session , params )
138+
126139 async def press_keys (
127140 self ,
128141 session : Union [SessionDetail , str ],
@@ -169,13 +182,15 @@ async def drag(
169182 session : Union [SessionDetail , str ],
170183 path : List [Union [CoordinateDict , Coordinate ]],
171184 return_screenshot : bool = False ,
185+ keys : Optional [List [str ]] = None ,
172186 ) -> ComputerActionResponse :
173187 params = DragActionParams (
174188 path = [
175189 coerce_request (coordinate , Coordinate , name = "coordinate" )
176190 for coordinate in path
177191 ],
178192 return_screenshot = return_screenshot ,
193+ keys = keys ,
179194 )
180195 return await self ._execute_request (session , params )
181196
@@ -197,12 +212,30 @@ async def scroll(
197212 scroll_x : int ,
198213 scroll_y : int ,
199214 return_screenshot : bool = False ,
215+ keys : Optional [List [str ]] = None ,
200216 ) -> ComputerActionResponse :
201217 params = ScrollActionParams (
202218 x = x ,
203219 y = y ,
204220 scroll_x = scroll_x ,
205221 scroll_y = scroll_y ,
222+ keys = keys ,
223+ return_screenshot = return_screenshot ,
224+ )
225+ return await self ._execute_request (session , params )
226+
227+ async def scroll_at_cursor (
228+ self ,
229+ session : Union [SessionDetail , str ],
230+ scroll_x : int = 0 ,
231+ scroll_y : int = 0 ,
232+ return_screenshot : bool = False ,
233+ keys : Optional [List [str ]] = None ,
234+ ) -> ComputerActionResponse :
235+ params = ScrollAtCursorActionParams (
236+ scroll_x = scroll_x ,
237+ scroll_y = scroll_y ,
238+ keys = keys ,
206239 return_screenshot = return_screenshot ,
207240 )
208241 return await self ._execute_request (session , params )
0 commit comments