Page:
AI-Browser-Tests
Clone
1
AI-Browser-Tests
Augustin ROUX edited this page 2026-04-27 09:03:45 +00:00
Tests pilotés par l'IA
Depuis v0.7.0, Studio peut prendre le contrôle d'un onglet de votre navigateur pour tester chaque bouton, surveiller la console, et produire un rapport ✓/✗ des éléments qui fonctionnent.
Architecture
┌────────────┐ WS+token ┌──────────┐ tool call ┌─────────────┐
│ Page cible │ ◀───────────▶ │ Muyue │ ◀────────────▶ │ Studio AI │
│ (Chrome…) │ │ /api/ws/ │ │ (provider) │
│ + snippet │ │ browser- │ │ │
│ │ │ test │ │ │
└────────────┘ └──────────┘ └─────────────┘
│ │
│ console hook │ session store
│ click dispatcher │ (max 16, LRU)
▼ ▼
commande RPC console buffer (200)
Mise en route
- Ouvre la page à tester (n'importe quel navigateur, n'importe quelle URL).
- Onglet Tests dans Muyue → copie le snippet.
- Console développeur de la page cible (
F12) → colle le snippet →Entrée. - Le panneau "Sessions connectées" affiche la session.
- Onglet Studio → demande par exemple :
Teste tous les boutons de cette page et dis-moi lesquels déclenchent une erreur dans la console.
Outil agent browser_test
Schema (8 actions) :
{
"action": "list_clickables | click | eval | console | summary | current_url | type | wait",
"session_id": "string (optionnel — défaut: la session la plus récente)",
"selector": "string (optionnel — sélecteur CSS pour click/type)",
"index": "int (optionnel — alternative à selector, position dans le dernier list_clickables)",
"expr": "string (eval uniquement — expression JS)",
"text": "string (type uniquement — valeur à insérer)",
"wait_ms": "int (wait uniquement — max 5000)",
"tail": "int (console — défaut 50, max 200)"
}
Réponse click
{
"action": "click",
"reply": { "ok": true },
"console_delta": [
{ "level": "error", "message": "TypeError: Cannot read 'id' of undefined", "time": "..." }
],
"current_url": "https://example.com/page"
}
console_delta ne contient que les messages émis pendant l'action (le diff du buffer console). C'est le signal principal pour qualifier un bouton de "cassé".
Boucle BMAD recommandée
Le system prompt de Studio (v0.7.0) intègre cette stratégie :
1. summary → URL, titre, console récente
2. list_clickables → liste indexée des éléments
3. for each target:
click {index} → vérifier console_delta
wait 200 → laisser les async se résoudre si besoin
4. Rapport final :
✓ Bouton "Login" — pas d'erreur
✗ Bouton "Save" — TypeError: ...
⚠ Bouton "Cancel" — sélecteur non trouvé / disabled
Sécurité
- Token à usage unique :
/api/test/snippetgénère un token (16 octets random, hex), valide 5 min, consommé dès la première connexion WS. - Origin libre côté snippet : le WS endpoint accepte n'importe quelle origine (la page cible peut être sur n'importe quel domaine), mais sans token valide, la connexion est refusée 401. La sécurité repose sur le token, pas sur l'Origin.
- CORS API REST inchangé :
/api/test/snippet,/api/test/sessions,/api/test/console/{id}restent restreints aux origines localhost (l'UI Muyue uniquement). - Read limit : 2 MiB par message WS (anti-DoS).
- Capacité : 16 sessions max, éviction LRU, 200 entrées console max par session.
- Le snippet n'envoie qu'un ensemble fermé de types (
hello/console/reply/url_change/ping) — pas d'API arbitraire vers le serveur.
Limitations connues
- La page cible doit pouvoir établir un WebSocket vers Muyue. Si Muyue tourne en HTTP et la page est en HTTPS, le navigateur bloquera (mixed content).
evalexécute dans le contexte de la page : restrictions CSP s'appliquent, certaines pages bloqueronteval.- Pas (encore) de capture d'écran ; tout est texte.
- Le snippet ne survit pas à un rechargement de la page — il faut recoller (un nouveau token sera nécessaire si l'ancien est expiré).
Code
- Backend :
internal/api/browser_test.go - Routes :
internal/api/server.go::routes() - System prompt :
internal/agent/prompts/studio_system.mdsection<browser_test_strategy> - UI :
web/src/components/Tests.jsx,web/src/components/App.jsx - API client :
web/src/api/client.js(getTestSnippet,getTestSessions,getTestConsole)