← back to Marketing Command Center
scripts/repro-race.js
37 lines
// Deterministically trip the route() race: click panels rapidly (no settle).
const { chromium } = require('playwright');
const BASE = 'https://marketing.designerwallcoverings.com';
const LABELS = ['Streams Board', 'Social Scheduler', 'Engine', 'Campaign Templates', 'Marketing Calendar', 'Suggested Copy'];
(async () => {
const browser = await chromium.launch();
const ctx = await browser.newContext({ viewport: { width: 1600, height: 900 }, httpCredentials: { username: 'admin', password: 'DW2024!' } });
const page = await ctx.newPage();
const errs = [];
page.on('pageerror', e => errs.push('' + e));
page.on('console', m => m.type() === 'error' && errs.push(m.text().slice(0, 160)));
await page.goto(BASE + '/', { waitUntil: 'domcontentloaded' });
await page.waitForTimeout(2500);
// RAPID: click each label with only 120ms between — well under fetch latency → interleave.
for (const label of LABELS) {
try { const el = page.locator('a', { hasText: new RegExp(label, 'i') }).first(); if (await el.count()) await el.click({ timeout: 3000 }); } catch {}
await page.waitForTimeout(120);
}
// Now land on Streams Board and give it plenty of time to settle.
try { await page.locator('a', { hasText: /Streams Board/i }).first().click(); } catch {}
await page.waitForTimeout(4000);
const res = await page.evaluate(() => {
const cards = document.querySelectorAll('.bd-card, [class*="card"], article');
const title = (document.querySelector('#paneltitle')?.innerText || '').trim();
const loadingStuck = /loading/i.test((document.querySelector('#panel')?.innerText || '').slice(0, 40));
return { title, cards: cards.length, loadingStuck, panelText: (document.querySelector('#panel')?.innerText || '').trim().slice(0, 120) };
});
console.log('AFTER RAPID NAV → land on Streams Board:');
console.log(' title :', res.title);
console.log(' cards :', res.cards, res.cards === 0 ? ' <-- BLANK (race tripped)' : ' (rendered)');
console.log(' loadingStuck:', res.loadingStuck);
console.log(' panelText :', JSON.stringify(res.panelText));
console.log(' errors :', JSON.stringify([...new Set(errs)]));
await ctx.close(); await browser.close();
})().catch(e => { console.error('FATAL', e); process.exit(1); });