Skip to main content
Glama

MCP Selenium WebDriver

by Nixon-Suarez
  • Linux
  • Apple
examples.py29.6 kB
""" Ejemplos de uso del Servidor MCP Selenium WebDriver. Este archivo contiene ejemplos prácticos de cómo usar las diferentes funcionalidades del servidor MCP Selenium. """ import time import json from typing import Dict, Any class SeleniumMCPExamples: """Ejemplos de uso del servidor MCP Selenium.""" def __init__(self, mcp_client): """ Inicializa los ejemplos con un cliente MCP. Args: mcp_client: Cliente MCP conectado al servidor Selenium """ self.client = mcp_client async def example_basic_navigation(self) -> Dict[str, Any]: """Ejemplo básico de navegación web.""" print("=== Ejemplo: Navegación Básica ===") # 1. Iniciar navegador result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": { "headless": False, "window_width": 1280, "window_height": 720 } }) if not result["success"]: return {"error": "No se pudo iniciar el navegador"} session_id = result["session_id"] print(f"Navegador iniciado: {session_id}") try: # 2. Navegar a una página nav_result = await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://httpbin.org/forms/post" }) print(f"Navegación: {nav_result['message']}") # 3. Obtener información de la página page_info = await self.client.call_tool("get_page_info", { "session_id": session_id }) print(f"Título: {page_info['title']}") print(f"URL: {page_info['url']}") # 4. Tomar captura de pantalla screenshot = await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/basic_navigation.png" }) print(f"Captura guardada: {screenshot.get('file_path', 'N/A')}") return {"success": True, "session_id": session_id} except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def example_form_automation(self) -> Dict[str, Any]: """Ejemplo de automatización de formularios.""" print("=== Ejemplo: Automatización de Formularios ===") # Iniciar navegador con configuración stealth result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": { "headless": True, "incognito": True }, "detection_evasion": { "use_undetected_chrome": True, "stealth_mode": True } }) session_id = result["session_id"] try: # Navegar al formulario await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://httpbin.org/forms/post" }) # Aplicar modo stealth await self.client.call_tool("apply_stealth_mode", { "session_id": session_id }) # Llenar campo de email con escritura humana await self.client.call_tool("simulate_human_typing", { "session_id": session_id, "strategy": "css_selector", "value": "input[name='custname']", "text": "John Doe", "min_delay": 0.05, "max_delay": 0.12 }) # Delay aleatorio await self.client.call_tool("add_random_delay", { "min_seconds": 0.5, "max_seconds": 1.5 }) # Llenar campo de teléfono await self.client.call_tool("type_text", { "session_id": session_id, "strategy": "css_selector", "value": "input[name='custtel']", "text": "+1-555-123-4567" }) # Seleccionar radio button await self.client.call_tool("click_element", { "session_id": session_id, "strategy": "css_selector", "value": "input[value='large']" }) # Scroll humano hacia abajo await self.client.call_tool("scroll_like_human", { "session_id": session_id, "direction": "down", "distance": 200, "steps": 4 }) # Llenar textarea await self.client.call_tool("type_text", { "session_id": session_id, "strategy": "css_selector", "value": "textarea[name='comments']", "text": "This is an automated test comment." }) # Tomar captura antes de enviar await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/form_filled.png" }) # Enviar formulario await self.client.call_tool("click_element", { "session_id": session_id, "strategy": "css_selector", "value": "input[type='submit']" }) # Esperar respuesta await self.client.call_tool("add_random_delay", { "min_seconds": 2.0, "max_seconds": 4.0 }) # Verificar resultado final_info = await self.client.call_tool("get_page_info", { "session_id": session_id }) return { "success": True, "final_url": final_info["url"], "session_id": session_id } except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def example_element_interaction(self) -> Dict[str, Any]: """Ejemplo de interacciones avanzadas con elementos.""" print("=== Ejemplo: Interacciones con Elementos ===") result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": {"headless": False} }) session_id = result["session_id"] try: # Navegar a página con elementos interactivos await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://the-internet.herokuapp.com/drag_and_drop" }) # Buscar múltiples elementos elements = await self.client.call_tool("find_element", { "session_id": session_id, "strategy": "css_selector", "value": ".column", "multiple": True }) print(f"Elementos encontrados: {elements['elements_found']}") # Realizar drag and drop drag_result = await self.client.call_tool("perform_mouse_action", { "session_id": session_id, "action_type": "drag_and_drop", "strategy": "id", "value": "column-a", "target_strategy": "id", "target_value": "column-b" }) print(f"Drag and drop: {drag_result['message']}") # Tomar captura después del drag and drop await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/after_drag_drop.png" }) # Navegar a página con hover await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://the-internet.herokuapp.com/hovers" }) # Realizar hover sobre imagen hover_result = await self.client.call_tool("perform_mouse_action", { "session_id": session_id, "action_type": "hover", "strategy": "css_selector", "value": ".figure:first-child img" }) print(f"Hover: {hover_result['message']}") # Esperar a que aparezca el tooltip await self.client.call_tool("add_random_delay", { "min_seconds": 1.0, "max_seconds": 2.0 }) # Tomar captura con tooltip visible await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/hover_tooltip.png" }) return {"success": True, "session_id": session_id} except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def example_javascript_execution(self) -> Dict[str, Any]: """Ejemplo de ejecución de JavaScript.""" print("=== Ejemplo: Ejecución de JavaScript ===") result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": {"headless": True} }) session_id = result["session_id"] try: # Navegar a una página await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://httpbin.org/html" }) # Ejecutar JavaScript para obtener información js_result = await self.client.call_tool("execute_script", { "session_id": session_id, "script": """ return { title: document.title, url: window.location.href, userAgent: navigator.userAgent, viewport: { width: window.innerWidth, height: window.innerHeight }, elements: { h1Count: document.querySelectorAll('h1').length, pCount: document.querySelectorAll('p').length, linkCount: document.querySelectorAll('a').length } }; """ }) print("Información extraída con JavaScript:") print(json.dumps(js_result["result"], indent=2)) # Modificar la página con JavaScript modify_result = await self.client.call_tool("execute_script", { "session_id": session_id, "script": """ // Crear un nuevo elemento var newDiv = document.createElement('div'); newDiv.id = 'automation-marker'; newDiv.style.cssText = 'background: yellow; padding: 10px; margin: 10px; border: 2px solid red;'; newDiv.innerHTML = '<h2>¡Página modificada por automatización!</h2><p>Timestamp: ' + new Date().toISOString() + '</p>'; // Insertar al inicio del body document.body.insertBefore(newDiv, document.body.firstChild); return 'Elemento agregado exitosamente'; """ }) print(f"Modificación: {modify_result['result']}") # Tomar captura de la página modificada await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/modified_page.png" }) # Extraer texto del elemento creado text_result = await self.client.call_tool("execute_script", { "session_id": session_id, "script": """ var element = document.getElementById('automation-marker'); return element ? element.innerText : 'Elemento no encontrado'; """ }) return { "success": True, "page_info": js_result["result"], "extracted_text": text_result["result"], "session_id": session_id } except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def example_cookie_management(self) -> Dict[str, Any]: """Ejemplo de gestión de cookies.""" print("=== Ejemplo: Gestión de Cookies ===") result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": {"headless": True} }) session_id = result["session_id"] try: # Navegar a una página await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://httpbin.org/cookies" }) # Obtener cookies iniciales initial_cookies = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "get_all" }) print(f"Cookies iniciales: {initial_cookies['count']}") # Agregar cookies personalizadas cookies_to_add = [ { "name": "session_id", "value": "abc123def456", "domain": "httpbin.org" }, { "name": "user_preference", "value": "dark_mode", "domain": "httpbin.org" }, { "name": "auth_token", "value": "token_xyz789", "domain": "httpbin.org" } ] for cookie in cookies_to_add: add_result = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "add", "cookie_data": cookie }) print(f"Cookie agregada: {cookie['name']}") # Verificar cookies después de agregar all_cookies = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "get_all" }) print(f"Total de cookies: {all_cookies['count']}") # Navegar a página que muestra cookies await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://httpbin.org/cookies" }) # Obtener información de la página con cookies page_info = await self.client.call_tool("get_page_info", { "session_id": session_id }) # Obtener una cookie específica specific_cookie = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "get", "cookie_name": "session_id" }) print(f"Cookie específica: {specific_cookie.get('cookie', 'No encontrada')}") # Eliminar una cookie delete_result = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "delete", "cookie_name": "user_preference" }) print(f"Cookie eliminada: {delete_result['message']}") # Verificar cookies finales final_cookies = await self.client.call_tool("manage_cookies", { "session_id": session_id, "action": "get_all" }) return { "success": True, "initial_cookies": initial_cookies['count'], "final_cookies": final_cookies['count'], "cookies_added": len(cookies_to_add), "session_id": session_id } except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def example_multi_session_management(self) -> Dict[str, Any]: """Ejemplo de gestión de múltiples sesiones.""" print("=== Ejemplo: Gestión de Múltiples Sesiones ===") sessions = [] urls = [ "https://httpbin.org/html", "https://httpbin.org/json", "https://httpbin.org/xml" ] try: # Crear múltiples sesiones for i, url in enumerate(urls): result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": { "headless": True, "window_width": 1024 + (i * 100), "window_height": 768 + (i * 50) } }) session_id = result["session_id"] sessions.append(session_id) # Navegar cada sesión a una URL diferente await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": url }) print(f"Sesión {i+1} creada: {session_id} -> {url}") # Listar sesiones activas active_sessions = await self.client.call_tool("list_active_sessions") print(f"Sesiones activas: {active_sessions['total_sessions']}") # Procesar cada sesión results = [] for i, session_id in enumerate(sessions): # Obtener información de la sesión session_info = await self.client.call_tool("get_session_info", { "session_id": session_id }) # Tomar captura de cada sesión screenshot = await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": f"/tmp/session_{i+1}.png" }) # Ejecutar JavaScript para obtener datos js_data = await self.client.call_tool("execute_script", { "session_id": session_id, "script": """ return { title: document.title, bodyLength: document.body.innerText.length, timestamp: new Date().toISOString() }; """ }) results.append({ "session_id": session_id, "url": session_info["session"]["browser_info"]["current_url"], "title": session_info["session"]["browser_info"]["title"], "data": js_data["result"] }) # Cerrar sesiones selectivamente (cerrar la primera) if sessions: close_result = await self.client.call_tool("close_browser", { "session_id": sessions[0] }) print(f"Sesión cerrada: {sessions[0]}") sessions.pop(0) # Verificar sesiones restantes remaining_sessions = await self.client.call_tool("list_active_sessions") print(f"Sesiones restantes: {remaining_sessions['total_sessions']}") return { "success": True, "sessions_created": len(urls), "sessions_processed": len(results), "remaining_sessions": len(sessions), "results": results } except Exception as e: # Limpiar todas las sesiones en caso de error await self.client.call_tool("close_all_sessions") return {"error": str(e)} finally: # Cerrar sesiones restantes for session_id in sessions: await self.client.call_tool("close_browser", {"session_id": session_id}) async def example_stealth_automation(self) -> Dict[str, Any]: """Ejemplo completo de automatización stealth.""" print("=== Ejemplo: Automatización Stealth Completa ===") # Configuración stealth máxima result = await self.client.call_tool("start_browser", { "browser_type": "chrome", "options": { "headless": True, "disable_images": True, "incognito": True, "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" }, "detection_evasion": { "use_undetected_chrome": True, "stealth_mode": True, "randomize_user_agent": True, "randomize_viewport": True, "disable_blink_features": True } }) session_id = result["session_id"] try: # Aplicar todas las técnicas stealth stealth_result = await self.client.call_tool("apply_stealth_mode", { "session_id": session_id }) print(f"Stealth aplicado: {len(stealth_result['applied_scripts'])} scripts") # Randomizar user agent ua_result = await self.client.call_tool("randomize_user_agent", { "session_id": session_id }) print(f"User agent: {ua_result['new_user_agent'][:50]}...") # Randomizar viewport viewport_result = await self.client.call_tool("randomize_viewport", { "session_id": session_id }) print(f"Viewport: {viewport_result['new_size']}") # Navegar con delay inicial await self.client.call_tool("add_random_delay", { "min_seconds": 1.0, "max_seconds": 3.0 }) await self.client.call_tool("navigate_to_url", { "session_id": session_id, "url": "https://bot.sannysoft.com/" }) # Delay después de cargar await self.client.call_tool("add_random_delay", { "min_seconds": 2.0, "max_seconds": 4.0 }) # Scroll humano para simular lectura for _ in range(3): await self.client.call_tool("scroll_like_human", { "session_id": session_id, "direction": "down", "distance": 300, "steps": 6 }) await self.client.call_tool("add_random_delay", { "min_seconds": 1.5, "max_seconds": 3.0 }) # Tomar captura final await self.client.call_tool("take_screenshot", { "session_id": session_id, "file_path": "/tmp/stealth_test.png" }) # Ejecutar JavaScript para verificar detección detection_check = await self.client.call_tool("execute_script", { "session_id": session_id, "script": """ return { webdriver: navigator.webdriver, chrome: !!window.chrome, permissions: navigator.permissions ? 'present' : 'missing', plugins: navigator.plugins.length, languages: navigator.languages, userAgent: navigator.userAgent.substring(0, 50) + '...' }; """ }) return { "success": True, "stealth_scripts": len(stealth_result['applied_scripts']), "detection_check": detection_check["result"], "session_id": session_id } except Exception as e: await self.client.call_tool("close_browser", {"session_id": session_id}) return {"error": str(e)} async def run_all_examples(self): """Ejecuta todos los ejemplos en secuencia.""" print("🚀 Ejecutando todos los ejemplos del Servidor MCP Selenium\n") examples = [ ("Navegación Básica", self.example_basic_navigation), ("Automatización de Formularios", self.example_form_automation), ("Interacciones con Elementos", self.example_element_interaction), ("Ejecución de JavaScript", self.example_javascript_execution), ("Gestión de Cookies", self.example_cookie_management), ("Múltiples Sesiones", self.example_multi_session_management), ("Automatización Stealth", self.example_stealth_automation) ] results = {} for name, example_func in examples: print(f"\n{'='*50}") print(f"Ejecutando: {name}") print('='*50) try: result = await example_func() results[name] = result if result.get("success"): print(f"✅ {name} completado exitosamente") # Cerrar sesión si existe if "session_id" in result: await self.client.call_tool("close_browser", { "session_id": result["session_id"] }) else: print(f"❌ {name} falló: {result.get('error', 'Error desconocido')}") except Exception as e: print(f"💥 {name} generó excepción: {str(e)}") results[name] = {"error": str(e)} # Delay entre ejemplos time.sleep(2) # Limpiar todas las sesiones al final await self.client.call_tool("close_all_sessions") print(f"\n{'='*50}") print("📊 RESUMEN DE EJEMPLOS") print('='*50) successful = sum(1 for r in results.values() if r.get("success")) total = len(results) print(f"Ejemplos ejecutados: {total}") print(f"Exitosos: {successful}") print(f"Fallidos: {total - successful}") print(f"Tasa de éxito: {(successful/total)*100:.1f}%") return results # Función de utilidad para ejecutar ejemplos individuales async def run_example(client, example_name: str): """ Ejecuta un ejemplo específico. Args: client: Cliente MCP conectado example_name: Nombre del ejemplo a ejecutar """ examples = SeleniumMCPExamples(client) example_map = { "basic": examples.example_basic_navigation, "form": examples.example_form_automation, "elements": examples.example_element_interaction, "javascript": examples.example_javascript_execution, "cookies": examples.example_cookie_management, "multi": examples.example_multi_session_management, "stealth": examples.example_stealth_automation, "all": examples.run_all_examples } if example_name not in example_map: print(f"Ejemplo '{example_name}' no encontrado.") print(f"Ejemplos disponibles: {list(example_map.keys())}") return return await example_map[example_name]() if __name__ == "__main__": print("Este archivo contiene ejemplos de uso del Servidor MCP Selenium.") print("Para ejecutar los ejemplos, use un cliente MCP conectado al servidor.") print("\nEjemplos disponibles:") print("- basic: Navegación básica") print("- form: Automatización de formularios") print("- elements: Interacciones con elementos") print("- javascript: Ejecución de JavaScript") print("- cookies: Gestión de cookies") print("- multi: Múltiples sesiones") print("- stealth: Automatización stealth") print("- all: Todos los ejemplos")

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Nixon-Suarez/MCP-Selenium-WebDriver'

If you have feedback or need assistance with the MCP directory API, please join our Discord server