分享:绕开浏览器助手通道,用 Playwright 直连实现 OA 批量填表(附踩坑全记录)

天浩
天浩 Lv.1 新人创作者

Lv.1 新人创作者

各位好,我是之前反馈“浏览器插件通道 10061 拒连”的朋友。前两条发帖说了 native host 动态端口 + MV3 Service Worker 休眠的问题,官方迟迟未有定论。今天不催修复了——我们换了个思路,把问题整个绕过去了,在此分享给有同类需求的兄弟。

一、思路

插件通道的病根在于:调用方必须经过 native host(动态端口、随 Service Worker 休眠被回收)。但浏览器本身就带 CDP 调试协议——用 Playwright 直连启动 Edge,完全不经过 native host,那两个问题就不存在了。我们已把 OA 批量产品信息录入(自动登录→搜索流程→填 10 字段→日期点选→提交确认→循环)全部迁移到 Playwright,做成双击版独立程序,不依赖任何 Agent 运行时,每天批量录入零消耗(独立于灵犀或其他Agent之外)。

二、迁移路上踩的坑(重点,都是实测取证)

登录页 React 输入框:Playwright 的 fill() 不触发 React 状态更新,点登录等于提交空表单,页面原地不动。必须 JS 原生 setter + input/change 事件;且页面 networkidle 前按钮 handler 未绑定,首次点击常无效,需要重试机制。

React 受控按钮铁律同样适用于 Playwright:JS el.click() 对「提交」按钮无效(表单原地不动、无报错),必须真实鼠标点击。

日期控件是最大的坑:日期输入框不是 readonly——JS setter 甚至真实键盘输入都能把值显示到输入框里,但 React 内部状态完全不认,提交时报“日期不能为空”且确认弹窗不弹。唯一可靠路径是真实点选日历。日历导航的精确 DOM:年跳转按钮 .ui-date-picker-titleDateNav-btn-nextYear/lastYear,月切换=点标题里的「M 月」span 进月视图,当日格子 class 是 middle middle-isCurrentMonth。

假成功判活陷阱(最阴的一个):以“确认按钮消失”判定提交成功——但若校验没过、弹窗根本没弹,按钮本来就不存在,“消失”瞬间成立,程序虚报成功、实际一条没进。修正:确认弹窗必须先 wait 出现,再等它消失,最后去目标系统“已办事宜”实查验收。 我们靠用户发现“记录没进去”才揪出这个问题,建议大家自查一下自己的判活逻辑。

三、给官方的迁移外问题

插件通道本身我们还在用(别的场景),native host 动态端口有无官方发现机制、Service Worker 休眠是否提供 keepalive,仍请技术组拨冗确认(见前两条帖子)。

四、环境

Windows 11 + Edge + Playwright(chromium channel=msedge);OA 为泛微 ecology。本帖不涉及任何账号信息。

辽宁省
浏览 93
收藏
3
分享
3 +1
7
+1
全部评论 7
 
李柏良
收到,因为用户环境差异比较大,浏览器插件兼容性还在增强。可以关闭插件开关,尝试下灵犀内置的侧边浏览器,内置会更加稳定。
   广东省
举报
0
1
天浩
天浩Lv.1 新人创作者

Lv.1 新人创作者

感谢李老师回复!侧边浏览器我们实测过(10-29),遇到两个问题:①侧边浏览器与主浏览器会话隔离,OA登录态不共享,每次都要重新登录;②CDP附着侧边页签不稳,窗口切换后连接容易断。所以后来换了思路:用Playwright直连系统Edge(channel="msedge"),完全绕开插件通道,已经做成双击exe交付同事使用,Win11实测全流程通过。现在插件通道和Playwright双保险,插件后续兼容性增强了我们再切回来。另外提一个建议:插件在MV3 Service Worker休眠后native host端口失联的问题,如果能加一个“插件状态自愈/重连”机制,对老用户会友好很多。感谢团队持续跟进!
· 辽宁省
举报
0
0
 
wils
wils Lv.4 核心创作者

Lv.4 核心创作者

请问,React 输入框这里用的方法是类似下面这个吗,如果不是,请问会更稳定吗,谢谢 function setTextareaValue(textarea, value) { const lastValue = textarea.value; textarea.value = value; const event = new Event('input', { bubbles: true }); event.simulated = true; const tracker = textarea._valueTracker; if (tracker) { tracker.setValue(lastValue); } textarea.dispatchEvent(event); }
   海南省
举报
0
4
天浩
天浩Lv.1 新人创作者

Lv.1 新人创作者

感谢回帖
· 辽宁省
举报
0
0