@@ -195,3 +195,51 @@ def zoom_webpage(page: Page, zoom_factor: float = 1.5):
195195
196196 page .evaluate (f"document.documentElement.style.zoom='{ zoom_factor * 100 } %'" )
197197 return page
198+
199+
200+ def parse_func_call_string (call_str : str ) -> Tuple [Optional [str ], Optional [Tuple [list , dict ]]]:
201+ """
202+ Parse a function call string and extract the function name and arguments.
203+
204+ Args:
205+ call_str (str): A string like "mouse_click(100, 200)" or "mouse_drag_and_drop(x=10, y=20)"
206+
207+ Returns:
208+ Tuple (func_name, (args, kwargs)), or (None, None) if parsing fails
209+ """
210+ import ast
211+
212+ try :
213+ tree = ast .parse (call_str .strip (), mode = "eval" )
214+ if not isinstance (tree .body , ast .Call ):
215+ return None , None
216+
217+ call_node = tree .body
218+
219+ # Function name
220+ if isinstance (call_node .func , ast .Name ):
221+ func_name = call_node .func .id
222+ else :
223+ return None , None
224+
225+ # Positional arguments
226+ args = []
227+ for arg in call_node .args :
228+ try :
229+ args .append (ast .literal_eval (arg ))
230+ except (ValueError , TypeError ):
231+ return None , None
232+
233+ # Keyword arguments
234+ kwargs = {}
235+ for kw in call_node .keywords :
236+ try :
237+ kwargs [kw .arg ] = ast .literal_eval (kw .value )
238+ except (ValueError , TypeError ):
239+ return None , None
240+
241+ return func_name , (args , kwargs )
242+
243+ except (SyntaxError , ValueError , TypeError ):
244+ return None , None
245+
0 commit comments