← back to Marketing Command Center

scripts/repro-run3.js

30 lines

// Replay run3's exact order, inspect each panel right after its single click,
// across several inter-click delays, to surface the blank-on-land cascade.
const { chromium } = require('playwright');
const BASE = process.env.MCC_BASE || 'https://marketing.designerwallcoverings.com';
const SEQ = [['Social Scheduler','social'],['Composer','composer'],['Marketing Calendar','calendar'],['Streams Board','board'],['Suggested Copy','copy'],['Engine','engine'],['Campaign Templates','templates']];
async function cardCount(page){return await page.evaluate(()=>{const c=document.querySelectorAll('.bd-card,[class*="card"],article');let real=0;c.forEach(e=>{const r=e.getBoundingClientRect();if(r.width>40&&r.height>20)real++;});return {n:real,title:(document.querySelector('#paneltitle')?.innerText||'').trim(),loading:/loading/i.test((document.querySelector('#panel')?.innerText||'').slice(0,30))};});}
(async () => {
  for (const delay of [2800, 600, 250]) {
    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();
    let apiCount=0; page.on('request',r=>{ if(/\/api\//.test(r.url())) apiCount++; });
    await page.goto(BASE+'/',{waitUntil:'domcontentloaded'}); await page.waitForTimeout(2500);
    console.log(`\n===== inter-click delay = ${delay}ms =====`);
    let blankLands=0;
    for (const [label,id] of SEQ) {
      apiCount=0;
      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(delay);
      const c = await cardCount(page);
      const composerExpectsZero = id==='composer';
      const blank = c.n===0 && !composerExpectsZero;
      if (blank) blankLands++;
      console.log(`  ${id.padEnd(9)} land: title="${c.title}" cards=${c.n} apiDuringSettle=${apiCount}${blank?'  <-- BLANK ON LAND':''}${c.loading?' [stuck Loading]':''}`);
    }
    console.log(`  => blank-on-land panels: ${blankLands}/${SEQ.length-1}`);
    await ctx.close(); await browser.close();
  }
})().catch(e=>{console.error('FATAL',e);process.exit(1);});