fix: correct browsertime JSON paths for LCP, FCP, TTFB, navigation timings

- LCP/TTFB/TBT: read from statistics.googleWebVitals (flat median values)
- FCP: statistics.timings.paintTiming['first-contentful-paint']
- pageTimings: nested under statistics.timings.pageTimings, not at root
- Remove PerceptualSpeedIndex (not present in this sitespeed version)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-07 11:46:00 +02:00
parent 7865252fa2
commit 148a2fc43a
2 changed files with 15 additions and 15 deletions

View File

@@ -80,26 +80,27 @@ export async function parseResults(outputFolder, _url) {
console.log('[parser] browsertime statistics keys:', s ? Object.keys(s).join(', ') : 'NONE');
if (s) {
metrics.lcp = med(safe(s, 'timings', 'largestContentfulPaint'));
metrics.fcp = med(safe(s, 'paintTiming', 'first-contentful-paint'));
// Core Web Vitals — use googleWebVitals aggregate (flat, direct median)
metrics.lcp = med(safe(s, 'googleWebVitals', 'largestContentfulPaint'));
metrics.fcp = med(safe(s, 'timings', 'paintTiming', 'first-contentful-paint'));
metrics.cls = med(safe(s, 'pageinfo', 'cumulativeLayoutShift'));
metrics.tbt = med(safe(s, 'cpu', 'longTasks', 'totalBlockingTime'));
metrics.ttfb = med(safe(s, 'pageTimings', 'backEndTime'));
metrics.tbt = med(safe(s, 'googleWebVitals', 'totalBlockingTime'));
metrics.ttfb = med(safe(s, 'googleWebVitals', 'ttfb'));
metrics.max_potential_fid = med(safe(s, 'cpu', 'longTasks', 'maxPotentialFid'));
metrics.page_load_time = med(safe(s, 'pageTimings', 'pageLoadTime'));
// Navigation timings — pageTimings is nested under statistics.timings
metrics.page_load_time = med(safe(s, 'timings', 'pageTimings', 'pageLoadTime'));
metrics.fully_loaded = med(safe(s, 'timings', 'fullyLoaded'));
metrics.dom_content_loaded = med(safe(s, 'pageTimings', 'domContentLoadedTime'));
metrics.dom_interactive = med(safe(s, 'pageTimings', 'domInteractiveTime'));
metrics.front_end_time = med(safe(s, 'pageTimings', 'frontEndTime'));
metrics.back_end_time = med(safe(s, 'pageTimings', 'backEndTime'));
metrics.dom_content_loaded = med(safe(s, 'timings', 'pageTimings', 'domContentLoadedTime'));
metrics.dom_interactive = med(safe(s, 'timings', 'pageTimings', 'domInteractiveTime'));
metrics.front_end_time = med(safe(s, 'timings', 'pageTimings', 'frontEndTime'));
metrics.back_end_time = med(safe(s, 'timings', 'pageTimings', 'backEndTime'));
metrics.time_to_first_byte = metrics.ttfb;
metrics.speed_index = med(safe(s, 'visualMetrics', 'SpeedIndex'));
metrics.first_visual_change = med(safe(s, 'visualMetrics', 'FirstVisualChange'));
metrics.last_visual_change = med(safe(s, 'visualMetrics', 'LastVisualChange'));
metrics.visual_complete_85 = med(safe(s, 'visualMetrics', 'VisualComplete85'));
metrics.perceptual_speed_index = med(safe(s, 'visualMetrics', 'PerceptualSpeedIndex'));
metrics.speed_index = med(safe(s, 'visualMetrics', 'SpeedIndex'));
metrics.first_visual_change = med(safe(s, 'visualMetrics', 'FirstVisualChange'));
metrics.last_visual_change = med(safe(s, 'visualMetrics', 'LastVisualChange'));
metrics.visual_complete_85 = med(safe(s, 'visualMetrics', 'VisualComplete85'));
metrics.long_tasks_count = med(safe(s, 'cpu', 'longTasks', 'tasks'));
metrics.long_tasks_duration = med(safe(s, 'cpu', 'longTasks', 'totalDuration'));