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

如何用chromedp获取FCP等性能指标?解决console.log返回undefined问题

解决chromedp中console.log返回undefined导致的报错问题

问题根源

你遇到的encountered an undefined value错误,本质是因为console.log()执行后会返回undefined,而你在调用chromedp.EvaluateAsDevTools时传入了&jscript变量,chromedp会尝试将脚本的返回值序列化并赋值给该变量,但undefined无法被Go的类型系统正常处理,因此触发报错。

具体解决方案

1. 不需要接收返回值时,直接传nil

如果只是想打印日志,不需要获取console.log的返回结果,把第三个EvaluateAsDevTools的第二个参数改成nil即可:

chromedp.EvaluateAsDevTools("const paintTimings = performance.getEntriesByType('paint');", nil),
chromedp.EvaluateAsDevTools("const fmp = paintTimings.find(({ name }) => name === \"first-contentful-paint\");", nil),
chromedp.EvaluateAsDevTools("console.log('First contentful paint at foo');", nil)

2. 直接获取FCP的实际数值(更推荐)

既然你的目标是获取FCP指标,没必要用console.log,直接返回FCP的时间值即可,同时避免返回undefined:

import (
    "context"
    "fmt"
    "github.com/chromedp/chromedp"
)

func main() {
    // 定义变量接收FCP时间(单位:毫秒)
    var fcpTime float64

    err := chromedp.Run(context.Background(),
        chromedp.Navigate("https://your-target-url.com"),
        // 合并脚本,直接返回FCP的startTime,找不到则返回null
        chromedp.EvaluateAsDevTools(`
            const paintTimings = performance.getEntriesByType('paint');
            const fcpEntry = paintTimings.find(entry => entry.name === 'first-contentful-paint');
            fcpEntry ? fcpEntry.startTime : null;
        `, &fcpTime),
    )

    if err != nil {
        panic(err)
    }

    fmt.Printf("First Contentful Paint: %.2fms\n", fcpTime)
}

3. 合并多个脚本调用(优化)

把多个独立的EvaluateAsDevTools调用合并成一个脚本,减少通信开销,代码更简洁:

import (
    "context"
    "fmt"
    "github.com/chromedp/chromedp"
)

func main() {
    // 用map接收完整的FCP条目信息
    var fcpInfo map[string]interface{}

    err := chromedp.Run(context.Background(),
        chromedp.Navigate("https://example.com"),
        chromedp.EvaluateAsDevTools(`
            const paintTimings = performance.getEntriesByType('paint');
            const fcpEntry = paintTimings.find(entry => entry.name === 'first-contentful-paint');
            fcpEntry ? {
                name: fcpEntry.name,
                startTime: fcpEntry.startTime,
                duration: fcpEntry.duration
            } : null;
        `, &fcpInfo),
    )

    if err != nil {
        panic(err)
    }

    fmt.Printf("FCP Details: %+v\n", fcpInfo)
}

内容的提问来源于stack exchange,提问作者Angelo van Cleef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:38