Spaces:
Running
Running
from smolagents.tools import Tool | |
from helium import write, press, click, Text, Link, S | |
from selenium.webdriver.common.keys import Keys | |
def interact_element(driver, selector=None, text=None, action="click", input_text=None, key=None): | |
""" | |
Interact with a web element (click, fill text, press keys). | |
Args: | |
driver: Selenium WebDriver instance | |
selector (str): CSS selector to target the element (optional) | |
text (str): Text to locate the element (optional, for Helium) | |
action (str): Action to perform ('click', 'fill', 'press') (default: 'click') | |
input_text (str): Text to input if action='fill' (optional) | |
key (str): Key to press if action='press' (e.g., 'ENTER') (optional) | |
Returns: | |
str: Result of the interaction | |
""" | |
try: | |
if selector: | |
element = 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)}" | |
# Register the tool | |
tool = Tool( | |
name="interact_element", | |
description="Interacts with a web element (click, fill text, press keys).", | |
inputs={ | |
"selector": {"type": "str", "default": None, "description": "CSS selector to target element"}, | |
"text": {"type": "str", "default": None, "description": "Text to locate element"}, | |
"action": {"type": "str", "default": "click", "description": "Action: 'click', 'fill', or 'press'"}, | |
"input_text": {"type": "str", "default": None, "description": "Text to input for fill action"}, | |
"key": {"type": "str", "default": None, "description": "Key to press (e.g., 'ENTER')"} | |
}, | |
output_type="str", | |
function=interact_element | |
) |