class LCPUser(PlaywrightUser):
LCP_THRESHOLD = 1200 # ms
@task
@pw
async def check_lcp(self, page: PageWithRetry):
cdp = await self.browser_context.new_cdp_session(page)
await cdp.send('Network.enable')
await cdp.send('Network.emulateNetworkConditions', {
'offline': False,
'downloadThroughput': (1*1024*1024)/8,
'uploadThroughput': (1*1024*1024)/8,
'latency': 50,
})
start = time.time()
async with event(self, "Load home"):
await page.goto("/")
await page.wait_for_timeout(1000)
lcp = await page.evaluate("""
new Promise(r => {
new PerformanceObserver(l => r(l.getEntries().at(-1).startTime))
.observe({type:'largest-contentful-paint', buffered:true});
})
""")
self.environment.events.request.fire(
request_type="LCP",
name=f"LCP {'PASS' if lcp<=self.LCP_THRESHOLD else 'FAIL'}",
start_time=start,
response_time=lcp,
response_length=0,
context={**self.context()},
url="lcp_metric",
exception=None if lcp<=self.LCP_THRESHOLD else Exception(f"LCP {lcp:.0f}ms > {self.LCP_THRESHOLD}ms"),
)