




















@@ -2,6 +2,19 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2233const browserClientMocks = vi.hoisted(() => ({
44browserCloseTab: vi.fn(async (..._args: unknown[]) => ({})),
5+browserDoctor: vi.fn(async (..._args: unknown[]) => ({
6+ok: true,
7+profile: "openclaw",
8+transport: "cdp",
9+checks: [],
10+status: {
11+enabled: true,
12+running: true,
13+pid: 1,
14+cdpPort: 18792,
15+cdpUrl: "http://127.0.0.1:18792",
16+},
17+})),
518browserFocusTab: vi.fn(async (..._args: unknown[]) => ({})),
619browserOpenTab: vi.fn(async (..._args: unknown[]) => ({})),
720browserProfiles: vi.fn(
@@ -242,6 +255,7 @@ function resetBrowserToolMocks() {
242255browserArmDialog: browserActionsMocks.browserArmDialog as never,
243256browserArmFileChooser: browserActionsMocks.browserArmFileChooser as never,
244257browserCloseTab: browserClientMocks.browserCloseTab as never,
258+browserDoctor: browserClientMocks.browserDoctor as never,
245259browserFocusTab: browserClientMocks.browserFocusTab as never,
246260browserNavigate: browserActionsMocks.browserNavigate as never,
247261browserOpenTab: browserClientMocks.browserOpenTab as never,
@@ -510,6 +524,36 @@ describe("browser tool snapshot maxChars", () => {
510524expect(browserClientMocks.browserStatus).not.toHaveBeenCalled();
511525});
512526527+it("returns a browser doctor report on host", async () => {
528+const tool = createBrowserTool();
529+await tool.execute?.("call-1", { action: "doctor" });
530+531+expect(browserClientMocks.browserDoctor).toHaveBeenCalledWith(undefined, {
532+profile: undefined,
533+});
534+});
535+536+it("routes browser doctor through the node proxy", async () => {
537+mockSingleBrowserProxyNode();
538+const tool = createBrowserTool();
539+await tool.execute?.("call-1", { action: "doctor", target: "node" });
540+541+expect(gatewayMocks.callGatewayTool).toHaveBeenCalledWith(
542+"node.invoke",
543+{ timeoutMs: 25000 },
544+expect.objectContaining({
545+nodeId: "node-1",
546+command: "browser.proxy",
547+params: expect.objectContaining({
548+method: "GET",
549+path: "/doctor",
550+timeoutMs: 20000,
551+}),
552+}),
553+);
554+expect(browserClientMocks.browserDoctor).not.toHaveBeenCalled();
555+});
556+513557it("falls back to role refs when a node snapshot cannot provide aria refs", async () => {
514558mockSingleBrowserProxyNode();
515559gatewayMocks.callGatewayTool
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。