Files
novalon-website/test-framework/shared/utils/performance/LighthouseRunner.ts
T
zhangxiang 602ed6a671 test(hooks): finalize mutation test improvements and release acceptance
- Raise use-swipe-gesture mutation score to 66.13% (target 65%+)
- Maintain use-reduced-motion mutation score at 76.32% (target 50%+)
- Fix use-reduced-motion.ts ESLint set-state-in-effect warning
- Add UJ-10 deep searcher journey (category browse → article read → content discovery)
- Add 40 new test files (analytics, detail, sections, ui, lib components)
- Update test-strategy-plan.md to v2.0 (sync test count to 1591)
- Sync README.md with final release metrics

Quality gates: TS 0 errors, ESLint 0 errors, 121 suites / 1591 tests passed
2026-08-02 19:39:27 +08:00

94 lines
2.9 KiB
TypeScript

// @ts-nocheck
import { Page } from '@playwright/test';
import { LighthouseResult } from '../../types';
export class LighthouseRunner {
constructor(private page: Page) {}
async runLighthouse(url: string): Promise<LighthouseResult> {
const results = await this.page.evaluate(async () => {
return new Promise<LighthouseResult>((resolve) => {
if (!(window as any).lighthouse) {
resolve({
performance: 0,
accessibility: 0,
bestPractices: 0,
seo: 0,
pwa: 0
});
return;
}
(window as any).lighthouse(url, {
onlyCategories: ['performance', 'accessibility', 'best-practices', 'seo', 'pwa']
}).then((result: any) => {
resolve({
performance: Math.round(result.categories.performance.score * 100),
accessibility: Math.round(result.categories.accessibility.score * 100),
bestPractices: Math.round(result.categories['best-practices'].score * 100),
seo: Math.round(result.categories.seo.score * 100),
pwa: Math.round(result.categories.pwa.score * 100)
});
});
});
});
return results;
}
async runPerformanceAudit(): Promise<{
score: number;
metrics: {
firstContentfulPaint: number;
largestContentfulPaint: number;
cumulativeLayoutShift: number;
firstInputDelay: number;
speedIndex: number;
};
}> {
const results = await this.page.evaluate(async () => {
return new Promise<{
score: number;
metrics: {
firstContentfulPaint: number;
largestContentfulPaint: number;
cumulativeLayoutShift: number;
firstInputDelay: number;
speedIndex: number;
};
}>((resolve) => {
if (!(window as any).lighthouse) {
resolve({
score: 0,
metrics: {
firstContentfulPaint: 0,
largestContentfulPaint: 0,
cumulativeLayoutShift: 0,
firstInputDelay: 0,
speedIndex: 0
}
});
return;
}
(window as any).lighthouse(window.location.href, {
onlyCategories: ['performance']
}).then((result: any) => {
resolve({
score: Math.round(result.categories.performance.score * 100),
metrics: {
firstContentfulPaint: result.audits['first-contentful-paint'].numericValue,
largestContentfulPaint: result.audits['largest-contentful-paint'].numericValue,
cumulativeLayoutShift: result.audits['cumulative-layout-shift'].numericValue,
firstInputDelay: result.audits['max-potential-fid'].numericValue,
speedIndex: result.audits['speed-index'].numericValue
}
});
});
});
});
return results;
}
}