From 91d998b2ea35db4e51102291b19c50344433fd29 Mon Sep 17 00:00:00 2001 From: yu <1919727607@qq.com> Date: Thu, 5 Nov 2026 10:12:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=83=E7=B4=A0=E6=8B=BE=E5=8F=96=E8=B7=9F?= =?UTF-8?q?=E9=9A=8F=E5=89=8D=E5=8F=B0=E6=A0=87=E7=AD=BE=E9=A1=B5:=20?= =?UTF-8?q?=E7=82=B9=E6=90=9C=E7=B4=A2=E7=AD=89=E5=BC=80=E6=96=B0=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E9=A1=B5=E5=90=8E=E9=99=84=E7=9D=80=E7=9B=AE=E6=A0=87?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pickElement 轮询前经 /json/list 检查前台标签页, 变化时 activateTab 切换附着并重新注册/注入拾取脚本 - 结束时对所有已附着标签页清理拾取残留, 并移除全部 addScriptToEvaluateOnNewDocument 注入 --- src/main/browser/session.ts | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/browser/session.ts b/src/main/browser/session.ts index db964ea..55b50e2 100644 --- a/src/main/browser/session.ts +++ b/src/main/browser/session.ts @@ -1165,16 +1165,32 @@ export class BrowserSession implements BrowserLike { } const inject = () => this.evaluate(`(() => { try { delete window.__rpaPickResult; ${PICKER_BOOTSTRAP_SOURCE} } catch {} })()`); + const injectionIds: string[] = []; + const registerInjection = async () => { + const registered = await this.cdp<{ identifier?: string }>("Page.addScriptToEvaluateOnNewDocument", { + source: PICKER_BOOTSTRAP_SOURCE + }).catch(() => null); + if (registered?.identifier) injectionIds.push(registered.identifier); + }; + // 跟随前台标签页:搜索/点按钮常开新标签页,附着目标切过去并重新注入,拾取不中断 + const followForegroundTab = async () => { + if (this.win || !this.httpBase) return; + const pages = await listPageTargets(this.httpBase).catch(() => []); + const page = pages[0]; + if (!page || page.id === this.activeTargetId) return; + await this.activateTab(page.id); + await this.cdp("Page.enable").catch(() => {}); + await registerInjection(); + await inject(); + }; await this.cdp("Page.enable").catch(() => {}); - const registered = await this.cdp<{ identifier?: string }>("Page.addScriptToEvaluateOnNewDocument", { - source: PICKER_BOOTSTRAP_SOURCE - }).catch(() => null); - const injectionId = registered?.identifier; + await registerInjection(); try { await inject(); const deadline = Date.now() + Math.max(5000, timeoutMs); while (Date.now() < deadline) { await new Promise((resolve) => setTimeout(resolve, 400)); + await followForegroundTab().catch(() => {}); const state = await this.evaluate<{ result: { ok: boolean; value?: ElementPickResult; reason?: string } | null; active: boolean }>( "({ result: window.__rpaPickResult ?? null, active: window.__rpaPickerActive?.active === true })" ).catch(() => null); @@ -1187,11 +1203,14 @@ export class BrowserSession implements BrowserLike { } throw new RuntimeError("timeout", "拾取超时,请重新点击拾取"); } finally { - await this.evaluate( - "(() => { try { window.__rpaElementPicker?.cancelHard?.(); window.__rpaPickerActive = undefined; delete window.__rpaPickResult; } catch {} })()" - ).catch(() => {}); - if (injectionId) { - await this.cdp("Page.removeScriptToEvaluateOnNewDocument", { identifier: injectionId }).catch(() => {}); + const cleanupExpr = + "(() => { try { window.__rpaElementPicker?.cancelHard?.(); window.__rpaPickerActive = undefined; delete window.__rpaPickResult; } catch {} })()"; + await this.evaluate(cleanupExpr).catch(() => {}); + for (const tabTransport of this.tabTransports.values()) { + await tabTransport.send("Runtime.evaluate", { expression: cleanupExpr }).catch(() => {}); + } + for (const identifier of injectionIds) { + await this.cdp("Page.removeScriptToEvaluateOnNewDocument", { identifier }).catch(() => {}); } } }