






























@@ -36,12 +36,133 @@ function createElementProgram(): Command {
3636return program;
3737}
383839+function getLastActionBody(): Record<string, unknown> | undefined {
40+return (mocks.callBrowserRequest.mock.calls.at(-1)?.[1] as { body?: Record<string, unknown> })
41+?.body;
42+}
43+3944describe("browser element commands", () => {
4045beforeEach(() => {
4146mocks.callBrowserRequest.mockClear();
4247getBrowserCliRuntimeCapture().resetRuntimeCapture();
4348});
444950+it.each([
51+{
52+name: "click",
53+argv: [
54+"browser",
55+"click",
56+" ref-1 ",
57+"--target-id",
58+"tab-1",
59+"--double",
60+"--button",
61+"right",
62+"--modifiers",
63+"Shift, Alt",
64+],
65+expectedBody: {
66+kind: "click",
67+ref: "ref-1",
68+targetId: "tab-1",
69+doubleClick: true,
70+button: "right",
71+modifiers: ["Shift", "Alt"],
72+},
73+},
74+{
75+name: "click-coords",
76+argv: [
77+"browser",
78+"click-coords",
79+"12.5",
80+"42",
81+"--target-id",
82+"tab-2",
83+"--double",
84+"--button",
85+"middle",
86+"--delay-ms",
87+"25",
88+],
89+expectedBody: {
90+kind: "clickCoords",
91+x: 12.5,
92+y: 42,
93+targetId: "tab-2",
94+doubleClick: true,
95+button: "middle",
96+delayMs: 25,
97+},
98+},
99+{
100+name: "type",
101+argv: ["browser", "type", "input-1", "hello", "--submit", "--slowly", "--target-id", "tab-2"],
102+expectedBody: {
103+kind: "type",
104+ref: "input-1",
105+text: "hello",
106+submit: true,
107+slowly: true,
108+targetId: "tab-2",
109+},
110+},
111+{
112+name: "press",
113+argv: ["browser", "press", "Enter", "--target-id", "tab-3"],
114+expectedBody: { kind: "press", key: "Enter", targetId: "tab-3" },
115+},
116+{
117+name: "hover",
118+argv: ["browser", "hover", "node-1", "--target-id", "tab-4"],
119+expectedBody: { kind: "hover", ref: "node-1", targetId: "tab-4" },
120+},
121+{
122+name: "scrollintoview",
123+argv: ["browser", "scrollintoview", "node-2", "--target-id", "tab-5"],
124+expectedBody: { kind: "scrollIntoView", ref: "node-2", targetId: "tab-5" },
125+},
126+{
127+name: "drag",
128+argv: ["browser", "drag", "start-1", "end-1", "--target-id", "tab-6"],
129+expectedBody: {
130+kind: "drag",
131+startRef: "start-1",
132+endRef: "end-1",
133+targetId: "tab-6",
134+},
135+},
136+{
137+name: "select",
138+argv: ["browser", "select", "select-1", "alpha", "beta", "--target-id", "tab-7"],
139+expectedBody: {
140+kind: "select",
141+ref: "select-1",
142+values: ["alpha", "beta"],
143+targetId: "tab-7",
144+},
145+},
146+])("sends the expected $name action body", async ({ argv, expectedBody }) => {
147+const program = createElementProgram();
148+149+await program.parseAsync(argv, { from: "user" });
150+151+expect(getLastActionBody()).toMatchObject(expectedBody);
152+});
153+154+it("rejects a blank required ref before dispatch", async () => {
155+const program = createElementProgram();
156+157+await expect(program.parseAsync(["browser", "click", " "], { from: "user" })).rejects.toThrow(
158+"__exit__:1",
159+);
160+161+const capture = getBrowserCliRuntimeCapture();
162+expect(capture.runtimeErrors.join("\n")).toContain("ref is required");
163+expect(mocks.callBrowserRequest).not.toHaveBeenCalled();
164+});
165+45166it("rejects non-decimal coordinate values before dispatch", async () => {
46167const program = createElementProgram();
47168此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。