Improve ChromeDriver connection reliability with retry loop

- Replace simple 1.5s sleep with retry loop (10 attempts, 200ms apart)
- Better error reporting showing number of attempts
- More robust handling of ChromeDriver startup timing
This commit is contained in:
Dhanji R. Prasanna
2025-12-15 16:57:15 +11:00
parent 3d1b86d24b
commit d142cdfffe

View File

@@ -5597,23 +5597,37 @@ impl<W: UiWriter> Agent<W> {
} }
}; };
// Wait for chromedriver to start up // Wait for chromedriver to be ready with retry loop
tokio::time::sleep(tokio::time::Duration::from_millis(1000)).await; let max_retries = 10;
let mut last_error = None;
// Connect to ChromeDriver in headless mode for attempt in 0..max_retries {
match g3_computer_control::ChromeDriver::with_port_headless(port).await { // Wait before each attempt (200ms between retries, total max ~2s)
Ok(driver) => { tokio::time::sleep(tokio::time::Duration::from_millis(200)).await;
let session = std::sync::Arc::new(tokio::sync::Mutex::new(WebDriverSession::Chrome(driver)));
*self.webdriver_session.write().await = Some(session);
*self.webdriver_process.write().await = Some(webdriver_process);
Ok("✅ WebDriver session started successfully! Chrome is running in headless mode (no visible window).".to_string()) // Try to connect to ChromeDriver in headless mode
} match g3_computer_control::ChromeDriver::with_port_headless(port).await {
Err(e) => { Ok(driver) => {
let _ = webdriver_process.kill().await; let session = std::sync::Arc::new(tokio::sync::Mutex::new(WebDriverSession::Chrome(driver)));
Ok(format!("❌ Failed to connect to ChromeDriver: {}\n\nThis might be because:\n - Chrome is not installed\n - ChromeDriver version doesn't match Chrome version\n - Port {} is already in use\n\nMake sure Chrome and ChromeDriver are installed and compatible.", e, port)) *self.webdriver_session.write().await = Some(session);
*self.webdriver_process.write().await = Some(webdriver_process);
return Ok("✅ WebDriver session started successfully! Chrome is running in headless mode (no visible window).".to_string());
}
Err(e) => {
last_error = Some(e);
if attempt < max_retries - 1 {
// Continue retrying
continue;
}
}
} }
} }
// All retries failed
let _ = webdriver_process.kill().await;
let error_msg = last_error.map(|e| e.to_string()).unwrap_or_else(|| "Unknown error".to_string());
Ok(format!("❌ Failed to connect to ChromeDriver after {} attempts: {}\n\nThis might be because:\n - Chrome is not installed\n - ChromeDriver version doesn't match Chrome version\n - Port {} is already in use\n\nMake sure Chrome and ChromeDriver are installed and compatible.", max_retries, error_msg, port))
} }
} }
} }