Files
HomeDash/deploy/verify-workspace.js
HomeDash Bot 352aa570ec chore: 验收脚本入库(矩阵/工作空间/滚动)+ 修正脱敏自检命令
- deploy/verify-matrix.js:6 尺寸 × 3 视图 × 深浅色矩阵,断言纵向滚动(仅
  minimal/workspace)、文字亮度阈值、深色是否生效、零运行时异常
- deploy/verify-workspace.js:触发 workspace blocked 态,读弹窗卡片 computed style
- deploy/verify-scroll.js:多视口滚动复现(含 900x520 这类矮窗口)
  三者只从环境变量 PORTAL_COOKIE 取会话,无任何硬编码凭据
- README 自检命令改为排除占位符(<...>、${VAR:-}、change-me),避免误报
- 自定义文件表登记上述脚本
2026-09-12 08:55:04 +08:00

36 lines
2.3 KiB
JavaScript

const { chromium }=require('playwright-core');
function rgb(s){const m=s.match(/[\d.]+/g);return m?m.slice(0,4).map(Number):[]}
function L(a){return Math.round(.2126*(a[0]||0)+.7152*(a[1]||0)+.0722*(a[2]||0))}
const C=process.env.PORTAL_COOKIE;
(async()=>{
const b=await chromium.connectOverCDP('http://127.0.0.1:9222');
const ctx=await b.newContext({ignoreHTTPSErrors:true,viewport:{width:1400,height:900}});
await ctx.addCookies([{name:'portal_session',value:C,domain:'.example.com',path:'/',httpOnly:true,secure:true,sameSite:'Lax'}]);
const p=await ctx.newPage(); const errs=[]; p.on('pageerror',e=>errs.push(String(e)));
await p.emulateMedia({colorScheme:'dark'}); await p.addInitScript(()=>{try{localStorage.removeItem('navi-theme')}catch(e){}});
await p.goto('https://dashy.example.com/workspace',{waitUntil:'networkidle',timeout:90000}); await p.waitForTimeout(3000);
const n=await p.evaluate(()=>[...document.querySelectorAll('nav.side-bar a,nav.side-bar button,.side-bar-item')].length);
let modal=null;
for(let i=0;i<n;i++){
await p.evaluate(i=>{const e=[...document.querySelectorAll('nav.side-bar a,nav.side-bar button,.side-bar-item')][i];e&&e.click()},i);
await p.waitForTimeout(3500);
modal=await p.evaluate(()=>{
const card=document.querySelector('.navi-ws-modal-card'); if(!card) return null;
const c=getComputedStyle(card); const t=document.querySelector('.navi-ws-modal-title');
return {bg:c.backgroundColor, title:t?getComputedStyle(t).color:null, text:(card.textContent||'').trim().slice(0,60)};
});
if(modal) break;
}
const r=await p.evaluate(()=>{
const g=s=>{const e=document.querySelector(s);if(!e)return null;const c=getComputedStyle(e);return c.backgroundColor};
return {ws:(document.querySelector('.work-space')||{dataset:{}}).dataset?.naviWs||null,
modalCard:g('.navi-ws-modal-card'),modalOk:g('.navi-ws-modal-ok'),webContent:g('.work-space .web-content')};
});
console.log(JSON.stringify({sidebarItems:n,modalSeen:!!modal,modal,r,errors:errs},null,1));
await p.screenshot({path:'/tmp/ws-v50-modal.png',fullPage:true});
await ctx.close(); await b.close();
const ok = !modal || (L(rgb(modal.bg))<95 && L(rgb(modal.title||'rgb(255,255,255)'))>190);
console.log(ok?'MODAL_DARK_OK':'MODAL_STILL_LIGHT');
if(!ok) process.exitCode=2;
})().catch(e=>{console.error(e);process.exit(1)});