import { attach } from '/tmp/cdp3.mjs'; const wait = ms => new Promise(z => setTimeout(z, ms)); const c = await attach('/web/sheinProduct/add') || await attach('dianxiaomi.com'); // 1. 主规格控件 const o1 = await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null) .find(x=>{const l=x.querySelector('label'); return l&&/主规格/.test(l.innerText||'');}); if(!it)return'nf'; return JSON.stringify({txt:(it.innerText||'').replace(/\\s+/g,' ').slice(0,160), html:it.innerHTML.slice(0,500)});})()`); console.log('主规格:', String(o1).slice(0,700)); // 2. 尺码表控件 const o2 = await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null) .find(x=>{const l=x.querySelector('label'); return l&&/尺码表/.test(l.innerText||'');}); if(!it)return'nf'; return JSON.stringify({txt:(it.innerText||'').replace(/\\s+/g,' ').slice(0,160), html:it.innerHTML.slice(0,400)});})()`); console.log('尺码表:', String(o2).slice(0,600)); // 3. 图片区 const o3 = await c.evalJS(`(()=>{const it=[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null) .find(x=>{const l=x.querySelector('label'); return l&&/图片/.test(l.innerText||'');}); if(!it)return'nf'; return JSON.stringify({lab:(it.querySelector('label')||{}).innerText||'', txt:(it.innerText||'').replace(/\\s+/g,' ').slice(0,200)});})()`); console.log('图片区:', String(o3).slice(0,500)); // 4. 主规格可选值(第一个属性) const o4 = await c.evalJS(`(()=>{const p=document.querySelector('#app').__vue_app__.config.globalProperties.$pinia; const a=JSON.parse(JSON.stringify(p._s.get('sheinSkuAttrStore').$state)); const at=(a.formState.skuAttrs||[])[0]||{}; return JSON.stringify({attrName:at.name, attrId:at.attributeId, optCount:(at._options||[]).length, opt0:(at._options||[])[0], chosen:at.attributeValues||at.checked||null});})()`); console.log('主规格属性:', String(o4).slice(0,600)); // 5. 是否有必填标记的项 const o5 = await c.evalJS(`(()=>[...document.querySelectorAll('.ant-form-item')].filter(e=>e.offsetParent!==null&&e.querySelector('.ant-form-item-required')) .map(x=>{const l=x.querySelector('label'); return l?(l.innerText||'').replace(/\\s+/g,' ').trim():'';}).filter(Boolean).slice(0,15))()`); console.log('必填项:', String(o5).slice(0,400)); process.exit(0);