manage-your-printer/utils/test_button_functionality.py
2025-06-04 10:03:22 +02:00

243 lines
8.6 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Test-Skript für Button-Funktionalitäten
Testet alle Buttons aus dem Selenium-Test auf echte Funktionalität
"""
import requests
import time
import json
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
class ButtonFunctionalityTester:
def __init__(self, base_url="http://127.0.0.1:5000"):
self.base_url = base_url
self.session = requests.Session()
self.driver = None
def setup_driver(self):
"""Selenium WebDriver einrichten"""
try:
self.driver = webdriver.Chrome()
self.driver.set_window_size(1696, 1066)
print("✅ WebDriver erfolgreich initialisiert")
except Exception as e:
print(f"❌ Fehler beim Initialisieren des WebDrivers: {e}")
def login(self, username="admin", password="admin"):
"""Anmeldung durchführen"""
try:
self.driver.get(f"{self.base_url}/auth/login")
# Warten bis Login-Formular geladen ist
username_field = WebDriverWait(self.driver, 10).until(
EC.presence_of_element_located((By.NAME, "username"))
)
username_field.send_keys(username)
self.driver.find_element(By.NAME, "password").send_keys(password)
self.driver.find_element(By.XPATH, "//button[@type='submit']").click()
# Warten bis Dashboard geladen ist
WebDriverWait(self.driver, 10).until(
EC.url_contains("/dashboard")
)
print("✅ Erfolgreich angemeldet")
return True
except Exception as e:
print(f"❌ Fehler bei der Anmeldung: {e}")
return False
def test_button_functionality(self, button_selector, button_name, expected_action=""):
"""Teste einen einzelnen Button auf Funktionalität"""
try:
print(f"\n🔍 Teste Button: {button_name} ({button_selector})")
# Button finden
button = WebDriverWait(self.driver, 5).until(
EC.element_to_be_clickable((By.CSS_SELECTOR, button_selector))
)
# Ursprünglichen Zustand erfassen
original_url = self.driver.current_url
original_text = button.text if button.text else "Kein Text"
print(f" 📍 Button gefunden: '{original_text}'")
# Button klicken
button.click()
print(f" 👆 Button geklickt")
# Kurz warten für Reaktion
time.sleep(1)
# Reaktion prüfen
reactions = []
# URL-Änderung prüfen
if self.driver.current_url != original_url:
reactions.append(f"URL-Änderung: {self.driver.current_url}")
# Modal-Fenster prüfen
try:
modal = self.driver.find_element(By.CSS_SELECTOR, ".fixed.inset-0")
if modal.is_displayed():
reactions.append("Modal-Fenster geöffnet")
except:
pass
# Loading-Spinner prüfen
try:
spinner = self.driver.find_element(By.CSS_SELECTOR, ".animate-spin")
if spinner.is_displayed():
reactions.append("Loading-Animation aktiv")
except:
pass
# Toast-Benachrichtigung prüfen
try:
toast = self.driver.find_element(By.CSS_SELECTOR, ".fixed.top-4.right-4")
if toast.is_displayed():
reactions.append(f"Toast-Nachricht: {toast.text}")
except:
pass
# Button-Text-Änderung prüfen
new_text = button.text if button.text else "Kein Text"
if new_text != original_text:
reactions.append(f"Text-Änderung: '{original_text}''{new_text}'")
# Ergebnis ausgeben
if reactions:
print(f" ✅ Reaktionen gefunden:")
for reaction in reactions:
print(f" - {reaction}")
return True
else:
print(f" ⚠️ Keine sichtbare Reaktion erkannt")
return False
except Exception as e:
print(f" ❌ Fehler beim Testen: {e}")
return False
def test_all_buttons(self):
"""Teste alle Buttons aus dem Selenium-Test"""
if not self.setup_driver():
return
if not self.login():
return
# Button-Test-Plan basierend auf Selenium-Test
button_tests = [
# Dashboard-Seite (Startseite)
{
"page": f"{self.base_url}/",
"buttons": [
(".mb-8 > .btn-primary", "Haupt-CTA Button"),
(".btn-primary > span", "CTA Button Span")
]
},
# Dashboard-Seite
{
"page": f"{self.base_url}/dashboard",
"buttons": [
("#refreshDashboard > span", "Dashboard Aktualisieren")
]
},
# Drucker-Seite
{
"page": f"{self.base_url}/printers",
"buttons": [
("#refresh-button > span", "Drucker Aktualisieren"),
("#maintenance-toggle > span", "Wartungsmodus Toggle")
]
},
# Jobs-Seite
{
"page": f"{self.base_url}/jobs",
"buttons": [
("#batch-toggle > span", "Mehrfachauswahl Toggle"),
("#refresh-button > span", "Jobs Aktualisieren")
]
},
# Admin-Seite
{
"page": f"{self.base_url}/admin",
"buttons": [
("#analytics-btn", "Analytics Button"),
("#maintenance-btn", "Wartung Button"),
("#system-status-btn", "System Status Button"),
("#add-user-btn", "Benutzer hinzufügen")
]
}
]
results = {"total": 0, "working": 0, "broken": 0}
print("🚀 Starte umfassenden Button-Funktionalitäts-Test...\n")
for test_group in button_tests:
print(f"📄 Navigiere zu Seite: {test_group['page']}")
try:
self.driver.get(test_group["page"])
time.sleep(2) # Seite laden lassen
for selector, name in test_group["buttons"]:
results["total"] += 1
if self.test_button_functionality(selector, name):
results["working"] += 1
else:
results["broken"] += 1
except Exception as e:
print(f"❌ Fehler beim Laden der Seite {test_group['page']}: {e}")
# Zusammenfassung
print(f"\n{'='*60}")
print(f"📊 TEST-ZUSAMMENFASSUNG")
print(f"{'='*60}")
print(f"Getestete Buttons gesamt: {results['total']}")
print(f"✅ Funktional: {results['working']}")
print(f"❌ Nicht funktional: {results['broken']}")
success_rate = (results['working'] / results['total']) * 100 if results['total'] > 0 else 0
print(f"📈 Erfolgsrate: {success_rate:.1f}%")
if success_rate >= 90:
print("🎉 AUSGEZEICHNET! Fast alle Buttons funktionieren korrekt.")
elif success_rate >= 75:
print("✅ GUT! Die meisten Buttons funktionieren korrekt.")
elif success_rate >= 50:
print("⚠️ BEFRIEDIGEND! Einige Buttons benötigen noch Verbesserungen.")
else:
print("❌ VERBESSERUNG ERFORDERLICH! Viele Buttons haben keine Funktionalität.")
def cleanup(self):
"""Aufräumen"""
if self.driver:
self.driver.quit()
print("🧹 WebDriver beendet")
def main():
"""Hauptfunktion"""
tester = ButtonFunctionalityTester()
try:
tester.test_all_buttons()
finally:
tester.cleanup()
if __name__ == "__main__":
main()