From 753508b500abc7ba6e707d57785eb5218baa6487 Mon Sep 17 00:00:00 2001 From: yu <191972707@qq.com> Date: Wed, 28 Oct 2026 14:56:20 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=A1=8C=E9=9D=A2=E5=85=83=E7=B4=A0?= =?UTF-8?q?=E7=82=B9=E5=87=BB/=E5=A1=AB=E5=80=BC/=E8=AF=BB=E5=80=BC?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9A=90=E5=BC=8F=E7=AD=89=E5=BE=85=E9=87=8D?= =?UTF-8?q?=E8=AF=95=EF=BC=88=E9=BB=98=E8=AE=A44=E7=A7=92=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/capabilities/desktop-uia.ts | 34 +++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/capabilities/desktop-uia.ts b/src/main/capabilities/desktop-uia.ts index 6243560..74a6aa2 100644 --- a/src/main/capabilities/desktop-uia.ts +++ b/src/main/capabilities/desktop-uia.ts @@ -249,6 +249,29 @@ async function runScript(script: string, t: UiaTarget, timeoutMs = 60000): Promi } } +function sleepMs(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +async function runWithImplicitWait( + t: UiaTarget, + action: string, + script: string, + exec: (script: string, t: UiaTarget, timeoutMs?: number) => Promise | null>, + args: Record +): Promise> { + const waitMs = Number(args.waitMs ?? args.wait_ms ?? 4000) || 4000; + const deadline = Date.now() + Math.max(0, waitMs); + for (;;) { + try { + return requireFound(await exec(script, t), t, action); + } catch (error) { + const code = (error as { code?: string }).code; + if (code !== "desktop_element_not_found" || Date.now() >= deadline) throw error; + await sleepMs(400); + } + } +} function requireFound(result: Record | null, t: UiaTarget, action: string): Record { if (!result) { const s = t.selector; @@ -259,15 +282,13 @@ function requireFound(result: Record | null, t: UiaTarget, acti const clickGround: CapabilityHandler = async (_ctx, node, args) => { const t = target(args, node); - const result = await runScript(clickScript(t), t); - return requireFound(result, t, "click"); + return runWithImplicitWait(t, "click", clickScript(t), runScript, args); }; const setValueGround: CapabilityHandler = async (_ctx, node, args) => { const t = target(args, node); const value = String(args.value ?? args.text ?? ""); - const result = await runScript(setValueScript(t, value), t); - return requireFound(result, t, "setValue"); + return runWithImplicitWait(t, "setValue", setValueScript(t, value), runScript, args); }; const existsGround: CapabilityHandler = async (_ctx, node, args) => { @@ -278,8 +299,8 @@ const existsGround: CapabilityHandler = async (_ctx, node, args) => { const getValueGround: CapabilityHandler = async (_ctx, node, args) => { const t = target(args, node); - const result = await runScript(getValueScript(t), t); - return requireFound(result, t, "getValue").value ?? ""; + const result = await runWithImplicitWait(t, "getValue", getValueScript(t), runScript, args); + return result.value ?? ""; }; const waitElementGround: CapabilityHandler = async (_ctx, node, args) => { @@ -298,3 +319,4 @@ register("Element_WaitElementGround", waitElementGround); +