



























@@ -1,5 +1,9 @@
11import { beforeEach, describe, expect, it, vi } from "vitest";
2-import { withPageScopedCdpClient } from "./pw-session.page-cdp.js";
2+import {
3+BROWSER_REF_MARKER_ATTRIBUTE,
4+markBackendDomRefsOnPage,
5+withPageScopedCdpClient,
6+} from "./pw-session.page-cdp.js";
3748describe("pw-session page-scoped CDP client", () => {
59beforeEach(() => {
@@ -32,4 +36,107 @@ describe("pw-session page-scoped CDP client", () => {
3236expect(sessionSend).toHaveBeenCalledWith("Emulation.setLocaleOverride", { locale: "en-US" });
3337expect(sessionDetach).toHaveBeenCalledTimes(1);
3438});
39+40+it("marks backend DOM refs on the page", async () => {
41+const sessionSend = vi.fn(async (method: string, params?: Record<string, unknown>) => {
42+if (method === "DOM.pushNodesByBackendIdsToFrontend") {
43+expect(params).toEqual({ backendNodeIds: [42, 84] });
44+return { nodeIds: [101, 202] };
45+}
46+return {};
47+});
48+const sessionDetach = vi.fn(async () => {});
49+const newCDPSession = vi.fn(async () => ({
50+send: sessionSend,
51+detach: sessionDetach,
52+}));
53+const evaluateAll = vi.fn(async () => {});
54+const page = {
55+context: () => ({
56+ newCDPSession,
57+}),
58+locator: vi.fn(() => ({ evaluateAll })),
59+};
60+61+const marked = await markBackendDomRefsOnPage({
62+page: page as never,
63+refs: [
64+{ ref: "ax1", backendDOMNodeId: 42 },
65+{ ref: "ax2", backendDOMNodeId: 84 },
66+],
67+});
68+69+expect(page.locator).toHaveBeenCalledWith(`[${BROWSER_REF_MARKER_ATTRIBUTE}]`);
70+expect(evaluateAll).toHaveBeenCalledTimes(1);
71+expect(sessionSend).toHaveBeenNthCalledWith(1, "DOM.enable", undefined);
72+expect(sessionSend).toHaveBeenNthCalledWith(2, "DOM.pushNodesByBackendIdsToFrontend", {
73+backendNodeIds: [42, 84],
74+});
75+expect(sessionSend).toHaveBeenNthCalledWith(3, "DOM.setAttributeValue", {
76+nodeId: 101,
77+name: BROWSER_REF_MARKER_ATTRIBUTE,
78+value: "ax1",
79+});
80+expect(sessionSend).toHaveBeenNthCalledWith(4, "DOM.setAttributeValue", {
81+nodeId: 202,
82+name: BROWSER_REF_MARKER_ATTRIBUTE,
83+value: "ax2",
84+});
85+expect(marked).toEqual(new Set(["ax1", "ax2"]));
86+expect(sessionDetach).toHaveBeenCalledTimes(1);
87+});
88+89+it("clears stale markers even when no backend refs are valid", async () => {
90+const newCDPSession = vi.fn();
91+const evaluateAll = vi.fn(async () => {});
92+const page = {
93+context: () => ({
94+ newCDPSession,
95+}),
96+locator: vi.fn(() => ({ evaluateAll })),
97+};
98+99+const marked = await markBackendDomRefsOnPage({
100+page: page as never,
101+refs: [{ ref: "e1", backendDOMNodeId: 0 }],
102+});
103+104+expect(page.locator).toHaveBeenCalledWith(`[${BROWSER_REF_MARKER_ATTRIBUTE}]`);
105+expect(evaluateAll).toHaveBeenCalledTimes(1);
106+expect(newCDPSession).not.toHaveBeenCalled();
107+expect(marked).toEqual(new Set());
108+});
109+110+it("keeps unmarked refs out of the marked set when marker writes fail", async () => {
111+const sessionSend = vi.fn(async (method: string) => {
112+if (method === "DOM.pushNodesByBackendIdsToFrontend") {
113+return { nodeIds: [101, 202] };
114+}
115+if (method === "DOM.setAttributeValue") {
116+throw new Error("detached");
117+}
118+return {};
119+});
120+const sessionDetach = vi.fn(async () => {});
121+const page = {
122+context: () => ({
123+newCDPSession: vi.fn(async () => ({
124+send: sessionSend,
125+detach: sessionDetach,
126+})),
127+}),
128+locator: vi.fn(() => ({ evaluateAll: vi.fn(async () => {}) })),
129+};
130+131+const marked = await markBackendDomRefsOnPage({
132+page: page as never,
133+refs: [
134+{ ref: "ax1", backendDOMNodeId: 42 },
135+{ ref: "ax2", backendDOMNodeId: 84 },
136+],
137+});
138+139+expect(marked).toEqual(new Set());
140+expect(sessionDetach).toHaveBeenCalledTimes(1);
141+});
35142});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。