Browser-Use-mcp / browser /actions.py
diamond-in's picture
Update browser/actions.py
4424752 verified
"""
Basic browser actions like click, fill, navigate
"""
import time
import logging
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from browser.driver import get_driver, cleanup_driver
from config.settings import DEFAULT_EXPLICIT_WAIT
logger = logging.getLogger(__name__)
def browse_and_extract(url: str, selector: str = "body", use_persistent: bool = False) -> str:
"""Browse URL and extract text from selector"""
driver = None
try:
driver = get_driver(url, use_persistent)
# Wait for element to be present
wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
text = elem.text
logger.info(f"Extracted {len(text)} characters")
return text
except Exception as e:
logger.error(f"Error in browse_and_extract: {e}")
return f"Error: {e}"
finally:
cleanup_driver(driver, use_persistent)
def screenshot(url: str, full_page: bool = False, use_persistent: bool = False) -> str:
"""Take screenshot of URL"""
driver = None
try:
driver = get_driver(url, use_persistent)
# Wait for page load
time.sleep(2)
path = "/tmp/screenshot.png"
if full_page:
# Get full page dimensions
total_height = driver.execute_script("return document.body.scrollHeight")
driver.set_window_size(1920, total_height)
time.sleep(1)
driver.save_screenshot(path)
logger.info(f"Screenshot saved to: {path}")
return path
except Exception as e:
logger.error(f"Error in screenshot: {e}")
return None
finally:
cleanup_driver(driver, use_persistent)
def click(url: str, selector: str, use_persistent: bool = False) -> str:
"""Click element on page"""
driver = None
try:
driver = get_driver(url, use_persistent)
wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
elem = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, selector)))
elem.click()
time.sleep(2)
title = driver.title
current_url = driver.current_url
return f"Clicked {selector}\nNew title: {title}\nCurrent URL: {current_url}"
except Exception as e:
logger.error(f"Error in click: {e}")
return f"Error: {e}"
finally:
cleanup_driver(driver, use_persistent)
def fill(url: str, selector: str, text: str, use_persistent: bool = False) -> str:
"""Fill text into form field"""
driver = None
try:
driver = get_driver(url, use_persistent)
wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
elem.clear()
elem.send_keys(text)
return f"Filled {selector} with '{text}'"
except Exception as e:
logger.error(f"Error in fill: {e}")
return f"Error: {e}"
finally:
cleanup_driver(driver, use_persistent)
def submit_form(url: str, form_data: str, submit_button: str = "", use_persistent: bool = False) -> str:
"""Fill and submit a form with multiple fields"""
driver = None
try:
driver = get_driver(url, use_persistent)
# Parse form data (expected format: "selector1:value1;selector2:value2")
wait = WebDriverWait(driver, DEFAULT_EXPLICIT_WAIT)
filled_fields = []
for field in form_data.split(";"):
if ":" in field:
selector, value = field.split(":", 1)
selector = selector.strip()
value = value.strip()
elem = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, selector)))
elem.clear()
elem.send_keys(value)
filled_fields.append(f"{selector}={value}")
# Submit form
if submit_button:
submit_elem = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, submit_button)))
submit_elem.click()
else:
# Try to find and submit the first form
driver.execute_script("document.forms[0].submit();")
time.sleep(2)
new_url = driver.current_url
return f"Form submitted\nFilled fields: {', '.join(filled_fields)}\nNew URL: {new_url}"
except Exception as e:
logger.error(f"Error in submit_form: {e}")
return f"Error: {e}"
finally:
cleanup_driver(driver, use_persistent)
def execute_js(url: str, script: str, use_persistent: bool = False) -> str:
"""Execute JavaScript on page"""
driver = None
try:
driver = get_driver(url, use_persistent)
result = driver.execute_script(script)
return f"Script executed. Result: {result}"
except Exception as e:
logger.error(f"Error in execute_js: {e}")
return f"Error: {e}"
finally:
cleanup_driver(driver, use_persistent)