You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:40:14