File size: 2,425 Bytes
3064cc7
 
 
 
8430937
 
 
 
0c5cccf
 
 
 
 
8430937
0c5cccf
8430937
 
 
3064cc7
0c5cccf
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
from smolagents.tools import Tool
from helium import write, press, click, Text, Link, S
from selenium.webdriver.common.keys import Keys

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

    def __init__(self, driver):
        self.driver = driver

    def forward(self, selector=None, text=None, action="click", input_text=None, key=None):
        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)}"