const sleep = ms => new Promise(r=>setTimeout(r,ms)); const propsOf = el => { for (const k of Object.keys(el)) if (k.startsWith('__reactProps$')) return el[k]; return null; }; const fire = (el) => { let t = el; for (let i=0;i<8&&t;i++){const q=propsOf(t); if(q&&typeof q.onClick==='function'){q.onClick({target:t,currentTarget:t,stopPropagation(){},preventDefault(){},nativeEvent:{},button:0,detail:1});return true;} t=t.parentElement;} return false; }; const leaf = (txt) => { for (const el of document.querySelectorAll('*')) if (el.children.length===0 && (el.textContent||'').trim()===txt) return el; return null; }; fire(leaf('布线')); await sleep(800); fire(leaf('自动布线...')); await sleep(2500); const fsL = Array.from(document.querySelectorAll('fieldset')).find(x=>(x.querySelector('legend')||{}).textContent==='布线图层'); const fsI = Array.from(document.querySelectorAll('fieldset')).find(x=>(x.querySelector('legend')||{}).textContent==='忽略网络'); let btn=null; for (const x of document.querySelectorAll('button')) if((x.innerText||'').trim()==='运行' && x.offsetParent!==null) btn=x; const info = btn ? {props: Object.keys(propsOf(btn)||{}), cls: btn.className, type: btn.type, disabled: btn.disabled} : null; return { layers: fsL ? Array.from(fsL.querySelectorAll('tr')).map(tr=>({t:(tr.innerText||'').trim(), on: !!tr.querySelector('i[class*="active_"]')})) : null, ignore: fsI ? (fsI.innerText||'').trim().replace(/\s+/g,' ') : null, btn: info };