11import json
22import time
3- from typing import Dict , List , Optional
3+ from typing import Any , Dict , List , Optional
44
55from lavague .drivers .selenium .node import SeleniumNode
66from lavague .drivers .selenium .prompt import SELENIUM_PROMPT_TEMPLATE
4040from selenium .webdriver .remote .webelement import WebElement
4141from selenium .webdriver .support .ui import WebDriverWait
4242from selenium .webdriver .chrome .service import Service
43-
43+ from lavague . core . types import RemoteMethodCall , ElementMethod
4444
4545class SeleniumDriver (BaseDriver [SeleniumNode ]):
4646 driver : WebDriver
@@ -315,6 +315,10 @@ def wait_for_idle(self):
315315 f"Waited { total_elapsed } s for browser being idle ({ elapsed } for network + { total_elapsed - elapsed } for DOM)"
316316 )
317317
318+ def get_current_tab_title (self ) -> str :
319+ """Get the title of the current tab"""
320+ return self .driver .title
321+
318322 def get_capability (self ) -> str :
319323 """Prompt to explain the llm which style of code he should output and which variables and imports he should expect"""
320324 return SELENIUM_PROMPT_TEMPLATE
@@ -377,3 +381,64 @@ def switch_frame(self, xpath: str) -> None:
377381
378382 def switch_parent_frame (self ) -> None :
379383 self .driver .switch_to .parent_frame ()
384+
385+ def execute_element_method (self , remote_call : RemoteMethodCall ) -> Any :
386+ """Execute a remote method call on a WebElement"""
387+ xpath = remote_call .xpath
388+ element : WebElement = self .resolve_xpath (xpath ).element
389+ args = remote_call .args
390+
391+ match remote_call .method :
392+ case ElementMethod .CLICK :
393+ return element .click ()
394+
395+ case ElementMethod .CLEAR :
396+ return element .clear ()
397+
398+ case ElementMethod .GET_ATTRIBUTE :
399+ return element .get_attribute (args ["name" ])
400+
401+ case ElementMethod .GET_PROPERTY :
402+ return element .get_property (args ["name" ])
403+
404+ case ElementMethod .IS_DISPLAYED :
405+ return element .is_displayed ()
406+
407+ case ElementMethod .IS_ENABLED :
408+ return element .is_enabled ()
409+
410+ case ElementMethod .IS_SELECTED :
411+ return element .is_selected ()
412+
413+ case ElementMethod .SCREENSHOT :
414+ return element .screenshot (args ["filename" ])
415+
416+ case ElementMethod .SEND_KEYS :
417+ return element .send_keys (* args ["value" ])
418+
419+ case ElementMethod .SUBMIT :
420+ return element .submit ()
421+
422+ case ElementMethod .VALUE_OF_CSS_PROPERTY :
423+ return element .value_of_css_property (args ["property_name" ])
424+
425+ case ElementMethod .GET_TEXT :
426+ return element .text
427+
428+ case ElementMethod .GET_TAG_NAME :
429+ return element .tag_name
430+
431+ case ElementMethod .GET_RECT :
432+ return element .rect
433+
434+ case ElementMethod .GET_ID :
435+ return element .id
436+
437+ case ElementMethod .GET_LOCATION :
438+ return element .location
439+
440+ case ElementMethod .GET_SIZE :
441+ return element .size
442+
443+ case _:
444+ raise NotImplementedError (f"Method { remote_call .method } not implemented" )
0 commit comments