diff --git a/packages/server-v4/openapi.v4.yaml b/packages/server-v4/openapi.v4.yaml index 2ecfaa6c0..f1ec1cc70 100644 --- a/packages/server-v4/openapi.v4.yaml +++ b/packages/server-v4/openapi.v4.yaml @@ -2715,6 +2715,12 @@ components: enum: - jsevent - xy + expectDownload: + type: boolean + expectNavigation: + type: boolean + expectPopup: + type: boolean required: - selector additionalProperties: false @@ -6585,6 +6591,12 @@ components: enum: - jsevent - xy + expectDownload: + type: boolean + expectNavigation: + type: boolean + expectPopup: + type: boolean required: - selector - method diff --git a/packages/server-v4/src/schemas/v4/page.ts b/packages/server-v4/src/schemas/v4/page.ts index f281c0c98..57b6231b4 100644 --- a/packages/server-v4/src/schemas/v4/page.ts +++ b/packages/server-v4/src/schemas/v4/page.ts @@ -277,7 +277,9 @@ export const PageClickParamsSchema = PageWithPageIdSchema.extend({ clickCount: z.number().int().lte(3).gte(1).optional(), returnSelector: z.boolean().default(false).optional(), method: z.enum(["jsevent", "xy"]).default("xy"), - // TODO: add expectDownload, expectNavigation, expectPopup OR expect: z.enum(...) + expectDownload: z.boolean().optional(), + expectNavigation: z.boolean().optional(), + expectPopup: z.boolean().optional(), }) .strict() .meta({ id: "PageClickParams" }); diff --git a/packages/server-v4/test/integration/v4/page.test.ts b/packages/server-v4/test/integration/v4/page.test.ts index d61b841d0..d6b70c083 100644 --- a/packages/server-v4/test/integration/v4/page.test.ts +++ b/packages/server-v4/test/integration/v4/page.test.ts @@ -932,6 +932,22 @@ describe("v4 page routes", { concurrency: false }, () => { assertSuccessAction(jseventCtx, "click"); }); + it("POST /v4/page/click accepts expect* options", async () => { + const gotoCtx = await postPageRoute("goto", sessionId, { + url: CLICK_TEST_URL, + waitUntil: "load", + }); + assertSuccessAction(gotoCtx, "goto"); + + const clickCtx = await postPageRoute("click", sessionId, { + selector: { css: "#click-target" }, + expectNavigation: true, + expectPopup: false, + expectDownload: false, + }); + assertSuccessAction(clickCtx, "click"); + }); + it("POST /v4/page/dragAndDrop accepts mixed selector types (xpath from, coordinates to)", async () => { const gotoCtx = await postPageRoute("goto", sessionId, { url: METHODS_TEST_URL,