如何用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
相关产品推荐
相关产品推荐

