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>
This commit is contained in:
360
scripts/test_frontend_proprietes_vwb_10jan2026.py
Normal file
360
scripts/test_frontend_proprietes_vwb_10jan2026.py
Normal file
@@ -0,0 +1,360 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test Frontend Propriétés VWB - Validation de l'affichage dans l'interface
|
||||
Auteur : Dom, Alice, Kiro - 10 janvier 2026
|
||||
|
||||
Ce script démarre le frontend avec le composant de test et valide
|
||||
l'affichage des propriétés d'étapes VWB.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import time
|
||||
import requests
|
||||
import subprocess
|
||||
import webbrowser
|
||||
from pathlib import Path
|
||||
from typing import Dict, List, Any, Optional
|
||||
|
||||
# Configuration
|
||||
VWB_BACKEND_URL = "http://localhost:5004"
|
||||
VWB_FRONTEND_URL = "http://localhost:3000"
|
||||
TEST_COMPONENT_URL = f"{VWB_FRONTEND_URL}/test-properties"
|
||||
|
||||
class VWBFrontendTesteur:
|
||||
"""Testeur pour l'interface frontend VWB"""
|
||||
|
||||
def __init__(self):
|
||||
self.backend_url = VWB_BACKEND_URL
|
||||
self.frontend_url = VWB_FRONTEND_URL
|
||||
self.backend_process = None
|
||||
self.frontend_process = None
|
||||
|
||||
def verifier_backend(self) -> bool:
|
||||
"""Vérifier que le backend est disponible"""
|
||||
print("🔍 Vérification du backend...")
|
||||
|
||||
try:
|
||||
response = requests.get(f"{self.backend_url}/health", timeout=5)
|
||||
if response.status_code == 200:
|
||||
health_data = response.json()
|
||||
actions_count = health_data.get('services', {}).get('actions', 0)
|
||||
print(f"✅ Backend disponible - {actions_count} actions")
|
||||
return True
|
||||
else:
|
||||
print(f"❌ Backend répond avec code {response.status_code}")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ Backend non accessible: {e}")
|
||||
return False
|
||||
|
||||
def demarrer_backend(self) -> bool:
|
||||
"""Démarrer le backend si nécessaire"""
|
||||
if self.verifier_backend():
|
||||
return True
|
||||
|
||||
print("🚀 Démarrage du backend VWB...")
|
||||
|
||||
try:
|
||||
# Changer vers le répertoire VWB
|
||||
vwb_dir = Path("visual_workflow_builder")
|
||||
if not vwb_dir.exists():
|
||||
print("❌ Répertoire visual_workflow_builder non trouvé")
|
||||
return False
|
||||
|
||||
# Démarrer le backend
|
||||
backend_script = vwb_dir / "backend" / "app_catalogue_simple.py"
|
||||
if not backend_script.exists():
|
||||
print("❌ Script backend non trouvé")
|
||||
return False
|
||||
|
||||
# Commande pour démarrer le backend
|
||||
cmd = [
|
||||
sys.executable, "-m", "backend.app_catalogue_simple"
|
||||
]
|
||||
|
||||
print(f"Commande: {' '.join(cmd)}")
|
||||
print(f"Répertoire: {vwb_dir.absolute()}")
|
||||
|
||||
# Démarrer en arrière-plan
|
||||
self.backend_process = subprocess.Popen(
|
||||
cmd,
|
||||
cwd=vwb_dir,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True
|
||||
)
|
||||
|
||||
# Attendre que le backend démarre
|
||||
print("⏳ Attente du démarrage du backend...")
|
||||
for i in range(30): # 30 secondes max
|
||||
time.sleep(1)
|
||||
if self.verifier_backend():
|
||||
print("✅ Backend démarré avec succès")
|
||||
return True
|
||||
print(f" Tentative {i+1}/30...")
|
||||
|
||||
print("❌ Timeout démarrage backend")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur démarrage backend: {e}")
|
||||
return False
|
||||
|
||||
def modifier_app_pour_test(self) -> bool:
|
||||
"""Modifier App.tsx pour inclure le composant de test"""
|
||||
print("🔧 Modification de App.tsx pour inclure le test...")
|
||||
|
||||
app_file = Path("visual_workflow_builder/frontend/src/App.tsx")
|
||||
if not app_file.exists():
|
||||
print("❌ Fichier App.tsx non trouvé")
|
||||
return False
|
||||
|
||||
try:
|
||||
# Lire le contenu actuel
|
||||
with open(app_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Vérifier si le test est déjà ajouté
|
||||
if 'TestPropertiesPanel' in content:
|
||||
print("✅ Composant de test déjà intégré")
|
||||
return True
|
||||
|
||||
# Ajouter l'import du composant de test
|
||||
import_line = "import TestPropertiesPanel from './components/TestPropertiesPanel';"
|
||||
|
||||
# Trouver la ligne d'import React
|
||||
lines = content.split('\n')
|
||||
import_index = -1
|
||||
for i, line in enumerate(lines):
|
||||
if line.startswith('import React') or line.startswith('import {'):
|
||||
import_index = i
|
||||
break
|
||||
|
||||
if import_index >= 0:
|
||||
lines.insert(import_index + 1, import_line)
|
||||
else:
|
||||
lines.insert(0, import_line)
|
||||
|
||||
# Ajouter la route de test
|
||||
route_addition = '''
|
||||
{/* Route de test pour les propriétés VWB */}
|
||||
<Route path="/test-properties" element={<TestPropertiesPanel />} />'''
|
||||
|
||||
# Trouver où insérer la route
|
||||
route_inserted = False
|
||||
for i, line in enumerate(lines):
|
||||
if '<Routes>' in line and not route_inserted:
|
||||
lines.insert(i + 1, route_addition)
|
||||
route_inserted = True
|
||||
break
|
||||
|
||||
# Sauvegarder le fichier modifié
|
||||
modified_content = '\n'.join(lines)
|
||||
with open(app_file, 'w', encoding='utf-8') as f:
|
||||
f.write(modified_content)
|
||||
|
||||
print("✅ App.tsx modifié avec succès")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur modification App.tsx: {e}")
|
||||
return False
|
||||
|
||||
def demarrer_frontend(self) -> bool:
|
||||
"""Démarrer le frontend"""
|
||||
print("🚀 Démarrage du frontend VWB...")
|
||||
|
||||
try:
|
||||
frontend_dir = Path("visual_workflow_builder/frontend")
|
||||
if not frontend_dir.exists():
|
||||
print("❌ Répertoire frontend non trouvé")
|
||||
return False
|
||||
|
||||
# Vérifier que node_modules existe
|
||||
node_modules = frontend_dir / "node_modules"
|
||||
if not node_modules.exists():
|
||||
print("⏳ Installation des dépendances npm...")
|
||||
subprocess.run(["npm", "install"], cwd=frontend_dir, check=True)
|
||||
|
||||
# Démarrer le serveur de développement
|
||||
print("⏳ Démarrage du serveur de développement...")
|
||||
|
||||
env = os.environ.copy()
|
||||
env['BROWSER'] = 'none' # Empêcher l'ouverture automatique du navigateur
|
||||
|
||||
self.frontend_process = subprocess.Popen(
|
||||
["npm", "start"],
|
||||
cwd=frontend_dir,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE,
|
||||
text=True,
|
||||
env=env
|
||||
)
|
||||
|
||||
# Attendre que le frontend démarre
|
||||
print("⏳ Attente du démarrage du frontend...")
|
||||
for i in range(60): # 60 secondes max
|
||||
time.sleep(1)
|
||||
try:
|
||||
response = requests.get(self.frontend_url, timeout=2)
|
||||
if response.status_code == 200:
|
||||
print("✅ Frontend démarré avec succès")
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
print(f" Tentative {i+1}/60...")
|
||||
|
||||
print("❌ Timeout démarrage frontend")
|
||||
return False
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur démarrage frontend: {e}")
|
||||
return False
|
||||
|
||||
def ouvrir_page_test(self):
|
||||
"""Ouvrir la page de test dans le navigateur"""
|
||||
print("🌐 Ouverture de la page de test...")
|
||||
|
||||
test_url = f"{self.frontend_url}/test-properties"
|
||||
|
||||
try:
|
||||
webbrowser.open(test_url)
|
||||
print(f"✅ Page de test ouverte: {test_url}")
|
||||
except Exception as e:
|
||||
print(f"⚠️ Impossible d'ouvrir automatiquement le navigateur: {e}")
|
||||
print(f" Ouvrez manuellement: {test_url}")
|
||||
|
||||
def afficher_instructions(self):
|
||||
"""Afficher les instructions pour l'utilisateur"""
|
||||
print("\n" + "="*60)
|
||||
print("🎯 INSTRUCTIONS POUR TESTER LES PROPRIÉTÉS VWB")
|
||||
print("="*60)
|
||||
|
||||
print(f"\n1. 🌐 OUVRIR LA PAGE DE TEST")
|
||||
print(f" URL: {self.frontend_url}/test-properties")
|
||||
print(f" La page devrait s'ouvrir automatiquement dans votre navigateur")
|
||||
|
||||
print(f"\n2. 🧪 EXÉCUTER LES TESTS")
|
||||
print(f" - Cliquez sur 'Exécuter les Tests'")
|
||||
print(f" - Vérifiez que tous les tests sont verts ✅")
|
||||
print(f" - Si des tests échouent ❌, vérifiez la console du navigateur")
|
||||
|
||||
print(f"\n3. 👀 VÉRIFIER L'AFFICHAGE")
|
||||
print(f" - L'aperçu du Properties Panel doit s'afficher")
|
||||
print(f" - Les propriétés de l'action VWB doivent être visibles")
|
||||
print(f" - Les paramètres requis et optionnels doivent être listés")
|
||||
|
||||
print(f"\n4. 🎨 TESTER L'INTERACTION")
|
||||
print(f" - Changez l'action à tester avec les boutons")
|
||||
print(f" - Vérifiez que les propriétés changent selon l'action")
|
||||
print(f" - Testez la sélection d'ancres visuelles")
|
||||
|
||||
print(f"\n5. 🔧 DÉBOGUER SI NÉCESSAIRE")
|
||||
print(f" - Ouvrez les outils de développement (F12)")
|
||||
print(f" - Vérifiez la console pour les erreurs")
|
||||
print(f" - Vérifiez l'onglet Network pour les requêtes API")
|
||||
|
||||
print(f"\n📊 URLS IMPORTANTES:")
|
||||
print(f" - Backend API: {self.backend_url}")
|
||||
print(f" - Frontend: {self.frontend_url}")
|
||||
print(f" - Page de test: {self.frontend_url}/test-properties")
|
||||
print(f" - API Catalogue: {self.backend_url}/api/vwb/catalog/actions")
|
||||
|
||||
print(f"\n⏹️ ARRÊTER LES SERVICES:")
|
||||
print(f" - Appuyez sur Ctrl+C dans ce terminal")
|
||||
print(f" - Ou fermez cette fenêtre de terminal")
|
||||
|
||||
print("\n" + "="*60)
|
||||
|
||||
def nettoyer(self):
|
||||
"""Nettoyer les processus"""
|
||||
print("\n🧹 Nettoyage des processus...")
|
||||
|
||||
if self.frontend_process:
|
||||
try:
|
||||
self.frontend_process.terminate()
|
||||
self.frontend_process.wait(timeout=5)
|
||||
print("✅ Frontend arrêté")
|
||||
except:
|
||||
try:
|
||||
self.frontend_process.kill()
|
||||
print("✅ Frontend forcé à s'arrêter")
|
||||
except:
|
||||
print("⚠️ Impossible d'arrêter le frontend")
|
||||
|
||||
if self.backend_process:
|
||||
try:
|
||||
self.backend_process.terminate()
|
||||
self.backend_process.wait(timeout=5)
|
||||
print("✅ Backend arrêté")
|
||||
except:
|
||||
try:
|
||||
self.backend_process.kill()
|
||||
print("✅ Backend forcé à s'arrêter")
|
||||
except:
|
||||
print("⚠️ Impossible d'arrêter le backend")
|
||||
|
||||
def executer_test_complet(self):
|
||||
"""Exécuter le test complet"""
|
||||
print("🚀 TEST FRONTEND PROPRIÉTÉS VWB")
|
||||
print("=" * 50)
|
||||
|
||||
try:
|
||||
# Étape 1: Vérifier/démarrer le backend
|
||||
if not self.demarrer_backend():
|
||||
print("❌ Impossible de démarrer le backend")
|
||||
return False
|
||||
|
||||
# Étape 2: Modifier App.tsx pour inclure le test
|
||||
if not self.modifier_app_pour_test():
|
||||
print("❌ Impossible de modifier App.tsx")
|
||||
return False
|
||||
|
||||
# Étape 3: Démarrer le frontend
|
||||
if not self.demarrer_frontend():
|
||||
print("❌ Impossible de démarrer le frontend")
|
||||
return False
|
||||
|
||||
# Étape 4: Ouvrir la page de test
|
||||
self.ouvrir_page_test()
|
||||
|
||||
# Étape 5: Afficher les instructions
|
||||
self.afficher_instructions()
|
||||
|
||||
# Étape 6: Attendre l'arrêt manuel
|
||||
try:
|
||||
print("\n⏳ Services en cours d'exécution... Appuyez sur Ctrl+C pour arrêter")
|
||||
while True:
|
||||
time.sleep(1)
|
||||
except KeyboardInterrupt:
|
||||
print("\n🛑 Arrêt demandé par l'utilisateur")
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Erreur: {e}")
|
||||
return False
|
||||
finally:
|
||||
self.nettoyer()
|
||||
|
||||
def main():
|
||||
"""Fonction principale"""
|
||||
print("Test Frontend Propriétés VWB - 10 janvier 2026")
|
||||
print("Auteur : Dom, Alice, Kiro")
|
||||
print()
|
||||
|
||||
# Vérifier qu'on est dans le bon répertoire
|
||||
if not os.path.exists('visual_workflow_builder'):
|
||||
print("❌ Erreur: Exécuter depuis la racine du projet RPA Vision V3")
|
||||
sys.exit(1)
|
||||
|
||||
# Créer et exécuter le testeur
|
||||
testeur = VWBFrontendTesteur()
|
||||
succes = testeur.executer_test_complet()
|
||||
|
||||
sys.exit(0 if succes else 1)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user