6c570fe9cb
Implementa GetAccessibilityTree() para obtener estructura semántica vía CDP. Incluye: - Roles ARIA de elementos (button, link, heading, etc) - Nombres accesibles computados - FindInteractiveElements() para elementos clickeables - GetAccessibilitySummary() para resumen textual - Comando CLI accessibility.go Ideal para que LLMs entiendan estructura de páginas web. Archivo: pkg/browser/accessibility.go, cmd/accessibility.go
118 lines
3.1 KiB
Go
118 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
|
|
"navegator/pkg/browser"
|
|
)
|
|
|
|
func main() {
|
|
urlFlag := flag.String("url", "", "URL to analyze")
|
|
outputFlag := flag.String("output", "", "Output file for JSON (optional)")
|
|
summaryFlag := flag.Bool("summary", false, "Show text summary instead of full tree")
|
|
interactiveFlag := flag.Bool("interactive", false, "Show only interactive elements")
|
|
flag.Parse()
|
|
|
|
if *urlFlag == "" {
|
|
log.Fatal("Usage: accessibility -url <url> [-output <file>] [-summary] [-interactive]")
|
|
}
|
|
|
|
ctx := context.Background()
|
|
|
|
// Configurar navegador
|
|
config := browser.DefaultConfig()
|
|
config.ProfileName = "accessibility-inspector"
|
|
config.StealthFlags.Headless = true
|
|
|
|
// Lanzar navegador
|
|
log.Println("Launching browser...")
|
|
b, err := browser.Launch(ctx, config)
|
|
if err != nil {
|
|
log.Fatalf("Error launching browser: %v", err)
|
|
}
|
|
defer b.Close()
|
|
|
|
// Navegar a URL
|
|
log.Printf("Navigating to %s...\n", *urlFlag)
|
|
opts := browser.DefaultNavigateOptions()
|
|
opts.WaitUntil = "load"
|
|
|
|
if err := b.Navigate(ctx, *urlFlag, opts); err != nil {
|
|
log.Printf("Warning: navigation error: %v\n", err)
|
|
}
|
|
|
|
if *summaryFlag {
|
|
// Mostrar resumen textual
|
|
log.Println("Generating accessibility summary...")
|
|
summary, err := b.GetAccessibilitySummary(ctx)
|
|
if err != nil {
|
|
log.Fatalf("Error getting summary: %v", err)
|
|
}
|
|
|
|
if *outputFlag != "" {
|
|
if err := os.WriteFile(*outputFlag, []byte(summary), 0644); err != nil {
|
|
log.Fatalf("Error writing to file: %v", err)
|
|
}
|
|
log.Printf("Summary saved to %s\n", *outputFlag)
|
|
} else {
|
|
fmt.Println(summary)
|
|
}
|
|
} else if *interactiveFlag {
|
|
// Mostrar solo elementos interactivos
|
|
log.Println("Finding interactive elements...")
|
|
elements, err := b.FindInteractiveElements(ctx)
|
|
if err != nil {
|
|
log.Fatalf("Error finding interactive elements: %v", err)
|
|
}
|
|
|
|
fmt.Printf("\n=== Interactive Elements (%d) ===\n\n", len(elements))
|
|
for i, elem := range elements {
|
|
fmt.Printf("%d. [%s] %s\n", i+1, elem.Role, elem.Name)
|
|
if elem.Description != "" {
|
|
fmt.Printf(" Description: %s\n", elem.Description)
|
|
}
|
|
if elem.Value != nil {
|
|
fmt.Printf(" Value: %v\n", elem.Value)
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
if *outputFlag != "" {
|
|
tree := &browser.AXTree{Nodes: elements}
|
|
json, _ := tree.ToJSON()
|
|
if err := os.WriteFile(*outputFlag, []byte(json), 0644); err != nil {
|
|
log.Fatalf("Error writing to file: %v", err)
|
|
}
|
|
log.Printf("Interactive elements saved to %s\n", *outputFlag)
|
|
}
|
|
} else {
|
|
// Obtener árbol completo
|
|
log.Println("Getting accessibility tree...")
|
|
tree, err := b.GetAccessibilityTree(ctx, nil)
|
|
if err != nil {
|
|
log.Fatalf("Error getting accessibility tree: %v", err)
|
|
}
|
|
|
|
fmt.Printf("\n=== Accessibility Tree (%d nodes) ===\n\n", len(tree.Nodes))
|
|
|
|
// Convertir a JSON
|
|
jsonOutput, err := tree.ToJSON()
|
|
if err != nil {
|
|
log.Fatalf("Error converting to JSON: %v", err)
|
|
}
|
|
|
|
if *outputFlag != "" {
|
|
if err := os.WriteFile(*outputFlag, []byte(jsonOutput), 0644); err != nil {
|
|
log.Fatalf("Error writing to file: %v", err)
|
|
}
|
|
log.Printf("Accessibility tree saved to %s\n", *outputFlag)
|
|
} else {
|
|
fmt.Println(jsonOutput)
|
|
}
|
|
}
|
|
}
|