use std::time::Duration;
use chromiumoxide::Page;
use chromiumoxide::element::Element;
use kodegen_mcp_schema::McpError;
pub async fn wait_for_element(
page: &Page,
selector: &str,
timeout: Duration,
) -> Result<Element, McpError> {
let start = std::time::Instant::now();
let mut poll_interval = Duration::from_millis(100); let max_interval = Duration::from_secs(1);
loop {
if let Ok(element) = page.find_element(selector).await {
return Ok(element);
}
if start.elapsed() >= timeout {
return Err(McpError::Other(anyhow::anyhow!(
"Element not found (timeout after {}ms): '{}'. \
Try: (1) Verify selector is correct using browser dev tools, \
(2) Ensure element is visible and loaded, \
(3) Increase timeout_ms parameter.",
timeout.as_millis(),
selector
)));
}
tokio::time::sleep(poll_interval).await;
poll_interval = (poll_interval * 2).min(max_interval);
}
}