




















@@ -9,9 +9,9 @@ const { BrowserProfileUnavailableError } = await import("../errors.js");
99const { registerBrowserBasicRoutes } = await import("./basic.js");
10101111function createExistingSessionProfileState(params?: {
12-isHttpReachable?: () => Promise<boolean>;
13-isTransportAvailable?: () => Promise<boolean>;
14-isReachable?: () => Promise<boolean>;
12+isHttpReachable?: (timeoutMs?: number) => Promise<boolean>;
13+isTransportAvailable?: (timeoutMs?: number) => Promise<boolean>;
14+isReachable?: (timeoutMs?: number, options?: { ephemeral?: boolean }) => Promise<boolean>;
1515}) {
1616return {
1717resolved: {
@@ -276,7 +276,7 @@ describe("basic browser routes", () => {
276276expect(ensureBrowserAvailable).not.toHaveBeenCalled();
277277});
278278279-it("treats attach-only profiles as running when transport is available even if page reachability is false", async () => {
279+it("reports pageReady=false when Chrome MCP transport is up but page tools are unreachable", async () => {
280280const response = await callBasicRouteWithState({
281281state: createExistingSessionProfileState({
282282isTransportAvailable: async () => true,
@@ -291,26 +291,81 @@ describe("basic browser routes", () => {
291291expect(body.transport).toBe("chrome-mcp");
292292expect(body.running).toBe(true);
293293expect(body.cdpReady).toBe(true);
294+expect(body.pageReady).toBe(false);
294295});
295296296-it("probes Chrome MCP transport only once for status", async () => {
297+it("reports pageReady=false when the page-reachability probe throws", async () => {
298+const response = await callBasicRouteWithState({
299+state: createExistingSessionProfileState({
300+isTransportAvailable: async () => true,
301+isReachable: async () => {
302+throw new Error('Chrome MCP "list_pages" timed out after 5000ms.');
303+},
304+}),
305+});
306+307+expect(response.statusCode).toBe(200);
308+const body = responseBodyRecord(response);
309+expect(body.cdpReady).toBe(true);
310+expect(body.pageReady).toBe(false);
311+});
312+313+it("reports pageReady=true when both transport and page tools succeed", async () => {
297314const isHttpReachable = vi.fn(async () => true);
298315const isTransportAvailable = vi.fn(async () => true);
316+const isReachable = vi.fn(async () => true);
299317300318const response = await callBasicRouteWithState({
301319state: createExistingSessionProfileState({
302320 isHttpReachable,
303321 isTransportAvailable,
322+ isReachable,
304323}),
305324});
306325307326expect(response.statusCode).toBe(200);
308327expect(isTransportAvailable).toHaveBeenCalledTimes(1);
309328expect(isTransportAvailable).toHaveBeenCalledWith(5_000);
329+expect(isReachable).toHaveBeenCalledWith(5_000, { ephemeral: true });
310330expect(isHttpReachable).not.toHaveBeenCalled();
311331const body = responseBodyRecord(response);
312332expect(body.cdpHttp).toBe(true);
313333expect(body.cdpReady).toBe(true);
334+expect(body.pageReady).toBe(true);
314335expect(body.running).toBe(true);
315336});
337+338+it("page-readiness probe runs in ephemeral mode so status does not seed a cached session", async () => {
339+const isReachable = vi.fn<
340+(timeoutMs?: number, options?: { ephemeral?: boolean }) => Promise<boolean>
341+>(async () => true);
342+343+await callBasicRouteWithState({
344+state: createExistingSessionProfileState({
345+isTransportAvailable: async () => true,
346+ isReachable,
347+}),
348+});
349+350+expect(isReachable).toHaveBeenCalledTimes(1);
351+expect(isReachable.mock.calls[0]?.[1]).toEqual({ ephemeral: true });
352+});
353+354+it("skips the page-reachability probe when transport is unavailable", async () => {
355+const isReachable = vi.fn(async () => true);
356+357+const response = await callBasicRouteWithState({
358+state: createExistingSessionProfileState({
359+isTransportAvailable: async () => false,
360+ isReachable,
361+}),
362+});
363+364+expect(response.statusCode).toBe(200);
365+expect(isReachable).not.toHaveBeenCalled();
366+const body = responseBodyRecord(response);
367+expect(body.cdpReady).toBe(false);
368+expect(body.pageReady).toBe(false);
369+expect(body.running).toBe(false);
370+});
316371});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。