File size: 2,876 Bytes
3064cc7
 
 
b6c2c27
 
 
3064cc7
8430937
 
 
 
618b1eb
 
 
 
 
8430937
0c5cccf
8430937
 
b6c2c27
8430937
b6c2c27
 
3064cc7
0c5cccf
b6c2c27
 
8430937
 
 
 
 
 
 
 
3064cc7
8430937
3064cc7
8430937
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from smolagents.tools import Tool
from helium import write, press, click, Text, Link, S
from selenium.webdriver.common.keys import Keys
import logging

logger = logging.getLogger(__name__)

class InteractElementTool(Tool):
    name = "interact_element"
    description = "Interacts with a web element (click, fill text, press keys)."
    inputs = {
        "selector": {"type": "string", "default": None, "nullable": True, "description": "CSS selector to target element"},
        "text": {"type": "string", "default": None, "nullable": True, "description": "Text to locate element"},
        "action": {"type": "string", "default": "click", "nullable": False, "description": "Action: 'click', 'fill', or 'press'"},
        "input_text": {"type": "string", "default": None, "nullable": True, "description": "Text to input for fill action"},
        "key": {"type": "string", "default": None, "nullable": True, "description": "Key to press (e.g., 'ENTER')"}
    }
    output_type = "string"

    def __init__(self, driver):
        super().__init__()
        self.driver = driver
        self.is_initialized = self.driver is not None  # Check if driver is valid
        logger.debug(f"InteractElementTool initialized: is_initialized={self.is_initialized}")

    def forward(self, selector=None, text=None, action="click", input_text=None, key=None):
        if not self.is_initialized:
            return "Error: InteractElementTool is not initialized"
        try:
            if selector:
                element = self.driver.find_element(By.CSS_SELECTOR, selector)
            elif text:
                if action == "click" and Link(text).exists():
                    element = Link(text).web_element
                else:
                    element = Text(text).web_element
            else:
                return "Must provide selector or text"

            if action == "click":
                click(element)
                return f"Clicked element with {selector or text}"
            elif action == "fill":
                if not input_text:
                    return "input_text required for fill action"
                write(input_text, into=element)
                return f"Filled {input_text} into element with {selector or text}"
            elif action == "press":
                if not key:
                    return "key required for press action"
                key_map = {"ENTER": Keys.ENTER, "TAB": Keys.TAB, "RETURN": Keys.RETURN}
                if key.upper() in key_map:
                    element.send_keys(key_map[key.upper()])
                else:
                    press(key)
                return f"Pressed {key} on element with {selector or text}"
            else:
                return f"Unknown action: {action}"
        except Exception as e:
            return f"Failed to interact with element {selector or text}: {str(e)}"