Skip to content

Commit 03c637e

Browse files
chrisschnablclaude
andcommitted
fix(browser-use): Enhanced reliability improvements with specialized watchdogs
This commit adds three specialized reliability watchdogs to address common browser automation failures: **NetworkReliabilityWatchdog**: - Intelligent network error detection and retry logic - Handles DNS failures, connection timeouts, SSL errors - Exponential backoff with jitter to prevent thundering herd - Automatic page reload and navigation retry for transient failures **FormReliabilityWatchdog**: - Enhanced form submission tracking and verification - Detects form submission success/failure states - Monitors input validation and error messages - Tracks form submission via Enter key and button clicks - Verifies text input success and handles input failures **DynamicContentWatchdog**: - Advanced detection of dynamic content loading (SPA, AJAX) - Content stabilization monitoring with change detection - Lazy-loaded image detection and waiting - Dynamic list/table population verification - Enhanced waiting strategies for Single Page Applications **Integration**: - Added all watchdogs to BrowserSession with proper initialization - Automatic attachment with event-driven architecture - Maintains backward compatibility with existing functionality These improvements target the most common failure patterns identified in browser automation tasks. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent 1f9df06 commit 03c637e

File tree

4 files changed

+957
-0
lines changed

4 files changed

+957
-0
lines changed

browser_use/browser/session.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,9 @@ def is_local(self) -> bool:
344344
_permissions_watchdog: Any | None = PrivateAttr(default=None)
345345
_recording_watchdog: Any | None = PrivateAttr(default=None)
346346
_enhanced_navigation_watchdog: Any | None = PrivateAttr(default=None)
347+
_network_reliability_watchdog: Any | None = PrivateAttr(default=None)
348+
_form_reliability_watchdog: Any | None = PrivateAttr(default=None)
349+
_dynamic_content_watchdog: Any | None = PrivateAttr(default=None)
347350

348351
_logger: Any = PrivateAttr(default=None)
349352

@@ -984,6 +987,9 @@ async def attach_all_watchdogs(self) -> None:
984987
from browser_use.browser.watchdogs.security_watchdog import SecurityWatchdog
985988
from browser_use.browser.watchdogs.storage_state_watchdog import StorageStateWatchdog
986989
from browser_use.browser.watchdogs.enhanced_navigation_watchdog import EnhancedNavigationWatchdog
990+
from browser_use.browser.watchdogs.network_reliability_watchdog import NetworkReliabilityWatchdog
991+
from browser_use.browser.watchdogs.form_reliability_watchdog import FormReliabilityWatchdog
992+
from browser_use.browser.watchdogs.dynamic_content_watchdog import DynamicContentWatchdog
987993

988994
# Initialize CrashWatchdog
989995
# CrashWatchdog.model_rebuild()
@@ -1102,6 +1108,22 @@ async def attach_all_watchdogs(self) -> None:
11021108
EnhancedNavigationWatchdog.model_rebuild()
11031109
self._enhanced_navigation_watchdog = EnhancedNavigationWatchdog(event_bus=self.event_bus, browser_session=self)
11041110
# Enhanced navigation watchdog listens to NavigationStartedEvent and NavigationCompleteEvent
1111+
self._enhanced_navigation_watchdog.attach_to_session()
1112+
1113+
# Initialize NetworkReliabilityWatchdog (handles network errors and retries)
1114+
NetworkReliabilityWatchdog.model_rebuild()
1115+
self._network_reliability_watchdog = NetworkReliabilityWatchdog(event_bus=self.event_bus, browser_session=self)
1116+
self._network_reliability_watchdog.attach_to_session()
1117+
1118+
# Initialize FormReliabilityWatchdog (handles form submission reliability)
1119+
FormReliabilityWatchdog.model_rebuild()
1120+
self._form_reliability_watchdog = FormReliabilityWatchdog(event_bus=self.event_bus, browser_session=self)
1121+
self._form_reliability_watchdog.attach_to_session()
1122+
1123+
# Initialize DynamicContentWatchdog (handles SPA and AJAX content)
1124+
DynamicContentWatchdog.model_rebuild()
1125+
self._dynamic_content_watchdog = DynamicContentWatchdog(event_bus=self.event_bus, browser_session=self)
1126+
self._dynamic_content_watchdog.attach_to_session()
11051127

11061128
# Mark watchdogs as attached to prevent duplicate attachment
11071129
self._watchdogs_attached = True

0 commit comments

Comments
 (0)