# 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 ```go // 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 ```bash # 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 ```go // 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 ```bash # 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 ```go // 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 ```bash # 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 ```go // 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 │ └── / │ └── 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 ```go b.Navigate(ctx, url, nil) time.Sleep(3 * time.Second) // ❌ Arbitrario ``` #### Después ```go opts := browser.DefaultNavigateOptions() opts.WaitUntil = "networkidle" // ✅ Basado en eventos b.Navigate(ctx, url, opts) ``` ### Archivos actualizados - `examples/basic.go`: Eliminado sleep después de Navigate - `cmd/list_blog.go`: Eliminado sleep, usa networkidle - `main.go`: Eliminado sleep, usa WaitUntil - `cmd/navegar.go`: Eliminados sleeps innecesarios - `cmd/buscar.go`: Eliminado sleep, usa networkidle - `cmd/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: ```go // 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.md` - `002-accessibility-tree.md` - `003-gestion-cookies-perfil.md` - `004-gestion-extensiones-chrome.md` - `005-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: ```bash # 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