使用chromiumoxide监听console.assert控制台错误消息
用chromiumoxide监听console.assert错误的实现方案
要收集chromiumoxide执行JS时的console.assert错误,核心是通过CDP的Console域监听messageAdded事件,以下是具体实现步骤和代码:
1. 依赖配置
首先在Cargo.toml中添加所需依赖:
[dependencies] chromiumoxide = { version = "0.12", features = ["tokio-runtime"] } tokio = { version = "1.0", features = ["full"] }
2. 完整实现代码
use chromiumoxide::{ browser::{Browser, BrowserConfig}, cdp::js_protocol::console::{EventMessageAdded, Message}, futures::StreamExt, }; #[tokio::main] async fn main() -> Result<(), Box<dyn std::error::Error>> { // 启动Chromium浏览器实例 let (browser, mut handler) = Browser::launch(BrowserConfig::default()).await?; // 启用Console和Runtime CDP域(必须先启用才能监听事件) handler.console.enable().await?; handler.runtime.enable().await?; // 订阅Console域的messageAdded事件,用于捕获控制台消息 let mut console_events = handler.on_event::<EventMessageAdded>().await?; // 启动后台任务持续监听并收集assert错误 tokio::spawn(async move { while let Some(event) = console_events.next().await { let msg = event.params.message; // 只筛选console.assert失败产生的消息 if msg.r#type == Message::TYPE_ASSERT { println!("捕获到console.assert错误:"); println!(" 错误提示: {}", msg.text); // 打印堆栈跟踪(如果存在) if let Some(stack) = msg.stack_trace { println!(" 堆栈信息:"); for frame in stack.call_frames { println!(" - {} ({}:{})", frame.function_name.unwrap_or("匿名函数".to_string()), frame.url.unwrap_or("未知路径".to_string()), frame.line_number ); } } } } }); // 创建空白页面用于执行JS let page = browser.new_page("about:blank").await?; // 执行包含console.assert的测试代码 page.evaluate(r#" // 两个故意失败的assert示例 console.assert(10 === 20, "数值不匹配:预期10,实际20"); console.assert(document.querySelector("#nonexistent") !== null, "未找到目标元素"); "#).await?; // 短暂等待,确保事件被完全捕获处理 tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; Ok(()) }
关键逻辑说明
- 启用CDP域:必须先调用
handler.console.enable()和handler.runtime.enable(),否则无法接收控制台事件。 - 监听事件:通过
handler.on_event::<EventMessageAdded>()订阅控制台消息事件,所有控制台输出(包括assert)都会触发这个事件。 - 筛选assert错误:console.assert失败时,消息的
type字段会被设为Assert,通过Message::TYPE_ASSERT常量可以精准筛选这类错误。 - 收集错误信息:从事件参数中提取
text(assert的自定义提示)和stack_trace(错误的调用堆栈),这两个字段是测试套件需要的核心错误信息。
内容的提问来源于stack exchange,提问作者Max888
相关产品推荐
相关产品推荐

