Spaces:
Running
Running
from smolagents.tools import Tool | |
from helium import scroll_down, scroll_up, get_driver | |
from selenium.webdriver.common.by import By | |
import logging | |
logger = logging.getLogger(__name__) | |
class ScrollPageTool(Tool): | |
name = "scroll_page" | |
description = "Scrolls the page to a specific element or by a number of pixels." | |
inputs = { | |
"selector": {"type": "string", "default": None, "nullable": True, "description": "CSS selector to scroll to"}, | |
"num_pixels": {"type": "integer", "default": 1200, "nullable": False, "description": "Number of pixels to scroll"}, | |
"direction": {"type": "string", "default": "down", "nullable": False, "description": "Scroll direction: 'down' or 'up'"} | |
} | |
output_type = "string" | |
def __init__(self, driver): | |
super().__init__() | |
self.driver = driver | |
self.is_initialized = self.driver is not None | |
logger.debug(f"ScrollPageTool initialized: is_initialized={self.is_initialized}") | |
def forward(self, selector=None, num_pixels=1200, direction="down"): | |
if not self.is_initialized: | |
return "Error: ScrollPageTool is not initialized" | |
try: | |
if selector: | |
element = self.driver.find_element(By.CSS_SELECTOR, selector) | |
self.driver.execute_script("arguments[0].scrollIntoView(true);", element) | |
return f"Scrolled to element with selector {selector}" | |
else: | |
if direction == "down": | |
scroll_down(num_pixels) | |
return f"Scrolled down {num_pixels} pixels" | |
elif direction == "up": | |
scroll_up(num_pixels) | |
return f"Scrolled up {num_pixels} pixels" | |
else: | |
return f"Invalid direction: {direction}" | |
except Exception as e: | |
return f"Failed to scroll: {str(e)}" |