From 954e8478087441b0d56c8082b7c12be1e71119d7 Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Mon, 9 Nov 2026 22:01:10 +0100 Subject: [PATCH 1/2] Validate transition styles without waiting for the animation --- src/browser.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/browser.ts b/src/browser.ts index 5c5876f..5bbf6f5 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -11,8 +11,7 @@ import { isHtmlContentType, isLocalUrl, isValidUrl, - removeHash, - wait + removeHash } from './util.js'; type Styles = Record; @@ -121,13 +120,20 @@ export async function validateAnimationStyles(page: Page, selector: string, styl throw new Error(`Element not found: ${selector}`); } + // Freeze transitions so computed styles jump straight to their end values. + // No waiting for the animation: that's timing-dependent and flaky under load. + // The duration itself is checked by validateAnimationDuration. + const freeze = await page.addStyleTag({ + content: + '*, *::before, *::after { transition: none !important; animation: none !important; }' + }); await addChangingClass(page); - const duration = await getAnimationDuration(page, selector); const before = await getStyleProperties(page, selector, styles); await addAnimatingClass(page); - await wait(duration + 100); const after = await getStyleProperties(page, selector, styles); + await page.evaluate(() => document.documentElement.classList.remove('is-animating')); await removeChangingClass(page); + await freeze.evaluate((el) => (el as Element).remove()); if (Object.keys(before).length === 0 && Object.keys(after).length === 0) { throw new Error(`Styles not found on element: ${selector} (${styles.join(', ')})`); From effe3d3a25cb5830129d3cdd45744117967684ed Mon Sep 17 00:00:00 2001 From: Rasso Hilber Date: Mon, 9 Nov 2026 22:03:26 +0100 Subject: [PATCH 2/2] Bypass CSP so the injected style tag works on strict sites --- src/browser.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/browser.ts b/src/browser.ts index 5bbf6f5..1780460 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -26,7 +26,8 @@ export async function createBrowser(): Promise<{ } export async function visitPage(browser: Browser, url: string) { - const page = await browser.newPage(); + // Bypass CSP: validateAnimationStyles injects an inline