Servidor MCP Selenium WebDriver
Un servidor MCP (Model Context Protocol) completo que implementa Selenium WebDriver para automatización de navegadores con capacidades avanzadas de evasión de detección, soporte para múltiples navegadores y funcionalidades completas de interacción web.
Características Principales
🚀 Automatización Completa de Navegadores
- Navegación web: Navegar a URLs, obtener información de páginas
- Interacción con elementos: Buscar, hacer clic, escribir texto, subir archivos
- Acciones de ratón: Hover, drag and drop, clic derecho, doble clic
- Manejo de teclado: Envío de teclas especiales (Enter, Tab, flechas, etc.)
- Capturas de pantalla: Pantalla completa o elementos específicos
- Ejecución de JavaScript: Scripts personalizados en el navegador
🕵️ Evasión de Detección Avanzada
- Undetected Chrome: Integración con undetected-chromedriver
- Randomización: User agents y viewports aleatorios
- Scripts stealth: Ocultación de propiedades de automatización
- Simulación humana: Escritura y scroll con delays realistas
- Gestión de cookies: Control completo de cookies y sesiones
🌐 Soporte Multi-Navegador
- Chrome: Soporte completo con evasión de detección
- Firefox: Implementación nativa de Selenium
- Detección automática: Identificación de navegadores instalados
- Configuraciones específicas: Optimizaciones por navegador
⚙️ Gestión Avanzada de Sesiones
- Múltiples sesiones: Hasta 10 sesiones simultáneas por defecto
- Gestión automática: Limpieza de sesiones expiradas
- Configuraciones flexibles: Presets para diferentes casos de uso
- Proxies: Soporte para HTTP, HTTPS y SOCKS
Instalación
Requisitos Previos
- Python 3.8 o superior
- Chrome y/o Firefox instalados
- Dependencias del sistema para Selenium
Instalación de Dependencias
cd mcp_selenium_server
pip install -r requirements.txt
Dependencias del Sistema
Ubuntu/Debian
wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt update
sudo apt install google-chrome-stable
sudo apt install firefox
CentOS/RHEL
sudo yum install -y google-chrome-stable
sudo yum install firefox
Windows
macOS
brew install --cask google-chrome
brew install --cask firefox
Configuración
Configuraciones Predefinidas
El servidor incluye tres configuraciones predefinidas:
1. Configuración por Defecto
DEFAULT_CONFIG = ServerConfig(
max_sessions=10,
session_timeout=3600,
default_browser="chrome",
browser_options=BrowserOptions(
headless=False,
window_width=1920,
window_height=1080,
incognito=True
)
)
2. Configuración Stealth (Recomendada para evasión)
STEALTH_CONFIG = ServerConfig(
browser_options=BrowserOptions(
headless=True,
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...",
disable_images=True,
custom_args=[
"--disable-blink-features=AutomationControlled",
"--disable-dev-shm-usage",
"--no-first-run",
]
),
detection_evasion=DetectionEvasionConfig(
use_undetected_chrome=True,
stealth_mode=True,
randomize_user_agent=True,
randomize_viewport=True
)
)
3. Configuración de Rendimiento
PERFORMANCE_CONFIG = ServerConfig(
browser_options=BrowserOptions(
headless=True,
disable_images=True,
disable_javascript=False,
custom_args=[
"--disable-dev-shm-usage",
"--disable-gpu",
"--no-sandbox"
]
)
)
Configuración de Proxies
proxy_config = {
"http": "http://proxy.example.com:8080",
"https": "https://proxy.example.com:8080",
"socks": "socks5://proxy.example.com:1080"
}
Uso Básico
Iniciar el Servidor
python server.py
mcp dev server.py
mcp install server.py
Ejemplo de Uso Básico
result = start_browser(
browser_type="chrome",
options={
"headless": False,
"window_width": 1920,
"window_height": 1080
},
detection_evasion={
"use_undetected_chrome": True,
"stealth_mode": True
}
)
session_id = result["session_id"]
navigate_to_url(session_id, "https://example.com")
element = find_element(
session_id=session_id,
strategy="css_selector",
value="input[name='search']"
)
type_text(
session_id=session_id,
strategy="css_selector",
value="input[name='search']",
text="selenium automation"
)
click_element(
session_id=session_id,
strategy="css_selector",
value="button[type='submit']"
)
take_screenshot(
session_id=session_id,
file_path="/path/to/screenshot.png"
)
close_browser(session_id)
Herramientas MCP Disponibles
Gestión de Navegadores
| Herramienta | Descripción |
|---|
start_browser | Inicia una nueva sesión de navegador |
close_browser | Cierra una sesión específica |
detect_available_browsers | Detecta navegadores instalados |
get_recommended_browser | Obtiene el navegador recomendado |
check_browser_support | Verifica soporte de WebDriver |
Navegación y Páginas
| Herramienta | Descripción |
|---|
navigate_to_url | Navega a una URL específica |
get_page_info | Obtiene información de la página actual |
execute_script | Ejecuta JavaScript en el navegador |
Interacción con Elementos
| Herramienta | Descripción |
|---|
find_element | Busca elementos con diferentes estrategias |
click_element | Hace clic en un elemento |
type_text | Escribe texto en un elemento |
upload_file | Sube archivos a inputs de tipo file |
Acciones Avanzadas
| Herramienta | Descripción |
|---|
perform_mouse_action | Acciones de ratón (hover, drag & drop) |
send_keys | Envía teclas especiales |
take_screenshot | Captura pantalla completa o elementos |
Evasión de Detección
| Herramienta | Descripción |
|---|
apply_stealth_mode | Aplica todas las técnicas stealth |
randomize_user_agent | Cambia a un user agent aleatorio |
randomize_viewport | Cambia el tamaño de ventana |
simulate_human_typing | Escritura con delays humanos |
scroll_like_human | Scroll gradual simulando humano |
add_random_delay | Agrega delays aleatorios |
Gestión de Sesiones
| Herramienta | Descripción |
|---|
list_active_sessions | Lista todas las sesiones activas |
get_session_info | Información detallada de una sesión |
close_all_sessions | Cierra todas las sesiones |
cleanup_expired_sessions | Limpia sesiones expiradas |
Gestión de Cookies
| Herramienta | Descripción |
|---|
manage_cookies | Gestión completa de cookies |
Configuración del Servidor
| Herramienta | Descripción |
|---|
get_server_status | Estado actual del servidor |
update_server_config | Actualiza configuración con presets |
Ejemplos Avanzados
Automatización con Evasión de Detección
session_result = start_browser(
browser_type="chrome",
options={
"headless": True,
"disable_images": True,
"incognito": True
},
detection_evasion={
"use_undetected_chrome": True,
"stealth_mode": True,
"randomize_user_agent": True,
"randomize_viewport": True
}
)
session_id = session_result["session_id"]
apply_stealth_mode(session_id)
navigate_to_url(session_id, "https://example.com")
add_random_delay(1.0, 3.0)
scroll_like_human(session_id, "down", 500, 8)
add_random_delay(0.5, 1.5)
simulate_human_typing(
session_id=session_id,
strategy="id",
value="search-input",
text="automated search query",
min_delay=0.05,
max_delay=0.15
)
manage_cookies(
session_id=session_id,
action="add",
cookie_data={
"name": "session_token",
"value": "abc123",
"domain": "example.com"
}
)
session_id = start_browser("chrome")["session_id"]
navigate_to_url(session_id, "https://forms.example.com")
type_text(session_id, "id", "first_name", "John")
type_text(session_id, "id", "last_name", "Doe")
type_text(session_id, "id", "email", "john.doe@example.com")
click_element(session_id, "id", "country_select")
click_element(session_id, "xpath", "//option[text()='United States']")
upload_file(
session_id=session_id,
strategy="id",
value="file_upload",
file_path="/path/to/document.pdf"
)
click_element(session_id, "id", "terms_checkbox")
click_element(session_id, "css_selector", "button[type='submit']")
add_random_delay(2.0, 4.0)
page_info = get_page_info(session_id)
print(f"Página actual: {page_info['title']}")
Scraping con Múltiples Sesiones
sessions = []
urls = ["https://site1.com", "https://site2.com", "https://site3.com"]
for i, url in enumerate(urls):
result = start_browser(
browser_type="chrome",
options={"headless": True},
detection_evasion={"use_undetected_chrome": True}
)
session_id = result["session_id"]
sessions.append(session_id)
navigate_to_url(session_id, url)
apply_stealth_mode(session_id)
for i, session_id in enumerate(sessions):
elements = find_element(
session_id=session_id,
strategy="css_selector",
value=".data-item",
multiple=True
)
take_screenshot(
session_id=session_id,
file_path=f"/screenshots/site_{i+1}.png"
)
close_all_sessions()
Estrategias de Localización de Elementos
El servidor soporta todas las estrategias estándar de Selenium:
| Estrategia | Descripción | Ejemplo |
|---|
id | Por atributo ID | "search-button" |
name | Por atributo name | "username" |
class_name | Por clase CSS | "btn-primary" |
tag_name | Por nombre de etiqueta | "button" |
css_selector | Selector CSS | "div.container > p" |
xpath | Expresión XPath | "//div[@class='content']//p" |
link_text | Texto exacto del enlace | "Click here" |
partial_link_text | Texto parcial del enlace | "Click" |
Ejemplos de Selectores
find_element(session_id, "id", "submit-btn")
find_element(session_id, "class_name", "form-control")
find_element(session_id, "css_selector", "div.modal .btn-primary:not(:disabled)")
find_element(session_id, "xpath", "//table//tr[contains(@class, 'data-row')][position()>1]")
find_element(session_id, "css_selector", ".product-item", multiple=True)
Configuración de Proxies
Tipos de Proxy Soportados
proxy_config = {"http": "http://proxy.example.com:8080"}
proxy_config = {"https": "https://proxy.example.com:8080"}
proxy_config = {"socks": "socks5://proxy.example.com:1080"}
proxy_config = {"http": "http://user:pass@proxy.example.com:8080"}
start_browser(
browser_type="chrome",
proxy=proxy_config,
options={"headless": True}
)
Manejo de Errores
El servidor maneja automáticamente los errores comunes y proporciona mensajes descriptivos:
{
"success": False,
"error": "Timeout: Elemento no encontrado",
"message": "No se pudo encontrar elemento con id='missing-element' en 10 segundos"
}
{
"success": True,
"session_id": "abc123-def456",
"message": "Navegador chrome iniciado exitosamente"
}
Errores Comunes y Soluciones
| Error | Causa | Solución |
|---|
Sesión no encontrada | ID de sesión inválido | Verificar que la sesión esté activa |
Timeout: Elemento no encontrado | Selector incorrecto o elemento no visible | Revisar selector y aumentar timeout |
WebDriverException | Problema con el driver | Reinstalar webdriver-manager |
ElementNotInteractableException | Elemento no clickeable | Usar scroll o esperar a que sea visible |
Mejores Prácticas
Para Evasión de Detección
- Usar configuración stealth: Siempre aplicar
STEALTH_CONFIG para sitios que detectan bots
- Delays aleatorios: Agregar delays entre acciones para simular comportamiento humano
- Randomización: Cambiar user agents y viewports regularmente
- Gestión de cookies: Mantener cookies de sesión para parecer un usuario real
- Scroll gradual: Usar
scroll_like_human en lugar de scroll instantáneo
Para Rendimiento
- Modo headless: Usar para operaciones en lote
- Deshabilitar imágenes: Reducir tiempo de carga
- Gestión de sesiones: Cerrar sesiones no utilizadas
- Timeouts apropiados: Configurar timeouts según la velocidad del sitio
Para Estabilidad
- Manejo de errores: Siempre verificar
success en las respuestas
- Limpieza de sesiones: Usar
cleanup_expired_sessions regularmente
- Verificar elementos: Usar
find_element antes de interactuar
- Capturas de pantalla: Tomar capturas para debugging
Limitaciones
- Máximo de sesiones: 10 sesiones simultáneas por defecto (configurable)
- Timeout de sesión: 1 hora por defecto (configurable)
- Navegadores soportados: Chrome y Firefox únicamente
- Detección: Algunos sitios avanzados pueden detectar automatización
Solución de Problemas
Problemas de Instalación
pip install --upgrade webdriver-manager
sudo apt-get install -y libgconf-2-4 libxss1 libxtst6 libxrandr2 libasound2 libpangocairo-1.0-0 libatk1.0-0 libcairo-gobject2 libgtk-3-0 libgdk-pixbuf2.0-0
sudo chmod +x /usr/bin/google-chrome
Problemas de Ejecución
python -c "
from browser_detection import BrowserDetection
bd = BrowserDetection()
print(bd.detect_available_browsers())
"
python -c "
from webdriver_manager import WebDriverManager
wm = WebDriverManager()
driver = wm.create_driver('chrome', BrowserOptions())
print('Chrome funciona correctamente')
driver.quit()
"
Contribución
Para contribuir al proyecto:
- Fork el repositorio
- Crear una rama para la nueva característica
- Implementar cambios con tests
- Enviar pull request
Licencia
Este proyecto está bajo la licencia MIT.