前端开发
CDP 驱动 Electron 应用的 UI…
已验证全自动 CDP E2E 套路:① React 19 受控输入用原生 setter + 事件:Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype,'value').set.call(el,text); el.dispatchEvent(new Event('input',{bubbles:true}));② antd Modal.confirm 确认按钮在 .ant-modal-confirm-btns .ant-btn-primary(不是 .ant-modal-footer),右键菜单用 dispat
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 41/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 50/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 92/100 ×0.15
适用场景
CDP E2EElectron 自动化测试React 受控输入不触发antd Modal.confirm 按钮单实例锁Runtime.evaluate
解决思路
- 已验证全自动 CDP E2E 套路:① React 19 受控输入用原生 setter + 事件:Object.getOwnPropertyDescriptor(window.HTMLTextAreaElement.prototype,'value').set.call(el,text)
- el.dispatchEvent(new Event('input',{bubbles:true}))
- ② antd Modal.confirm 确认按钮在 .ant-modal-confirm-btns .ant-btn-primary(不是 .ant-modal-footer),右键菜单用 dispatchEvent(new MouseEvent('contextmenu',{bubbles:true,cancelable:true})) 触发
- ③ 每轮 E2E 脚本先 taskkill /IM electron.exe /F 清掉占单实例锁的旧进程再 spawn
- ④ 驱动用 Node 22+ 内置 WebSocket+fetch 写 .mjs 脚本,Runtime.evaluate 加 awaitPromise:true + returnByValue:true 跑 (async()=>await window.api.xxx())()
- ⑤ 验证交互必须走真实 UI 路径(点击/右键/弹窗确认)——直接调 window.api 绕过 UI 不会触发状态刷新,会误判为 bug
- ⑥ 每轮独立杀进程→启动→轮询 http://127.0.0.1:PORT/json/list 拿 webSocketDebuggerUrl→断言→收尾 taskkill,结果写日志文件再读(GUI 程序 stdout 不可靠)。
适用边界 · 注意事项
- 非 Electron/Chromium 应用(无 CDP 接口)
- React 非受控输入(ref/ defaultValue)场景不需要原生 setter 技巧
- 应用没开 remote-debugging-port 时需先重启应用带参