1
1
import json
2
2
import time
3
- from typing import Dict , List , Optional
3
+ from typing import Any , Dict , List , Optional
4
4
5
5
from lavague .drivers .selenium .node import SeleniumNode
6
6
from lavague .drivers .selenium .prompt import SELENIUM_PROMPT_TEMPLATE
40
40
from selenium .webdriver .remote .webelement import WebElement
41
41
from selenium .webdriver .support .ui import WebDriverWait
42
42
from selenium .webdriver .chrome .service import Service
43
-
43
+ from lavague . core . types import RemoteMethodCall , ElementMethod
44
44
45
45
class SeleniumDriver (BaseDriver [SeleniumNode ]):
46
46
driver : WebDriver
@@ -315,6 +315,10 @@ def wait_for_idle(self):
315
315
f"Waited { total_elapsed } s for browser being idle ({ elapsed } for network + { total_elapsed - elapsed } for DOM)"
316
316
)
317
317
318
+ def get_current_tab_title (self ) -> str :
319
+ """Get the title of the current tab"""
320
+ return self .driver .title
321
+
318
322
def get_capability (self ) -> str :
319
323
"""Prompt to explain the llm which style of code he should output and which variables and imports he should expect"""
320
324
return SELENIUM_PROMPT_TEMPLATE
@@ -377,3 +381,64 @@ def switch_frame(self, xpath: str) -> None:
377
381
378
382
def switch_parent_frame (self ) -> None :
379
383
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