examples.py•29.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")