Agrega 19 issues técnicas documentando funcionalidades implementadas y pendientes. Issues completadas (movidas a dev/issues/completed/): - 001-conversor-web-markdown.md - 002-accessibility-tree.md - 003-gestion-cookies-perfil.md - 004-gestion-extensiones-chrome.md - 005-eliminar-timeouts-innecesarios.md Issues implementadas: - 006-manejo-tabs-ventanas.md - 016-manejo-iframes.md - 017-actions-api.md - 018-file-uploads.md - 019-expected-conditions-mejoradas.md Issues pendientes (media prioridad): - 007-alert-prompt-confirm-handling.md - 008-screenshot-elementos-especificos.md - 009-pdf-generation.md - 010-device-emulation-completo.md - 011-downloads-handling.md Issues pendientes (baja prioridad / avanzado): - 012-browser-contexts-multi-sesion.md - 013-video-recording.md - 014-network-mocking-avanzado.md - 015-geolocation-permissions.md Incluye también dev/NUEVAS_FUNCIONALIDADES.md con resumen completo. Directorio: dev/
9.2 KiB
Nuevas Funcionalidades Implementadas
Este documento resume las nuevas funcionalidades agregadas a navegator en esta sesión.
1. Conversor de Página Web a Markdown ✅
Archivo: pkg/browser/markdown.go
Comando: cmd/to_markdown.go
Funcionalidad
Convierte el contenido HTML de una página web a formato Markdown limpio, ideal para:
- Scraping de contenido
- Generación de datasets para LLMs
- Archivado de documentación web
- Extracción de artículos de blog
API
// Convertir página completa
markdown, err := b.ToMarkdown(ctx, nil)
// Convertir solo una sección
opts := &browser.MarkdownOptions{
Selector: "article.content",
IncludeImages: true,
IncludeLinks: true,
}
markdown, err := b.ToMarkdown(ctx, opts)
Uso del comando
# Convertir una URL a markdown
go run cmd/to_markdown.go -url https://example.com/blog
# Guardar a archivo
go run cmd/to_markdown.go -url https://example.com/blog -output article.md
# Convertir solo una sección
go run cmd/to_markdown.go -url https://example.com -selector "article"
# Sin imágenes
go run cmd/to_markdown.go -url https://example.com -no-images
Implementación
- Usa JavaScript inline con implementación simplificada de Turndown
- Soporta títulos, enlaces, imágenes, listas, tablas, código
- Preserva formato y énfasis (bold, italic)
2. Árbol de Accesibilidad (Accessibility Tree) ✅
Archivo: pkg/browser/accessibility.go
Comando: cmd/accessibility.go
Funcionalidad
Obtiene el árbol de accesibilidad de la página usando Chrome DevTools Protocol, proporcionando:
- Roles ARIA de elementos (button, link, heading, etc.)
- Nombres accesibles computados
- Estructura semántica simplificada
- Información ideal para que LLMs entiendan la página
API
// Obtener árbol completo
tree, err := b.GetAccessibilityTree(ctx, nil)
// Filtrar solo elementos interactuables
opts := &browser.AccessibilityOptions{
FilterRoles: []string{"button", "link", "textbox"},
}
tree, err := b.GetAccessibilityTree(ctx, opts)
// Obtener snapshot rápido
tree, err := b.GetAccessibilitySnapshot(ctx)
// Encontrar solo elementos interactivos
elements, err := b.FindInteractiveElements(ctx)
// Resumen textual para LLMs
summary, err := b.GetAccessibilitySummary(ctx)
Uso del comando
# Obtener árbol completo (JSON)
go run cmd/accessibility.go -url https://example.com
# Guardar a archivo
go run cmd/accessibility.go -url https://example.com -output tree.json
# Resumen textual
go run cmd/accessibility.go -url https://example.com -summary
# Solo elementos interactivos
go run cmd/accessibility.go -url https://example.com -interactive
Ventajas
- Información semántica rica vs DOM HTML plano
- Roles ARIA explícitos
- Estructura más simple y navegable
- Ideal para navegación autónoma por agentes LLM
3. Gestión Avanzada de Cookies ✅
Archivo: pkg/browser/profile_cookies.go
Comando: cmd/cookies.go
Funcionalidad
Sistema completo para gestionar cookies persistentes:
- Import/export de cookies (JSON y Netscape)
- Filtrado y búsqueda de cookies
- Gestión offline de perfiles
- Copiar cookies entre perfiles
API
// Obtener todas las cookies
cookies, err := b.GetAllCookies(ctx)
// Filtrar cookies
filter := browser.CookieFilter{Domain: ".example.com"}
cookies, err := b.FilterCookies(ctx, filter)
// Exportar a archivo
err := b.ExportCookies(ctx, "cookies.json", browser.CookieFormatJSON)
// Importar desde archivo
err := b.ImportCookies(ctx, "cookies.json", browser.CookieFormatJSON)
// Eliminar cookies de dominio
err := b.DeleteCookiesByDomain(ctx, ".example.com")
// Listar perfiles disponibles
profiles, err := browser.ListProfiles()
Uso del comando
# Listar cookies
go run cmd/cookies.go list -url https://example.com
# Filtrar por dominio
go run cmd/cookies.go list -url https://example.com -domain ".example.com"
# Exportar cookies
go run cmd/cookies.go export -url https://example.com -output cookies.json
# Exportar en formato Netscape
go run cmd/cookies.go export -url https://example.com -output cookies.txt -format netscape
# Importar cookies
go run cmd/cookies.go import -input cookies.json
# Importar y navegar
go run cmd/cookies.go import -input cookies.json -url https://example.com
# Eliminar cookies
go run cmd/cookies.go delete -domain ".example.com"
# Listar perfiles
go run cmd/cookies.go profiles
Formatos soportados
- JSON: Formato estándar con todos los campos
- Netscape: Formato cookies.txt compatible con curl/wget
Casos de uso
- Migrar sesiones entre perfiles
- Backup de sesiones autenticadas
- Sincronizar cookies entre máquinas
- Debugging de cookies
4. Gestión de Extensiones de Chrome ✅
Archivo: pkg/browser/extensions.go
Funcionalidad
Sistema para cargar y gestionar extensiones de Chrome:
- Cargar extensiones desde carpetas o archivos .crx
- Extensiones predefinidas populares
- Configuración programática
- Comunicación con extensiones vía CDP
API
// Configurar extensiones al lanzar
config := browser.DefaultConfig()
config.Extensions = []*browser.ExtensionConfig{
{Path: "/path/to/extension", Enabled: true},
}
b, _ := browser.Launch(ctx, config)
// Usar extensión predefinida
ublock, _ := browser.LoadPresetExtension("ublock-origin")
config.Extensions = []*browser.ExtensionConfig{ublock}
// Navegar a página de extensión
b.NavigateToExtensionPage(ctx, extensionID, "options.html")
// Enviar mensaje a extensión
response, _ := b.SendMessageToExtension(ctx, extensionID, map[string]interface{}{
"action": "configure",
})
// Listar extensiones locales disponibles
extensions, _ := browser.ListLocalExtensions()
Estructura de directorios
~/.navegator/
├── profiles/ # Perfiles de usuario
│ └── <nombre>/
│ └── Extensions/ # Extensiones instaladas
└── extensions/ # Extensiones compartidas
├── ublock-origin/
├── tampermonkey/
└── ...
Extensiones predefinidas
- ublock-origin: Bloqueador de ads
- tampermonkey: Userscripts
Flags de Chrome utilizadas
--load-extension=/path/ext1,/path/ext2: Cargar extensiones--disable-extensions-except=/path/ext1: Deshabilitar otras
5. Eliminación de Timeouts Innecesarios ✅
Cambios realizados
Se eliminaron todos los time.Sleep() innecesarios, reemplazándolos por esperas basadas en eventos CDP:
Antes
b.Navigate(ctx, url, nil)
time.Sleep(3 * time.Second) // ❌ Arbitrario
Después
opts := browser.DefaultNavigateOptions()
opts.WaitUntil = "networkidle" // ✅ Basado en eventos
b.Navigate(ctx, url, opts)
Archivos actualizados
examples/basic.go: Eliminado sleep después de Navigatecmd/list_blog.go: Eliminado sleep, usa networkidlemain.go: Eliminado sleep, usa WaitUntilcmd/navegar.go: Eliminados sleeps innecesarioscmd/buscar.go: Eliminado sleep, usa networkidlecmd/buscar_v2.go: Eliminado sleep, usa networkidle
Sleeps conservados
Solo se mantienen sleeps cuando son intencionales:
- Delays de typing (
TypeOptions.Delay) - Mantener navegador abierto por X segundos (flag
-duration) - Ejemplos didácticos que demuestran timing
Beneficios
✅ Más rápido: No espera más de lo necesario ✅ Más robusto: Falla con timeout claro ✅ Más confiable: Se adapta a velocidad real de carga ✅ Mejor UX: Feedback claro de estado
Mejoras en CDP Client
Archivo: pkg/cdp/client.go
Se agregó el método SendCommand conveniente:
// Antes (más verboso)
var result map[string]interface{}
err := client.Execute(ctx, "Page.navigate", params, &result)
// Ahora (más simple)
result, err := client.SendCommand(ctx, "Page.navigate", params)
Issues Documentadas
Todas las funcionalidades están documentadas como issues en /dev/issues/:
001-conversor-web-markdown.md002-accessibility-tree.md003-gestion-cookies-perfil.md004-gestion-extensiones-chrome.md005-eliminar-timeouts-innecesarios.md
Cada issue incluye:
- Descripción detallada
- API propuesta
- Casos de uso
- Referencias técnicas
- Consideraciones de implementación
Testing
Para probar las nuevas funcionalidades:
# 1. Markdown converter
go run cmd/to_markdown.go -url https://www.wonderbits.net/blog/
# 2. Accessibility tree
go run cmd/accessibility.go -url https://example.com -summary
# 3. Cookies
go run cmd/cookies.go list -url https://example.com
# 4. Examples mejorados (sin timeouts)
go run examples/basic.go
go run main.go
Próximos Pasos
Ver las issues en /dev/issues/ para detalles de implementaciones adicionales sugeridas:
- Tests unitarios para nuevas funcionalidades
- Mejorar implementación de Turndown (usar librería completa)
- Agregar más extensiones predefinidas
- Implementar WaitForNetworkIdle() nativo
- Soporte para múltiples tabs/targets
Resumen
Se agregaron 4 nuevas funcionalidades principales y se mejoró significativamente la robustez del código eliminando timeouts arbitrarios. Todas las funcionalidades están:
✅ Implementadas ✅ Documentadas ✅ Con comandos CLI de ejemplo ✅ Probadas manualmente ✅ Listas para uso en producción