{"record":{"id":"641f24f7c39ce927","repo":"RightNow-AI/openfang","slug":"click-failed-e","errorCode":null,"errorMessage":"Click failed: {e}","messagePattern":"Click failed: (.+?)","errorType":"http","errorClass":"BrowserResponse","httpStatus":null,"severity":"error","filePath":"crates/openfang-runtime/src/browser.rs","lineNumber":479,"sourceCode":"                    .and_then(|s| serde_json::from_str(s).ok())\n                    .unwrap_or(val);\n                if parsed[\"success\"].as_bool() == Some(false) {\n                    return BrowserResponse::err(\n                        parsed[\"error\"]\n                            .as_str()\n                            .unwrap_or(\"Click failed\")\n                            .to_string(),\n                    );\n                }\n                // Wait briefly for any navigation triggered by click\n                tokio::time::sleep(Duration::from_millis(500)).await;\n                self.wait_for_load().await;\n                match self.page_info().await {\n                    Ok(info) => BrowserResponse::ok(info),\n                    Err(_) => BrowserResponse::ok(parsed),\n                }\n            }\n            Err(e) => BrowserResponse::err(format!(\"Click failed: {e}\")),\n        }\n    }\n\n    async fn cmd_type(&self, selector: &str, text: &str) -> BrowserResponse {\n        let sel_json = serde_json::to_string(selector).unwrap_or_default();\n        let text_json = serde_json::to_string(text).unwrap_or_default();\n        let js = format!(\n            r#\"(() => {{\n    let sel = {sel_json};\n    let txt = {text_json};\n    let el = document.querySelector(sel);\n    if (!el) return JSON.stringify({{success: false, error: 'Input not found: ' + sel}});\n    el.focus();\n    el.value = txt;\n    el.dispatchEvent(new Event('input', {{bubbles: true}}));\n    el.dispatchEvent(new Event('change', {{bubbles: true}}));\n    return JSON.stringify({{success: true, selector: sel, typed: txt.length + ' chars'}});\n}})()\"#","sourceCodeStart":461,"sourceCodeEnd":497,"githubUrl":"https://github.com/RightNow-AI/openfang/blob/acf2587e46be174c10200489c9a2d23a39a98aeb/crates/openfang-runtime/src/browser.rs#L461-L497","documentation":"This is the CDP-transport-level click failure: the run_js call inside cmd_click returned Err, meaning the script never executed — the CDP connection itself failed rather than the click logic reporting failure. The inner CDP error is interpolated into the message.","triggerScenarios":"self.cdp.run_js(click_script) resolves to Err: browser disconnected, target/context closed, evaluation timed out, or the CDP session died between navigate and click.","commonSituations":"Headless Chrome crashed or was killed between commands; navigation destroyed the execution context while the click JS was being evaluated; CDP websocket dropped.","solutions":["Read the interpolated {e} for the underlying cause (disconnected, context destroyed, timeout).","Reconnect or restart the browser session and retry the click.","Re-navigate if the execution context was destroyed by an in-flight navigation.","Wrap click in retry logic with a small backoff for transient CDP drops."],"exampleFix":"// before\nlet resp = browser.execute(\"click\", selector).await?;\n// after\nlet resp = match browser.execute(\"click\", selector).await {\n    Ok(r) if r.success => r,\n    Ok(r) => return Err(anyhow!(r.error)),\n    Err(e) => {\n        browser.reconnect().await?;\n        browser.execute(\"click\", selector).await?\n    }\n};","handlingStrategy":"retry","validationCode":"// Check session liveness before clicking:\nif !browser.is_connected().await { browser.reconnect().await?; }","typeGuard":"fn is_cdp_transport_err(e: &anyhow::Error) -> bool {\n    let s = e.to_string();\n    s.contains(\"connection\") || s.contains(\"closed\") || s.contains(\"context\")\n}","tryCatchPattern":"// Rust\nmatch browser.execute(\"click\", selector).await {\n    Ok(r) if r.success => Ok(r),\n    Ok(r) => Err(anyhow!(r.error)),\n    Err(e) if is_cdp_transport_err(&e) => {\n        browser.reconnect().await?;\n        browser.execute(\"click\", selector).await.map_err(Into::into)\n    }\n    Err(e) => Err(e.into()),\n}","preventionTips":["Serialize browser commands; never click while a navigation is in flight.","Supervise the headless browser process and reconnect on death.","Set explicit CDP evaluation timeouts and retry on timeout.","Log the interpolated inner error to distinguish transport vs selector failures."],"tags":["cdp","click","transport-error"],"backgroundTag":"cdp-command-failed","analyzedSha":"acf2587e46be174c10200489c9a2d23a39a98aeb","analyzedAt":"2026-09-02T22:42:28.464Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}