Spaces:
Paused
Paused
| """ | |
| 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) |