c165f2f788
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/
380 lines
9.2 KiB
Markdown
380 lines
9.2 KiB
Markdown
# 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
|
|
│ └── <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
|
|
```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
|