



























@@ -31,6 +31,16 @@ type ActErrorHttpResponse = {
3131body: ActErrorResponse;
3232};
333334+function expectRecordFields(value: unknown, expected: Record<string, unknown>): void {
35+expect(value).toBeDefined();
36+expect(typeof value).toBe("object");
37+expect(value).not.toBeNull();
38+const actual = value as Record<string, unknown>;
39+for (const [key, expectedValue] of Object.entries(expected)) {
40+expect(actual[key]).toEqual(expectedValue);
41+}
42+}
43+3444async function postActAndReadError(base: string, body?: unknown): Promise<ActErrorHttpResponse> {
3545const realFetch = getBrowserTestFetch();
3646const response = await realFetch(`${base}/act`, {
@@ -187,10 +197,8 @@ describe("browser control server", () => {
187197targetId: "abcd1234",
188198});
189199190-expect(response).toMatchObject({
191-ok: true,
192-targetId: "fresh5678",
193-});
200+expect(response.ok).toBe(true);
201+expect(response.targetId).toBe("fresh5678");
194202},
195203slowTimeoutMs,
196204);
@@ -320,14 +328,8 @@ describe("browser control server", () => {
320328};
321329322330expect(report.ok).toBe(true);
323-expect(report.checks).toEqual(
324-expect.arrayContaining([
325-expect.objectContaining({
326-id: "live-snapshot",
327-status: "pass",
328-}),
329-]),
330-);
331+const liveSnapshotCheck = report.checks?.find((check) => check.id === "live-snapshot");
332+expectRecordFields(liveSnapshotCheck, { id: "live-snapshot", status: "pass" });
331333expect(cdpMocks.snapshotAria).toHaveBeenCalledWith({
332334wsUrl: "ws://127.0.0.1/devtools/page/abcd1234",
333335limit: 25,
@@ -343,16 +345,15 @@ describe("browser control server", () => {
343345});
344346expect(nav.ok).toBe(true);
345347expect(typeof nav.targetId).toBe("string");
346-expect(pwMocks.navigateViaPlaywright).toHaveBeenCalledWith(
347-expect.objectContaining({
348-cdpUrl: state.cdpBaseUrl,
349-targetId: "abcd1234",
350-url: "https://example.com",
351-ssrfPolicy: {
352-dangerouslyAllowPrivateNetwork: true,
353-},
354-}),
355-);
348+const [navigateArgs] = pwMocks.navigateViaPlaywright.mock.calls[0] ?? [];
349+expectRecordFields(navigateArgs, {
350+cdpUrl: state.cdpBaseUrl,
351+targetId: "abcd1234",
352+url: "https://example.com",
353+ssrfPolicy: {
354+dangerouslyAllowPrivateNetwork: true,
355+},
356+});
356357357358const click = await postJson<{ ok: boolean }>(`${base}/act`, {
358359kind: "click",
@@ -361,20 +362,17 @@ describe("browser control server", () => {
361362modifiers: ["Shift"],
362363});
363364expect(click.ok).toBe(true);
364-expect(pwMocks.clickViaPlaywright).toHaveBeenNthCalledWith(
365-1,
366-expect.objectContaining({
367-cdpUrl: state.cdpBaseUrl,
368-targetId: "abcd1234",
369-ref: "1",
370-button: "left",
371-modifiers: ["Shift"],
372-ssrfPolicy: {
373-dangerouslyAllowPrivateNetwork: true,
374-},
375-}),
376-);
377365const [clickArgs] = pwMocks.clickViaPlaywright.mock.calls[0] ?? [];
366+expectRecordFields(clickArgs, {
367+cdpUrl: state.cdpBaseUrl,
368+targetId: "abcd1234",
369+ref: "1",
370+button: "left",
371+modifiers: ["Shift"],
372+ssrfPolicy: {
373+dangerouslyAllowPrivateNetwork: true,
374+},
375+});
378376expect((clickArgs as { doubleClick?: boolean }).doubleClick).toBeUndefined();
379377380378const clickSelector = await realFetch(`${base}/act`, {
@@ -384,18 +382,15 @@ describe("browser control server", () => {
384382});
385383expect(clickSelector.status).toBe(200);
386384expect(((await clickSelector.json()) as { ok?: boolean }).ok).toBe(true);
387-expect(pwMocks.clickViaPlaywright).toHaveBeenNthCalledWith(
388-2,
389-expect.objectContaining({
390-cdpUrl: state.cdpBaseUrl,
391-targetId: "abcd1234",
392-selector: "button.save",
393-ssrfPolicy: {
394-dangerouslyAllowPrivateNetwork: true,
395-},
396-}),
397-);
398385const [clickSelectorArgs] = pwMocks.clickViaPlaywright.mock.calls[1] ?? [];
386+expectRecordFields(clickSelectorArgs, {
387+cdpUrl: state.cdpBaseUrl,
388+targetId: "abcd1234",
389+selector: "button.save",
390+ssrfPolicy: {
391+dangerouslyAllowPrivateNetwork: true,
392+},
393+});
399394expect((clickSelectorArgs as { doubleClick?: boolean }).doubleClick).toBeUndefined();
400395401396const clickCoords = await postJson<{ ok: boolean; url?: string }>(`${base}/act`, {
@@ -408,40 +403,36 @@ describe("browser control server", () => {
408403});
409404expect(clickCoords.ok).toBe(true);
410405expect(clickCoords.url).toBe("https://example.com");
411-expect(pwMocks.clickCoordsViaPlaywright).toHaveBeenCalledWith(
412-expect.objectContaining({
413-cdpUrl: state.cdpBaseUrl,
414-targetId: "abcd1234",
415-x: 42.5,
416-y: 64,
417-doubleClick: true,
418-button: "left",
419-delayMs: 10,
420-ssrfPolicy: {
421-dangerouslyAllowPrivateNetwork: true,
422-},
423-}),
424-);
406+const [clickCoordsArgs] = pwMocks.clickCoordsViaPlaywright.mock.calls[0] ?? [];
407+expectRecordFields(clickCoordsArgs, {
408+cdpUrl: state.cdpBaseUrl,
409+targetId: "abcd1234",
410+x: 42.5,
411+y: 64,
412+doubleClick: true,
413+button: "left",
414+delayMs: 10,
415+ssrfPolicy: {
416+dangerouslyAllowPrivateNetwork: true,
417+},
418+});
425419426420const type = await postJson<{ ok: boolean }>(`${base}/act`, {
427421kind: "type",
428422ref: "1",
429423text: "",
430424});
431425expect(type.ok).toBe(true);
432-expect(pwMocks.typeViaPlaywright).toHaveBeenNthCalledWith(
433-1,
434-expect.objectContaining({
435-cdpUrl: state.cdpBaseUrl,
436-targetId: "abcd1234",
437-ref: "1",
438-text: "",
439-ssrfPolicy: {
440-dangerouslyAllowPrivateNetwork: true,
441-},
442-}),
443-);
444426const [typeArgs] = pwMocks.typeViaPlaywright.mock.calls[0] ?? [];
427+expectRecordFields(typeArgs, {
428+cdpUrl: state.cdpBaseUrl,
429+targetId: "abcd1234",
430+ref: "1",
431+text: "",
432+ssrfPolicy: {
433+dangerouslyAllowPrivateNetwork: true,
434+},
435+});
445436expect((typeArgs as { submit?: boolean }).submit).toBeUndefined();
446437expect((typeArgs as { slowly?: boolean }).slowly).toBeUndefined();
447438@@ -450,47 +441,41 @@ describe("browser control server", () => {
450441key: "Enter",
451442});
452443expect(press.ok).toBe(true);
453-expect(pwMocks.pressKeyViaPlaywright).toHaveBeenCalledWith(
454-expect.objectContaining({
455-cdpUrl: state.cdpBaseUrl,
456-targetId: "abcd1234",
457-key: "Enter",
458-ssrfPolicy: {
459-dangerouslyAllowPrivateNetwork: true,
460-},
461-}),
462-);
463444const [pressArgs] = pwMocks.pressKeyViaPlaywright.mock.calls[0] ?? [];
445+expectRecordFields(pressArgs, {
446+cdpUrl: state.cdpBaseUrl,
447+targetId: "abcd1234",
448+key: "Enter",
449+ssrfPolicy: {
450+dangerouslyAllowPrivateNetwork: true,
451+},
452+});
464453expect((pressArgs as { delayMs?: number }).delayMs).toBeUndefined();
465454466455const hover = await postJson<{ ok: boolean }>(`${base}/act`, {
467456kind: "hover",
468457ref: "2",
469458});
470459expect(hover.ok).toBe(true);
471-expect(pwMocks.hoverViaPlaywright).toHaveBeenCalledWith(
472-expect.objectContaining({
473-cdpUrl: state.cdpBaseUrl,
474-targetId: "abcd1234",
475-ref: "2",
476-}),
477-);
478460const [hoverArgs] = pwMocks.hoverViaPlaywright.mock.calls[0] ?? [];
461+expectRecordFields(hoverArgs, {
462+cdpUrl: state.cdpBaseUrl,
463+targetId: "abcd1234",
464+ref: "2",
465+});
479466expect((hoverArgs as { timeoutMs?: number }).timeoutMs).toBeUndefined();
480467481468const scroll = await postJson<{ ok: boolean }>(`${base}/act`, {
482469kind: "scrollIntoView",
483470ref: "2",
484471});
485472expect(scroll.ok).toBe(true);
486-expect(pwMocks.scrollIntoViewViaPlaywright).toHaveBeenCalledWith(
487-expect.objectContaining({
488-cdpUrl: state.cdpBaseUrl,
489-targetId: "abcd1234",
490-ref: "2",
491-}),
492-);
493473const [scrollArgs] = pwMocks.scrollIntoViewViaPlaywright.mock.calls[0] ?? [];
474+expectRecordFields(scrollArgs, {
475+cdpUrl: state.cdpBaseUrl,
476+targetId: "abcd1234",
477+ref: "2",
478+});
494479expect((scrollArgs as { timeoutMs?: number }).timeoutMs).toBeUndefined();
495480496481const drag = await postJson<{ ok: boolean }>(`${base}/act`, {
@@ -499,15 +484,13 @@ describe("browser control server", () => {
499484endRef: "4",
500485});
501486expect(drag.ok).toBe(true);
502-expect(pwMocks.dragViaPlaywright).toHaveBeenCalledWith(
503-expect.objectContaining({
504-cdpUrl: state.cdpBaseUrl,
505-targetId: "abcd1234",
506-startRef: "3",
507-endRef: "4",
508-}),
509-);
510487const [dragArgs] = pwMocks.dragViaPlaywright.mock.calls[0] ?? [];
488+expectRecordFields(dragArgs, {
489+cdpUrl: state.cdpBaseUrl,
490+targetId: "abcd1234",
491+startRef: "3",
492+endRef: "4",
493+});
511494expect((dragArgs as { timeoutMs?: number }).timeoutMs).toBeUndefined();
512495});
513496it("POST /tabs/open?profile=unknown returns 404", async () => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。