Skip to content

Commit 297106c

Browse files
author
dhuynh-hash
committed
Added Remote Web elements
1 parent 25ff3c8 commit 297106c

File tree

2 files changed

+78
-2
lines changed
  • lavague-integrations/drivers/lavague-drivers-selenium/lavague/drivers/selenium
  • lavague-sdk/lavague/sdk/base_driver

2 files changed

+78
-2
lines changed

lavague-integrations/drivers/lavague-drivers-selenium/lavague/drivers/selenium/base.py

+67-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import json
22
import time
3-
from typing import Dict, List, Optional
3+
from typing import Any, Dict, List, Optional
44

55
from lavague.drivers.selenium.node import SeleniumNode
66
from lavague.drivers.selenium.prompt import SELENIUM_PROMPT_TEMPLATE
@@ -40,7 +40,7 @@
4040
from selenium.webdriver.remote.webelement import WebElement
4141
from selenium.webdriver.support.ui import WebDriverWait
4242
from selenium.webdriver.chrome.service import Service
43-
43+
from lavague.core.types import RemoteMethodCall, ElementMethod
4444

4545
class 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")

lavague-sdk/lavague/sdk/base_driver/base.py

+11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from datetime import datetime
55
from typing import Dict, Generic, List, Optional, TypeVar
66

7+
from lavague.core.types import RemoteMethodCall
78
from lavague.sdk.action.navigation import NavigationCommand, NavigationOutput
89
from lavague.sdk.base_driver.interaction import (
910
InteractionType,
@@ -69,6 +70,11 @@ def execute(self, action: NavigationOutput) -> None:
6970
)
7071
self.wait_for_idle()
7172

73+
@abstractmethod
74+
def execute_element_method(self, remote_call: RemoteMethodCall) -> None:
75+
"""Execute a method on an element"""
76+
pass
77+
7278
@abstractmethod
7379
def destroy(self) -> None:
7480
"""Cleanly destroy the underlying driver"""
@@ -88,6 +94,11 @@ def get(self, url: str) -> None:
8894
"""Navigate to the url"""
8995
pass
9096

97+
@abstractmethod
98+
def get_current_tab_title(self) -> str:
99+
"""Get the title of the current tab"""
100+
pass
101+
91102
@abstractmethod
92103
def back(self) -> None:
93104
"""Navigate back, raise CannotBackException if history root is reached"""

0 commit comments

Comments
 (0)