Files
rpa_vision_v3/test_interface_proprietes_reel.py
Dom a27b74cf22 v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- Frontend v4 accessible sur réseau local (192.168.1.40)
- Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard)
- Ollama GPU fonctionnel
- Self-healing interactif
- Dashboard confiance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:23:51 +01:00

308 lines
10 KiB
Python

#!/usr/bin/env python3
"""
Test Réel de l'Interface des Propriétés VWB
Auteur : Dom, Alice, Kiro - 12 janvier 2026
Ce script teste l'interface réelle pour identifier pourquoi les propriétés
ne s'affichent pas correctement.
"""
import requests
import json
import time
import sys
from pathlib import Path
def test_backend_vwb():
"""Test du backend VWB"""
print("🔍 Test du Backend VWB")
print("=" * 50)
# Tester la connexion au backend
backend_url = "http://localhost:5004"
try:
# Test de santé du catalogue
print("🏥 Test de santé du catalogue...")
response = requests.get(f"{backend_url}/api/vwb/catalog/health", timeout=5)
if response.status_code == 200:
health_data = response.json()
print("✅ Backend VWB accessible")
print(f" Status: {health_data.get('status', 'unknown')}")
print(f" Services: {health_data.get('services', {})}")
else:
print(f"❌ Backend VWB inaccessible (status: {response.status_code})")
return False
except requests.exceptions.RequestException as e:
print(f"❌ Erreur de connexion au backend: {e}")
print("💡 Vérifiez que le backend VWB est démarré sur le port 5002")
return False
try:
# Test de récupération des actions
print("\n📋 Test de récupération des actions...")
response = requests.get(f"{backend_url}/api/vwb/catalog/actions", timeout=5)
if response.status_code == 200:
actions_data = response.json()
actions = actions_data.get('actions', [])
print(f"{len(actions)} actions disponibles")
# Afficher quelques actions
for i, action in enumerate(actions[:5]):
print(f" {i+1}. {action.get('id')} - {action.get('name')}")
if len(actions) > 5:
print(f" ... et {len(actions) - 5} autres")
else:
print(f"❌ Erreur récupération actions (status: {response.status_code})")
return False
except requests.exceptions.RequestException as e:
print(f"❌ Erreur récupération actions: {e}")
return False
try:
# Test d'une action spécifique
print("\n🎯 Test d'action spécifique (navigate_to_url)...")
response = requests.get(f"{backend_url}/api/vwb/catalog/actions/navigate_to_url", timeout=5)
if response.status_code == 200:
action_data = response.json()
action = action_data.get('action', {})
print(f"✅ Action navigate_to_url trouvée")
print(f" Nom: {action.get('name')}")
print(f" Catégorie: {action.get('category')}")
print(f" Paramètres: {len(action.get('parameters', {}))}")
else:
print(f"❌ Action navigate_to_url non trouvée (status: {response.status_code})")
except requests.exceptions.RequestException as e:
print(f"❌ Erreur test action spécifique: {e}")
return True
def test_frontend_connection():
"""Test de la connexion frontend"""
print("\n🌐 Test de la Connexion Frontend")
print("=" * 50)
frontend_url = "http://localhost:3000"
try:
print("🔗 Test de connexion au frontend...")
response = requests.get(frontend_url, timeout=5)
if response.status_code == 200:
print("✅ Frontend accessible")
print("💡 Ouvrez http://localhost:3000 dans votre navigateur")
print("💡 Créez une étape 'navigate_to_url' et vérifiez les propriétés")
else:
print(f"❌ Frontend inaccessible (status: {response.status_code})")
return False
except requests.exceptions.RequestException as e:
print(f"❌ Erreur de connexion au frontend: {e}")
print("💡 Vérifiez que le frontend est démarré avec 'npm start'")
return False
return True
def test_static_catalog():
"""Test du catalogue statique"""
print("\n📚 Test du Catalogue Statique")
print("=" * 50)
# Vérifier le fichier de catalogue statique
static_catalog_path = Path("visual_workflow_builder/frontend/src/data/staticCatalog.ts")
if not static_catalog_path.exists():
print(f"❌ Fichier catalogue statique non trouvé: {static_catalog_path}")
return False
print("✅ Fichier catalogue statique trouvé")
# Lire le contenu pour vérifier les actions
try:
content = static_catalog_path.read_text(encoding='utf-8')
# Vérifier la présence d'actions clés
key_actions = ['navigate_to_url', 'click_anchor', 'type_text']
found_actions = []
for action in key_actions:
if f"'{action}'" in content or f'"{action}"' in content:
found_actions.append(action)
print(f"📋 Actions trouvées dans le catalogue statique:")
for action in found_actions:
print(f"{action}")
missing_actions = set(key_actions) - set(found_actions)
if missing_actions:
print(f"❌ Actions manquantes:")
for action in missing_actions:
print(f"{action}")
return len(missing_actions) == 0
except Exception as e:
print(f"❌ Erreur lecture catalogue statique: {e}")
return False
def create_test_workflow():
"""Crée un workflow de test pour vérifier les propriétés"""
print("\n🧪 Création d'un Workflow de Test")
print("=" * 50)
# Workflow de test avec différents types d'étapes
test_workflow = {
"id": "test_proprietes_workflow",
"name": "Test Propriétés VWB",
"description": "Workflow pour tester l'affichage des propriétés",
"steps": [
{
"id": "step_navigate",
"type": "navigate_to_url",
"name": "Naviguer vers URL",
"position": {"x": 100, "y": 100},
"data": {
"isVWBCatalogAction": True,
"vwbActionId": "navigate_to_url",
"parameters": {
"url": "https://example.com"
}
}
},
{
"id": "step_click",
"type": "click_anchor",
"name": "Cliquer sur élément",
"position": {"x": 100, "y": 200},
"data": {
"isVWBCatalogAction": True,
"vwbActionId": "click_anchor",
"parameters": {
"visual_anchor": None
}
}
},
{
"id": "step_type",
"type": "type_text",
"name": "Saisir texte",
"position": {"x": 100, "y": 300},
"data": {
"isVWBCatalogAction": True,
"vwbActionId": "type_text",
"parameters": {
"visual_anchor": None,
"text": "Hello World"
}
}
},
{
"id": "step_standard",
"type": "click",
"name": "Clic standard",
"position": {"x": 100, "y": 400},
"data": {
"parameters": {
"target": None,
"clickType": "left"
}
}
}
],
"connections": []
}
# Sauvegarder le workflow de test
test_file = Path("test_workflow_proprietes.json")
try:
with open(test_file, 'w', encoding='utf-8') as f:
json.dump(test_workflow, f, indent=2, ensure_ascii=False)
print(f"✅ Workflow de test créé: {test_file}")
print("💡 Importez ce workflow dans l'interface pour tester")
# Afficher les instructions
print("\n📋 Instructions de test:")
print("1. Ouvrez l'interface VWB (http://localhost:3000)")
print("2. Importez le workflow test_workflow_proprietes.json")
print("3. Sélectionnez chaque étape et vérifiez les propriétés:")
print(" - step_navigate: Devrait afficher VWBActionProperties")
print(" - step_click: Devrait afficher VWBActionProperties")
print(" - step_type: Devrait afficher VWBActionProperties")
print(" - step_standard: Devrait afficher StandardParametersEditor")
return True
except Exception as e:
print(f"❌ Erreur création workflow de test: {e}")
return False
def main():
"""Fonction principale"""
print("🔧 Test Complet de Configuration des Outils VWB")
print("=" * 60)
print("Auteur : Dom, Alice, Kiro - 12 janvier 2026")
print("=" * 60)
# Tests séquentiels
tests = [
("Backend VWB", test_backend_vwb),
("Catalogue Statique", test_static_catalog),
("Connexion Frontend", test_frontend_connection),
("Workflow de Test", create_test_workflow)
]
results = {}
for test_name, test_func in tests:
print(f"\n🧪 Exécution: {test_name}")
try:
results[test_name] = test_func()
except Exception as e:
print(f"❌ Erreur inattendue dans {test_name}: {e}")
results[test_name] = False
# Résumé des résultats
print("\n" + "=" * 60)
print("📊 RÉSUMÉ DES TESTS")
print("=" * 60)
passed = 0
total = len(tests)
for test_name, result in results.items():
status = "✅ PASSÉ" if result else "❌ ÉCHEC"
print(f"{status} - {test_name}")
if result:
passed += 1
print(f"\n🎯 Résultat global: {passed}/{total} tests passés")
if passed == total:
print("🎉 Tous les tests sont passés !")
print("💡 Si les propriétés ne s'affichent toujours pas, vérifiez:")
print(" 1. Les logs de la console du navigateur")
print(" 2. L'onglet Network pour les requêtes API")
print(" 3. Les erreurs TypeScript dans la compilation")
else:
print("⚠️ Certains tests ont échoué. Corrigez les problèmes identifiés.")
return passed == total
if __name__ == "__main__":
success = main()
sys.exit(0 if success else 1)