export_summary.txt wird nicht mehr erstellt
Dieser Commit ist enthalten in:
@ -71,7 +71,10 @@ class PlaywrightManager:
|
||||
self.browser = None
|
||||
self.context = None
|
||||
self.page = None
|
||||
|
||||
|
||||
# Feature 5: Flag für Disconnect-Tracking (verhindert doppelte Counter-Dekrementierung)
|
||||
self._browser_was_disconnected = False
|
||||
|
||||
# Zähler für Wiederhholungsversuche
|
||||
self.retry_counter = {}
|
||||
|
||||
@ -141,12 +144,29 @@ class PlaywrightManager:
|
||||
if self.page is not None:
|
||||
return self.page
|
||||
|
||||
# Feature 5: Reset Disconnect-Flag bei neuem Browser-Start
|
||||
self._browser_was_disconnected = False
|
||||
|
||||
# Feature 5: Browser-Instanz Schutz - Nur eine Instanz gleichzeitig
|
||||
if PlaywrightManager._active_count >= 1:
|
||||
raise RuntimeError(
|
||||
"Browser bereits aktiv. Nur eine Browser-Instanz gleichzeitig erlaubt. "
|
||||
"Beenden Sie den aktuellen Prozess."
|
||||
)
|
||||
# Safety-Check: Prüfe ob Counter "hängt" (Absturz-Schutz)
|
||||
# Wenn ProcessGuard NICHT locked ist, aber Counter > 0, dann ist Counter "tot"
|
||||
from utils.process_guard import get_guard
|
||||
guard = get_guard()
|
||||
|
||||
if not guard.is_locked():
|
||||
# Counter hängt! Process Guard ist frei, aber Counter sagt Browser läuft
|
||||
logger.warning(
|
||||
f"⚠️ SAFETY-RESET: _active_count war {PlaywrightManager._active_count}, "
|
||||
f"aber ProcessGuard ist nicht locked. Counter wird zurückgesetzt."
|
||||
)
|
||||
PlaywrightManager._active_count = 0
|
||||
else:
|
||||
# Guard ist locked UND Counter ist > 0 → echte parallele Instanz
|
||||
raise RuntimeError(
|
||||
"Browser bereits aktiv. Nur eine Browser-Instanz gleichzeitig erlaubt. "
|
||||
"Beenden Sie den aktuellen Prozess."
|
||||
)
|
||||
|
||||
try:
|
||||
self.playwright = sync_playwright().start()
|
||||
@ -257,6 +277,10 @@ class PlaywrightManager:
|
||||
# Event-Listener für Konsolen-Logs
|
||||
self.page.on("console", lambda msg: logger.debug(f"BROWSER CONSOLE: {msg.text}"))
|
||||
|
||||
# Feature 5: Browser-Disconnect-Handler registrieren (für manuelles Schließen)
|
||||
self.browser.on("disconnected", self._on_browser_disconnected)
|
||||
logger.debug("Browser-Disconnect-Handler registriert")
|
||||
|
||||
# Feature 5: Browser-Instanz Counter erhöhen
|
||||
PlaywrightManager._active_count += 1
|
||||
logger.info(f"Browser gestartet (aktive Instanzen: {PlaywrightManager._active_count})")
|
||||
@ -966,7 +990,33 @@ class PlaywrightManager:
|
||||
self.protection_applied = False
|
||||
self.protection_style = None
|
||||
logger.info("Browser-Schutz entfernt")
|
||||
|
||||
|
||||
def _on_browser_disconnected(self):
|
||||
"""
|
||||
Event-Handler: Wird aufgerufen wenn Browser-Verbindung getrennt wird.
|
||||
|
||||
Dekrementiert den aktiven Browser-Counter, auch wenn der Browser
|
||||
manuell geschlossen wurde (z.B. durch User-Klick auf X-Button).
|
||||
|
||||
Dies stellt sicher dass der Missbrauchs-Schutz korrekt funktioniert,
|
||||
selbst wenn close() nicht explizit aufgerufen wird.
|
||||
"""
|
||||
# Verhindere doppelte Dekrementierung
|
||||
if self._browser_was_disconnected:
|
||||
logger.debug("Browser bereits als disconnected markiert, überspringe Counter-Dekrementierung")
|
||||
return
|
||||
|
||||
self._browser_was_disconnected = True
|
||||
|
||||
if PlaywrightManager._active_count > 0:
|
||||
PlaywrightManager._active_count -= 1
|
||||
logger.info(
|
||||
f"🔌 Browser disconnected - Counter dekrementiert "
|
||||
f"(aktive Instanzen: {PlaywrightManager._active_count})"
|
||||
)
|
||||
else:
|
||||
logger.warning("Browser disconnected aber Counter war bereits 0")
|
||||
|
||||
def close(self):
|
||||
"""Schließt den Browser und gibt Ressourcen frei."""
|
||||
try:
|
||||
@ -1012,9 +1062,15 @@ class PlaywrightManager:
|
||||
self.playwright = None
|
||||
|
||||
# Feature 5: Browser-Instanz Counter dekrementieren
|
||||
if PlaywrightManager._active_count > 0:
|
||||
PlaywrightManager._active_count -= 1
|
||||
logger.info(f"Browser geschlossen (aktive Instanzen: {PlaywrightManager._active_count})")
|
||||
# (nur wenn nicht bereits durch disconnected-Event dekrementiert)
|
||||
if not self._browser_was_disconnected:
|
||||
if PlaywrightManager._active_count > 0:
|
||||
PlaywrightManager._active_count -= 1
|
||||
logger.info(f"Browser geschlossen (aktive Instanzen: {PlaywrightManager._active_count})")
|
||||
else:
|
||||
logger.warning("Browser-Counter war bereits 0 beim Schließen")
|
||||
else:
|
||||
logger.debug("Counter wurde bereits durch disconnected-Event dekrementiert")
|
||||
|
||||
logger.info("Browser-Sitzung erfolgreich geschlossen")
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren