





















@@ -105,10 +105,12 @@ vi.mock("../../../src/agents/tools/nodes-utils.js", async () => {
105105});
106106107107const gatewayMocks = vi.hoisted(() => ({
108-callGatewayTool: vi.fn(async () => ({
109-ok: true,
110-payload: { result: { ok: true, running: true } },
111-})),
108+callGatewayTool: vi.fn(
109+async (): Promise<Record<string, unknown>> => ({
110+ok: true,
111+payload: { result: { ok: true, running: true } },
112+}),
113+),
112114}));
113115vi.mock("../../../src/agents/tools/gateway.js", () => gatewayMocks);
114116@@ -507,6 +509,62 @@ describe("browser tool snapshot maxChars", () => {
507509expect(browserClientMocks.browserStatus).not.toHaveBeenCalled();
508510});
509511512+it("falls back to role refs when a node snapshot cannot provide aria refs", async () => {
513+mockSingleBrowserProxyNode();
514+gatewayMocks.callGatewayTool
515+.mockRejectedValueOnce(
516+new Error("INVALID_REQUEST: Error: refs=aria requires Playwright _snapshotForAI support."),
517+)
518+.mockResolvedValueOnce({
519+ok: true,
520+payload: {
521+result: {
522+ok: true,
523+format: "ai",
524+targetId: "tab-1",
525+url: "https://meet.google.com/abc-defg-hij",
526+snapshot: 'button "Admit"',
527+refs: { e1: { role: "button", name: "Admit" } },
528+},
529+},
530+});
531+const tool = createBrowserTool();
532+533+const result = await tool.execute?.("call-1", {
534+action: "snapshot",
535+target: "node",
536+node: "Browser Node",
537+targetId: "tab-1",
538+refs: "aria",
539+depth: 4,
540+maxChars: 12_000,
541+});
542+543+expect(result?.details).toMatchObject({ refsFallback: "role" });
544+expect(gatewayMocks.callGatewayTool).toHaveBeenNthCalledWith(
545+1,
546+"node.invoke",
547+{ timeoutMs: 25000 },
548+expect.objectContaining({
549+params: expect.objectContaining({
550+path: "/snapshot",
551+query: expect.objectContaining({ refs: "aria" }),
552+}),
553+}),
554+);
555+expect(gatewayMocks.callGatewayTool).toHaveBeenNthCalledWith(
556+2,
557+"node.invoke",
558+{ timeoutMs: 25000 },
559+expect.objectContaining({
560+params: expect.objectContaining({
561+path: "/snapshot",
562+query: expect.objectContaining({ refs: "role" }),
563+}),
564+}),
565+);
566+});
567+510568it("gives node.invoke extra slack beyond the default proxy timeout", async () => {
511569mockSingleBrowserProxyNode();
512570gatewayMocks.callGatewayTool.mockResolvedValueOnce({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。