const {chromium}=require('playwright'); (async()=>{const b=await chromium.launch({headless:true,executablePath:'C:/Program Files (x86)/Microsoft/Edge/Application/msedge.exe'});const p=await b.newPage({viewport:{width:1300,height:900}});const errors=[];p.on('pageerror',e=>errors.push(e.message));await p.goto('http://127.0.0.1:8931/AI%E5%BF%AB%E9%80%9F%E6%8A%A5%E4%BB%B7_Demo2.html?v=wardrobe-material-rules',{waitUntil:'load'});await p.evaluate(()=>{switchView('rules');renderRules();});const rows=await p.locator('#rule-table-wardrobe tr').count();const texts=await p.locator('#rule-table-wardrobe tr').allInnerTexts();const prices=await p.evaluate(()=>({normal:qGetCabinetPricingRule({cabinetType:'餐边柜'},2,2.4),master:qGetCabinetPricingRule({cabinetType:'主卧衣柜'},2,2.4)}));await p.evaluate(()=>startRuleEdit('wardrobe',0));const priceInput=p.locator('#rule-table-wardrobe tr').first().locator('td').nth(2).locator('input');await priceInput.fill('1900');await p.evaluate(()=>saveRuleEdit('wardrobe',0));const edited=await p.evaluate(()=>qGetCabinetPricingRule({cabinetType:'餐边柜'},2,2.4).unitPrice);console.log(JSON.stringify({rows,texts,prices,edited,errors}));await b.close();})().catch(e=>{console.error(e);process.exit(1)});