@browserbasehq/orca 3.1.0-patch.1 → 3.1.0-patch.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +45 -17
- package/dist/cjs/cli.js.map +2 -2
- package/dist/cjs/index.js +192 -123
- package/dist/cjs/index.js.map +3 -3
- package/dist/cjs/lib/logger.d.ts +1 -1
- package/dist/cjs/lib/modelUtils.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +2 -1
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/cjs/lib/v3/api.d.ts +16 -1
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +12 -12
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +2 -2
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +1 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +1 -1
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +2 -2
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
- package/dist/cjs/lib/v3/types/public/api.d.ts +8 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +1 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/cjs/tests/agent-execution-model.test.js +139 -0
- package/dist/cjs/tests/agent-execution-model.test.js.map +7 -0
- package/dist/cjs/tests/api-multiregion.test.js +73 -0
- package/dist/cjs/tests/api-multiregion.test.js.map +7 -0
- package/dist/cjs/tests/model-utils.test.js +43 -0
- package/dist/cjs/tests/model-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/export-surface.test.js +1 -0
- package/dist/cjs/tests/public-api/export-surface.test.js.map +1 -1
- package/dist/cjs/tests/public-api/llm-and-agents.test.js +1 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/cjs/tests/public-api/public-error-types.test.js +3 -1
- package/dist/cjs/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/cjs/tests/public-api/v3-core.test.js +1 -0
- package/dist/cjs/tests/public-api/v3-core.test.js.map +1 -1
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js +2 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +1 -1
- package/dist/cjs/tests/understudy-command-exception.test.js +52 -0
- package/dist/cjs/tests/understudy-command-exception.test.js.map +7 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/lib/logger.d.ts +1 -1
- package/dist/esm/lib/modelUtils.d.ts +3 -0
- package/dist/esm/lib/modelUtils.js +7 -2
- package/dist/esm/lib/modelUtils.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +2 -1
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/api.d.ts +16 -1
- package/dist/esm/lib/v3/api.js +41 -5
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -20
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +5 -2
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.js +36 -17
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js +2 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js +12 -12
- package/dist/esm/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js +2 -2
- package/dist/esm/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-fill.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-fill.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js +1 -0
- package/dist/esm/lib/v3/tests/locator-select-option.spec.js.map +1 -1
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js +2 -2
- package/dist/esm/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +8 -0
- package/dist/esm/lib/v3/types/public/api.js +5 -3
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/index.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +12 -6
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +7 -8
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/agent-execution-model.test.js +139 -0
- package/dist/esm/tests/agent-execution-model.test.js.map +7 -0
- package/dist/esm/tests/api-multiregion.test.js +73 -0
- package/dist/esm/tests/api-multiregion.test.js.map +7 -0
- package/dist/esm/tests/model-utils.test.js +43 -0
- package/dist/esm/tests/model-utils.test.js.map +7 -0
- package/dist/esm/tests/public-api/export-surface.test.js +1 -0
- package/dist/esm/tests/public-api/export-surface.test.js.map +1 -1
- package/dist/esm/tests/public-api/llm-and-agents.test.js +1 -0
- package/dist/esm/tests/public-api/llm-and-agents.test.js.map +1 -1
- package/dist/esm/tests/public-api/public-error-types.test.js +3 -1
- package/dist/esm/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/esm/tests/public-api/v3-core.test.js +1 -0
- package/dist/esm/tests/public-api/v3-core.test.js.map +1 -1
- package/dist/esm/tests/snapshot-capture-orchestration.test.js +2 -0
- package/dist/esm/tests/snapshot-capture-orchestration.test.js.map +1 -1
- package/dist/esm/tests/understudy-command-exception.test.js +55 -0
- package/dist/esm/tests/understudy-command-exception.test.js.map +7 -0
- package/package.json +1 -3
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/agent-callbacks.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport type { StepResult, ToolSet } from \"ai\";\nimport { StreamingCallbacksInNonStreamingModeError } from \"../types/public/sdkErrors.js\";\n\ntest.describe(\"Stagehand agent callbacks behavior\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3({\n ...v3TestConfig,\n experimental: true, // Required for callbacks and streaming\n });\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test.describe(\"Non-streaming callbacks (stream: false)\", () => {\n test(\"onStepFinish callback is called for each step\", async () => {\n test.setTimeout(60000);\n\n const stepFinishEvents: StepResult<ToolSet>[] = [];\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n await agent.execute({\n instruction:\n \"What is the title of this page? Mark the task as complete after answering.\",\n maxSteps: 5,\n callbacks: {\n onStepFinish: async (event) => {\n stepFinishEvents.push(event);\n },\n },\n });\n\n // Should have at least one step finish event\n expect(stepFinishEvents.length).toBeGreaterThan(0);\n\n // Each event should have expected properties\n for (const event of stepFinishEvents) {\n expect(event).toHaveProperty(\"finishReason\");\n expect(event).toHaveProperty(\"text\");\n }\n });\n\n test(\"prepareStep callback is called before each step\", async () => {\n test.setTimeout(60000);\n\n let prepareStepCallCount = 0;\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n await agent.execute({\n instruction: \"Simply describe the page briefly.\",\n maxSteps: 3,\n callbacks: {\n prepareStep: async (stepContext) => {\n prepareStepCallCount++;\n return stepContext;\n },\n },\n });\n\n // prepareStep should have been called at least once\n expect(prepareStepCallCount).toBeGreaterThan(0);\n });\n\n test(\"callbacks receive tool call information\", async () => {\n test.setTimeout(60000);\n\n const toolCalls: Array<{ toolName: string; input: unknown }> = [];\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n await agent.execute({\n instruction:\n \"Take a screenshot and describe what you see briefly. Then mark the task as complete.\",\n maxSteps: 3,\n callbacks: {\n onStepFinish: async (event) => {\n if (event.toolCalls) {\n for (const tc of event.toolCalls) {\n toolCalls.push({\n toolName: tc.toolName,\n input: tc.input,\n });\n }\n }\n },\n },\n });\n\n // Should have captured at least one tool call (e.g. screenshot)\n expect(toolCalls.length).toBeGreaterThan(0);\n expect(\n toolCalls.some(\n (tc) => tc.toolName === \"screenshot\" || tc.toolName === \"ariaTree\",\n ),\n ).toBe(true);\n });\n });\n\n test.describe(\"Streaming callbacks (stream: true)\", () => {\n test(\"onStepFinish callback is called for each step in stream mode\", async () => {\n test.setTimeout(60000);\n\n const stepFinishEvents: StepResult<ToolSet>[] = [];\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const streamResult = await agent.execute({\n instruction: \"What is this page? Describe it briefly.\",\n maxSteps: 5,\n callbacks: {\n onStepFinish: async (event) => {\n stepFinishEvents.push(event);\n },\n },\n });\n\n // Consume the stream\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n // Wait for result to complete\n await streamResult.result;\n\n // Should have at least one step finish event\n expect(stepFinishEvents.length).toBeGreaterThan(0);\n });\n\n test(\"onChunk callback is called for each chunk\", async () => {\n test.setTimeout(60000);\n\n let chunkCount = 0;\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const streamResult = await agent.execute({\n instruction: \"Say hello briefly and describe the page.\",\n maxSteps: 3,\n callbacks: {\n onChunk: async () => {\n chunkCount++;\n },\n },\n });\n\n // Consume the stream\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n await streamResult.result;\n\n // Should have received chunks\n expect(chunkCount).toBeGreaterThan(0);\n });\n\n test(\"onFinish callback is called when stream completes\", async () => {\n test.setTimeout(60000);\n\n let finishCalled = false;\n let finishEvent: unknown = null;\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const streamResult = await agent.execute({\n instruction: \"Simply describe the page briefly.\",\n maxSteps: 3,\n callbacks: {\n onFinish: (event) => {\n finishCalled = true;\n finishEvent = event;\n },\n },\n });\n\n // Consume the stream\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n await streamResult.result;\n\n // onFinish should have been called\n expect(finishCalled).toBe(true);\n expect(finishEvent).not.toBeNull();\n });\n\n test(\"prepareStep callback works in stream mode\", async () => {\n test.setTimeout(60000);\n\n let prepareStepCallCount = 0;\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const streamResult = await agent.execute({\n instruction: \"Simply describe the page briefly.\",\n maxSteps: 3,\n callbacks: {\n prepareStep: async (stepContext) => {\n prepareStepCallCount++;\n return stepContext;\n },\n },\n });\n\n // Consume the stream\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n await streamResult.result;\n\n // prepareStep should have been called at least once\n expect(prepareStepCallCount).toBeGreaterThan(0);\n });\n });\n\n test.describe(\"Streaming-only callbacks runtime validation\", () => {\n test(\"throws StreamingCallbacksInNonStreamingModeError when onChunk is used\", async () => {\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n try {\n await agent.execute({\n instruction: \"test\",\n callbacks: {\n onChunk: (() => {}) as never,\n },\n });\n throw new Error(\"Expected error to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(StreamingCallbacksInNonStreamingModeError);\n expect(\n (error as StreamingCallbacksInNonStreamingModeError).invalidCallbacks,\n ).toEqual([\"onChunk\"]);\n }\n });\n\n test(\"throws StreamingCallbacksInNonStreamingModeError when onFinish is used\", async () => {\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n try {\n await agent.execute({\n instruction: \"test\",\n callbacks: {\n onFinish: (() => {}) as never,\n },\n });\n throw new Error(\"Expected error to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(StreamingCallbacksInNonStreamingModeError);\n expect(\n (error as StreamingCallbacksInNonStreamingModeError).invalidCallbacks,\n ).toEqual([\"onFinish\"]);\n }\n });\n\n test(\"throws StreamingCallbacksInNonStreamingModeError when onError is used\", async () => {\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n try {\n await agent.execute({\n instruction: \"test\",\n callbacks: {\n onError: (() => {}) as never,\n },\n });\n throw new Error(\"Expected error to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(StreamingCallbacksInNonStreamingModeError);\n expect(\n (error as StreamingCallbacksInNonStreamingModeError).invalidCallbacks,\n ).toEqual([\"onError\"]);\n }\n });\n\n test(\"throws StreamingCallbacksInNonStreamingModeError when onAbort is used\", async () => {\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n try {\n await agent.execute({\n instruction: \"test\",\n callbacks: {\n onAbort: (() => {}) as never,\n },\n });\n throw new Error(\"Expected error to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(StreamingCallbacksInNonStreamingModeError);\n expect(\n (error as StreamingCallbacksInNonStreamingModeError).invalidCallbacks,\n ).toEqual([\"onAbort\"]);\n }\n });\n\n test(\"error includes all invalid callbacks when multiple are used\", async () => {\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n try {\n await agent.execute({\n instruction: \"test\",\n callbacks: {\n onChunk: (() => {}) as never,\n onFinish: (() => {}) as never,\n },\n });\n throw new Error(\"Expected error to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(StreamingCallbacksInNonStreamingModeError);\n expect(\n (error as StreamingCallbacksInNonStreamingModeError).invalidCallbacks,\n ).toEqual([\"onChunk\", \"onFinish\"]);\n }\n });\n });\n\n test.describe(\"Combined callbacks\", () => {\n test(\"multiple callbacks can be used together\", async () => {\n test.setTimeout(60000);\n\n let prepareStepCount = 0;\n let stepFinishCount = 0;\n\n const agent = v3.agent({\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n await agent.execute({\n instruction: \"Simply describe the page briefly.\",\n maxSteps: 3,\n callbacks: {\n prepareStep: async (stepContext) => {\n prepareStepCount++;\n return stepContext;\n },\n onStepFinish: async () => {\n stepFinishCount++;\n },\n },\n });\n\n // Both callbacks should have been called\n expect(prepareStepCount).toBeGreaterThan(0);\n expect(stepFinishCount).toBeGreaterThan(0);\n });\n\n test(\"streaming with multiple callbacks\", async () => {\n test.setTimeout(60000);\n\n let prepareStepCount = 0;\n let stepFinishCount = 0;\n let chunkCount = 0;\n let finishCalled = false;\n\n const agent = v3.agent({\n stream: true,\n model: \"anthropic/claude-haiku-4-5-20251001\",\n });\n\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n const streamResult = await agent.execute({\n instruction: \"Say hello briefly and describe the page.\",\n maxSteps: 3,\n callbacks: {\n prepareStep: async (stepContext) => {\n prepareStepCount++;\n return stepContext;\n },\n onStepFinish: async () => {\n stepFinishCount++;\n },\n onChunk: async () => {\n chunkCount++;\n },\n onFinish: () => {\n finishCalled = true;\n },\n },\n });\n\n // Consume the stream\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n for await (const _ of streamResult.textStream) {\n // Just consume\n }\n\n await streamResult.result;\n\n // All callbacks should have been called\n expect(prepareStepCount).toBeGreaterThan(0);\n expect(stepFinishCount).toBeGreaterThan(0);\n expect(chunkCount).toBeGreaterThan(0);\n expect(finishCalled).toBe(true);\n });\n });\n});\n"],
|
|
5
|
-
"mappings": "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
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -72,7 +72,7 @@ test.describe("context.addInitScript", () => {
|
|
|
72
72
|
});
|
|
73
73
|
test("applies script (with args) to newly created pages", async () => {
|
|
74
74
|
const payload = { greeting: "hi", nested: { count: 2 } };
|
|
75
|
-
const initPayload = (arg) => {
|
|
75
|
+
const initPayload = ((arg) => {
|
|
76
76
|
function setPayload() {
|
|
77
77
|
const root = document.documentElement;
|
|
78
78
|
if (!root) return;
|
|
@@ -85,7 +85,7 @@ test.describe("context.addInitScript", () => {
|
|
|
85
85
|
} else {
|
|
86
86
|
setPayload();
|
|
87
87
|
}
|
|
88
|
-
};
|
|
88
|
+
});
|
|
89
89
|
await ctx.addInitScript(initPayload, payload);
|
|
90
90
|
const newPage = await ctx.newPage();
|
|
91
91
|
await newPage.goto(toDataUrl("<html><body>child</body></html>"), {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/context-addInitScript.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport { V3Context } from \"../understudy/context.js\";\n\nconst toDataUrl = (html: string): string =>\n `data:text/html,${encodeURIComponent(html)}`;\n\ntest.describe(\"context.addInitScript\", () => {\n let v3: V3;\n let ctx: V3Context;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n ctx = v3.context;\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"runs before inline document scripts on navigation\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(() => {\n (window as unknown as { __fromContextInit?: string }).__fromContextInit =\n \"injected-value\";\n });\n\n const html = `<!DOCTYPE html>\n <html>\n <body>\n <script>\n var value = (window && window.__fromContextInit) || 'missing';\n document.body.dataset.initWitness = value;\n </script>\n </body>\n </html>`;\n\n await page.goto(toDataUrl(html), { waitUntil: \"load\" });\n\n const observed = await page.evaluate(() => {\n return document.body.dataset.initWitness;\n });\n expect(observed).toBe(\"injected-value\");\n });\n\n test(\"re-applies the script on every navigation for the same page\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(`\n (function () {\n function markVisit() {\n var root = document.documentElement;\n if (!root) return;\n var current = Number(window.name || \"0\");\n var next = current + 1;\n window.name = String(next);\n root.dataset.visitCount = String(next);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", markVisit, {\n once: true,\n });\n } else {\n markVisit();\n }\n })();\n `);\n\n await page.goto(toDataUrl(\"<html><body>first</body></html>\"), {\n waitUntil: \"load\",\n });\n const first = await page.evaluate(() => {\n return Number(document.documentElement.dataset.visitCount ?? \"0\");\n });\n expect(first).toBe(1);\n\n await page.goto(toDataUrl(\"<html><body>second</body></html>\"), {\n waitUntil: \"load\",\n });\n const second = await page.evaluate(() => {\n return Number(document.documentElement.dataset.visitCount ?? \"0\");\n });\n expect(second).toBe(2);\n });\n\n test(\"applies script (with args) to newly created pages\", async () => {\n const payload = { greeting: \"hi\", nested: { count: 2 } };\n\n const initPayload = ((arg) => {\n function setPayload() {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }) as (arg: typeof payload) => void;\n await ctx.addInitScript(initPayload, payload);\n\n const newPage = await ctx.newPage();\n await newPage.goto(toDataUrl(\"<html><body>child</body></html>\"), {\n waitUntil: \"load\",\n });\n\n const observed = await newPage.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"applies script to newPage(url) on initial document\", async () => {\n const payload = { marker: \"newPageUrl\" };\n\n await ctx.addInitScript((arg) => {\n function setPayload(): void {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }, payload);\n\n const newPage = await ctx.newPage(\n toDataUrl(\"<html><body>new page</body></html>\"),\n );\n await newPage.waitForLoadState(\"load\");\n\n const observed = await newPage.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"applies script to pages opened via link clicks\", async () => {\n const payload = { marker: \"linkClick\" };\n\n await ctx.addInitScript((arg) => {\n function setPayload(): void {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }, payload);\n\n const popupUrl = toDataUrl(\"<html><body>popup</body></html>\");\n const openerHtml =\n \"<!DOCTYPE html>\" +\n \"<html><body>\" +\n '<a id=\"open\" target=\"_blank\" href=\"' +\n popupUrl +\n '\">open</a>' +\n \"</body></html>\";\n\n const opener = await ctx.awaitActivePage();\n await opener.goto(toDataUrl(openerHtml), { waitUntil: \"load\" });\n await opener.locator(\"#open\").click();\n\n const openerId = opener.targetId();\n const deadline = Date.now() + 2000;\n let popup = ctx.pages().find((p) => p.targetId() !== openerId);\n while (!popup && Date.now() < deadline) {\n await opener.waitForTimeout(25);\n popup = ctx.pages().find((p) => p.targetId() !== openerId);\n }\n if (!popup) {\n throw new Error(\"Popup page was not created\");\n }\n\n await popup.waitForLoadState(\"load\");\n\n const observed = await popup.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"context.addInitScript installs a function callable from page.evaluate\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(() => {\n // installed before any navigation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n window.sayHelloFromStagehand = () => \"hello from stagehand\";\n });\n\n await page.goto(\"https://example.com\", { waitUntil: \"domcontentloaded\" });\n\n const result = await page.evaluate(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return window.sayHelloFromStagehand();\n });\n\n expect(result).toBe(\"hello from stagehand\");\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAG7B,MAAM,YAAY,CAAC,SACjB,kBAAkB,mBAAmB,IAAI,CAAC;AAE5C,KAAK,SAAS,yBAAyB,MAAM;AAC3C,MAAI;AACJ,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AACd,UAAM,GAAG;AAAA,EACX,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC,CAAC;AAED,OAAK,qDAAqD,YAAY;AACpE,UAAM,OAAO,MAAM,IAAI,gBAAgB;AAEvC,UAAM,IAAI,cAAc,MAAM;AAC5B,MAAC,OAAqD,oBACpD;AAAA,IACJ,CAAC;AAED,UAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUb,UAAM,KAAK,KAAK,UAAU,IAAI,GAAG,EAAE,WAAW,OAAO,CAAC;AAEtD,UAAM,WAAW,MAAM,KAAK,SAAS,MAAM;AACzC,aAAO,SAAS,KAAK,QAAQ;AAAA,IAC/B,CAAC;AACD,WAAO,QAAQ,EAAE,KAAK,gBAAgB;AAAA,EACxC,CAAC;AAED,OAAK,+DAA+D,YAAY;AAC9E,UAAM,OAAO,MAAM,IAAI,gBAAgB;AAEvC,UAAM,IAAI,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAkBvB;AAED,UAAM,KAAK,KAAK,UAAU,iCAAiC,GAAG;AAAA,MAC5D,WAAW;AAAA,IACb,CAAC;AACD,UAAM,QAAQ,MAAM,KAAK,SAAS,MAAM;AACtC,aAAO,OAAO,SAAS,gBAAgB,QAAQ,cAAc,GAAG;AAAA,IAClE,CAAC;AACD,WAAO,KAAK,EAAE,KAAK,CAAC;AAEpB,UAAM,KAAK,KAAK,UAAU,kCAAkC,GAAG;AAAA,MAC7D,WAAW;AAAA,IACb,CAAC;AACD,UAAM,SAAS,MAAM,KAAK,SAAS,MAAM;AACvC,aAAO,OAAO,SAAS,gBAAgB,QAAQ,cAAc,GAAG;AAAA,IAClE,CAAC;AACD,WAAO,MAAM,EAAE,KAAK,CAAC;AAAA,EACvB,CAAC;AAED,OAAK,qDAAqD,YAAY;AACpE,UAAM,UAAU,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,EAAE,EAAE;AAEvD,UAAM,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,6 +9,7 @@ test.describe("Locator content methods (textContent, innerHtml, innerText, input
|
|
|
9
9
|
});
|
|
10
10
|
test.afterEach(async () => {
|
|
11
11
|
await v3?.close?.().catch((e) => {
|
|
12
|
+
void e;
|
|
12
13
|
});
|
|
13
14
|
});
|
|
14
15
|
test("Locator.textContent() returns raw text including hidden content", async () => {
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/locator-content-methods.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator content methods (textContent, innerHtml, innerText, inputValue)\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch((e) => {\n void e;\n });\n });\n\n test(\"Locator.textContent() returns raw text including hidden content\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"content\">\n Hello\n <span style=\"display:none\">Hidden</span>\n World\n </div>\n </body></html>`,\n ),\n );\n\n const content = await page.mainFrame().locator(\"#content\").textContent();\n // textContent includes all text nodes, even hidden ones\n expect(content).toContain(\"Hello\");\n expect(content).toContain(\"Hidden\");\n expect(content).toContain(\"World\");\n });\n\n test(\"Locator.innerText() returns visible text only\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"content\">\n Visible\n <span style=\"display:none\">Hidden</span>\n Text\n </div>\n </body></html>`,\n ),\n );\n\n const text = await page.mainFrame().locator(\"#content\").innerText();\n // innerText is layout-aware and excludes hidden elements\n expect(text).toContain(\"Visible\");\n expect(text).toContain(\"Text\");\n expect(text).not.toContain(\"Hidden\");\n });\n\n test(\"Locator.innerHtml() returns HTML markup\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"container\">\n <p class=\"para\">Hello</p>\n <strong>World</strong>\n </div>\n </body></html>`,\n ),\n );\n\n const html = await page.mainFrame().locator(\"#container\").innerHtml();\n expect(html).toContain('<p class=\"para\">Hello</p>');\n expect(html).toContain(\"<strong>World</strong>\");\n });\n\n test(\"Locator.inputValue() reads value from input elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"text-input\" type=\"text\" value=\"hello world\" />\n <textarea id=\"textarea\">multi\nline\ntext</textarea>\n <input id=\"number-input\" type=\"number\" value=\"42\" />\n </body></html>`,\n ),\n );\n\n const textValue = await page\n .mainFrame()\n .locator(\"#text-input\")\n .inputValue();\n expect(textValue).toBe(\"hello world\");\n\n const taValue = await page.mainFrame().locator(\"#textarea\").inputValue();\n expect(taValue).toBe(\"multi\\nline\\ntext\");\n\n const numValue = await page\n .mainFrame()\n .locator(\"#number-input\")\n .inputValue();\n expect(numValue).toBe(\"42\");\n });\n\n test(\"Locator.textContent() on empty elements returns empty string\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"empty\"></div>\n <span id=\"whitespace\"> </span>\n </body></html>`,\n ),\n );\n\n const empty = await page.mainFrame().locator(\"#empty\").textContent();\n expect(empty).toBe(\"\");\n\n const whitespace = await page\n .mainFrame()\n .locator(\"#whitespace\")\n .textContent();\n expect(whitespace.trim()).toBe(\"\");\n });\n\n test(\"Locator.innerText() with nested elements and formatting\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"formatted\">\n <p>Line 1</p>\n <p>Line 2</p>\n <ul>\n <li>Item 1</li>\n <li>Item 2</li>\n </ul>\n </div>\n </body></html>`,\n ),\n );\n\n const text = await page.mainFrame().locator(\"#formatted\").innerText();\n expect(text).toContain(\"Line 1\");\n expect(text).toContain(\"Line 2\");\n expect(text).toContain(\"Item 1\");\n expect(text).toContain(\"Item 2\");\n });\n\n test(\"Locator.inputValue() on contenteditable elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"editable\" contenteditable=\"true\">Editable content</div>\n </body></html>`,\n ),\n );\n\n const value = await page.mainFrame().locator(\"#editable\").inputValue();\n expect(value).toBe(\"Editable content\");\n });\n\n test(\"Locator.innerHtml() preserves attributes and structure\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"complex\">\n <a href=\"/link\" class=\"link-class\">Link</a>\n <img src=\"image.png\" alt=\"test\" />\n </div>\n </body></html>`,\n ),\n );\n\n const html = await page.mainFrame().locator(\"#complex\").innerHtml();\n expect(html).toContain('href=\"/link\"');\n expect(html).toContain('class=\"link-class\"');\n expect(html).toContain('src=\"image.png\"');\n expect(html).toContain('alt=\"test\"');\n });\n\n test(\"Locator.textContent() vs innerText() with script/style tags\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"mixed\">\n Visible text\n <script>console.log('script');</script>\n <style>body { color: red; }</style>\n More visible\n </div>\n </body></html>`,\n ),\n );\n\n const textContent = await page.mainFrame().locator(\"#mixed\").textContent();\n // textContent includes script content\n expect(textContent).toContain(\"Visible text\");\n expect(textContent).toContain(\"More visible\");\n\n const innerText = await page.mainFrame().locator(\"#mixed\").innerText();\n // innerText excludes script/style\n expect(innerText).toContain(\"Visible text\");\n expect(innerText).toContain(\"More visible\");\n expect(innerText).not.toContain(\"console.log\");\n });\n\n test(\"Locator.inputValue() returns empty string for non-input elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"div\">Not an input</div>\n <input id=\"empty-input\" type=\"text\" value=\"\" />\n </body></html>`,\n ),\n );\n\n const divValue = await page.mainFrame().locator(\"#div\").inputValue();\n expect(divValue).toBe(\"\");\n\n const emptyInput = await page\n .mainFrame()\n .locator(\"#empty-input\")\n .inputValue();\n expect(emptyInput).toBe(\"\");\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B,KAAK,SAAS,2EAA2E,MAAM;AAC7F,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM;AAAA,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/locator-fill.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { StagehandLocatorError } from \"../types/public/sdkErrors.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator.fill()\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch((e) => {\n void e;\n });\n });\n\n test(\"fills date inputs via value setter even when beforeinput blocks insertText\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n <script>\n const input = document.getElementById('date');\n input.addEventListener('beforeinput', (e) => {\n if (e && e.inputType === 'insertText') e.preventDefault();\n });\n </script>\n </body></html>`,\n ),\n );\n\n const dateInput = page.mainFrame().locator(\"xpath=/html/body/input\");\n await dateInput.fill(\"2026-01-01\");\n\n const value = await dateInput.inputValue();\n expect(value).toBe(\"2026-01-01\");\n });\n\n test(\"xpath case: throws StagehandLocatorError when fill encounters an exception\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n </body></html>`,\n ),\n );\n\n await page.waitForSelector(\"xpath=/html/body/input\");\n\n await page.evaluate(() => {\n const input = document.querySelector(\"input\");\n Object.defineProperty(input, \"isConnected\", {\n get() {\n throw new Error(\"boom\");\n },\n });\n });\n\n const dateInput = page.mainFrame().locator(\"xpath=/html/body/input\");\n let error: unknown;\n try {\n await dateInput.fill(\"2026-01-01\");\n } catch (err) {\n error = err;\n }\n\n expect(error).toBeInstanceOf(StagehandLocatorError);\n if (error instanceof Error) {\n // Log the message so it's visible in test output.\n expect(error.message).toContain(\"Error Filling Element\");\n expect(error.message).toContain(\"selector: xpath=/html/body/input\");\n expect(error.message).toContain(\"boom\");\n }\n });\n\n test(\"css selector case: throws StagehandLocatorError when fill encounters an exception\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n </body></html>`,\n ),\n );\n\n await page.waitForSelector(\"#date\");\n\n // Override in main world\n await page.evaluate(() => {\n const input = document.querySelector(\"input\");\n Object.defineProperty(input, \"isConnected\", {\n get() {\n throw new Error(\"boom\");\n },\n configurable: true,\n });\n });\n\n // Also override in the isolated world that CSS selectors use\n const frameId = page.mainFrameId();\n const { executionContextId } = await page.sendCDP<{\n executionContextId: number;\n }>(\"Page.createIsolatedWorld\", {\n frameId,\n worldName: \"v3-world\",\n });\n\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: `(() => {\n const input = document.querySelector('input');\n if (input) {\n Object.defineProperty(input, 'isConnected', {\n get() { throw new Error(\"boom\"); },\n configurable: true\n });\n }\n })()`,\n contextId: executionContextId,\n });\n\n const dateInput = page.mainFrame().locator(\"#date\");\n let error: unknown;\n try {\n await dateInput.fill(\"2026-01-01\");\n } catch (err) {\n error = err;\n }\n\n expect(error).toBeInstanceOf(StagehandLocatorError);\n if (error instanceof Error) {\n expect(error.message).toContain(\"Error Filling Element\");\n expect(error.message).toContain(\"selector: #date\");\n expect(error.message).toContain(\"boom\");\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,UAAU;AACnB,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAE7B,KAAK,SAAS,kBAAkB,MAAM;AACpC,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM;AAAA,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/locator-input-methods.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator input methods (fill, type, hover, isVisible, isChecked)\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch((e) => {\n void e;\n });\n });\n\n test(\"Locator.fill() sets input value directly\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"name\" type=\"text\" />\n <div id=\"out\"></div>\n </body></html>`,\n ),\n );\n\n const input = page.mainFrame().locator(\"#name\");\n await input.fill(\"Hello World\");\n\n const value = await input.inputValue();\n expect(value).toBe(\"Hello World\");\n });\n\n test(\"Locator.type() types text character by character\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"search\" type=\"text\" />\n </body></html>`,\n ),\n );\n\n const input = page.mainFrame().locator(\"#search\");\n await input.type(\"test123\", { delay: 10 });\n\n const value = await input.inputValue();\n expect(value).toBe(\"test123\");\n });\n\n test(\"Locator.hover() moves mouse to element center\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <button id=\"btn\" onmouseover=\"this.dataset.hovered='true'\" onmouseout=\"this.dataset.hovered='false'\">Hover Me</button>\n </body></html>`,\n ),\n );\n\n const btn = page.mainFrame().locator(\"#btn\");\n await btn.hover();\n\n const hovered = await page.mainFrame().evaluate(() => {\n const b = document.getElementById(\"btn\") as HTMLButtonElement | null;\n return b?.dataset.hovered === \"true\";\n });\n\n expect(hovered).toBe(true);\n });\n\n test(\"Locator.isVisible() returns true for visible elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"visible\">I am visible</div>\n <div id=\"hidden\" style=\"display:none\">I am hidden</div>\n <div id=\"invisible\" style=\"visibility:hidden\">I am invisible</div>\n <div id=\"transparent\" style=\"opacity:0\">I am transparent</div>\n <div id=\"zero-size\" style=\"width:0;height:0\">Zero size</div>\n </body></html>`,\n ),\n );\n\n const visible = await page.mainFrame().locator(\"#visible\").isVisible();\n expect(visible).toBe(true);\n\n const hidden = await page.mainFrame().locator(\"#hidden\").isVisible();\n expect(hidden).toBe(false);\n\n const invisible = await page.mainFrame().locator(\"#invisible\").isVisible();\n expect(invisible).toBe(false);\n\n const transparent = await page\n .mainFrame()\n .locator(\"#transparent\")\n .isVisible();\n expect(transparent).toBe(false);\n\n const zeroSize = await page.mainFrame().locator(\"#zero-size\").isVisible();\n expect(zeroSize).toBe(false);\n });\n\n test(\"Locator.isChecked() detects checkbox state\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"checked\" type=\"checkbox\" checked />\n <input id=\"unchecked\" type=\"checkbox\" />\n <input id=\"radio-selected\" type=\"radio\" name=\"opt\" checked />\n <input id=\"radio-unselected\" type=\"radio\" name=\"opt\" />\n </body></html>`,\n ),\n );\n\n const checked = await page.mainFrame().locator(\"#checked\").isChecked();\n expect(checked).toBe(true);\n\n const unchecked = await page.mainFrame().locator(\"#unchecked\").isChecked();\n expect(unchecked).toBe(false);\n\n const radioSelected = await page\n .mainFrame()\n .locator(\"#radio-selected\")\n .isChecked();\n expect(radioSelected).toBe(true);\n\n const radioUnselected = await page\n .mainFrame()\n .locator(\"#radio-unselected\")\n .isChecked();\n expect(radioUnselected).toBe(false);\n });\n\n test(\"Locator.fill() on textarea\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <textarea id=\"ta\"></textarea>\n </body></html>`,\n ),\n );\n\n const ta = page.mainFrame().locator(\"#ta\");\n await ta.fill(\"Multi\\nline\\ntext\");\n\n const value = await ta.inputValue();\n expect(value).toBe(\"Multi\\nline\\ntext\");\n });\n\n test(\"Locator.fill() clears and sets new value\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"inp\" type=\"text\" value=\"initial\" />\n </body></html>`,\n ),\n );\n\n const inp = page.mainFrame().locator(\"#inp\");\n\n let value = await inp.inputValue();\n expect(value).toBe(\"initial\");\n\n await inp.fill(\"replaced\");\n value = await inp.inputValue();\n expect(value).toBe(\"replaced\");\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B,KAAK,SAAS,mEAAmE,MAAM;AACrF,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM;AAAA,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/locator-select-option.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator.selectOption() method\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch((e) => {\n void e; // ignore cleanup errors\n });\n });\n\n test(\"selectOption() selects single option by value\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"fruit\">\n <option value=\"\">-- Choose --</option>\n <option value=\"apple\">Apple</option>\n <option value=\"banana\">Banana</option>\n <option value=\"cherry\">Cherry</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#fruit\");\n const selected = await select.selectOption(\"banana\");\n\n expect(selected).toEqual([\"banana\"]);\n\n const value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"fruit\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"banana\");\n });\n\n test(\"selectOption() selects option by label/text\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"country\">\n <option value=\"us\">United States</option>\n <option value=\"uk\">United Kingdom</option>\n <option value=\"ca\">Canada</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#country\");\n const selected = await select.selectOption(\"United Kingdom\");\n\n expect(selected).toEqual([\"uk\"]);\n });\n\n test(\"selectOption() selects multiple options in multiple select\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"colors\" multiple>\n <option value=\"red\">Red</option>\n <option value=\"green\">Green</option>\n <option value=\"blue\">Blue</option>\n <option value=\"yellow\">Yellow</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#colors\");\n const selected = await select.selectOption([\"red\", \"blue\"]);\n\n expect(selected.sort()).toEqual([\"blue\", \"red\"]);\n\n const values = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"colors\") as HTMLSelectElement | null;\n return Array.from(s?.selectedOptions ?? []).map((o) => o.value);\n });\n expect(values.sort()).toEqual([\"blue\", \"red\"]);\n });\n\n test(\"selectOption() deselects previous option on single select\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"size\">\n <option value=\"s\">Small</option>\n <option value=\"m\" selected>Medium</option>\n <option value=\"l\">Large</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#size\");\n\n let value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"size\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"m\");\n\n await select.selectOption(\"l\");\n\n value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"size\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"l\");\n });\n\n test(\"selectOption() triggers change event\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"opt\">\n <option value=\"a\">Option A</option>\n <option value=\"b\">Option B</option>\n </select>\n <div id=\"out\"></div>\n <script>\n const select = document.getElementById('opt');\n const out = document.getElementById('out');\n select.addEventListener('change', () => {\n out.textContent = 'changed-' + select.value;\n });\n </script>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#opt\");\n await select.selectOption(\"b\");\n\n const output = await page.mainFrame().evaluate(() => {\n const out = document.getElementById(\"out\");\n return out?.textContent;\n });\n expect(output).toBe(\"changed-b\");\n });\n\n test(\"selectOption() with optgroup structure\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"grouped\">\n <optgroup label=\"Fruits\">\n <option value=\"apple\">Apple</option>\n <option value=\"orange\">Orange</option>\n </optgroup>\n <optgroup label=\"Vegetables\">\n <option value=\"carrot\">Carrot</option>\n <option value=\"celery\">Celery</option>\n </optgroup>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#grouped\");\n await select.selectOption(\"celery\");\n\n const value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"grouped\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"celery\");\n });\n\n test(\"selectOption() returns array of selected values\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"multi\" multiple>\n <option value=\"1\">One</option>\n <option value=\"2\">Two</option>\n <option value=\"3\">Three</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#multi\");\n const selected = await select.selectOption([\"1\", \"3\"]);\n\n expect(selected).toContain(\"1\");\n expect(selected).toContain(\"3\");\n expect(selected.length).toBe(2);\n });\n\n test(\"selectOption() with empty string value\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"opt\">\n <option value=\"\">None</option>\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#opt\");\n const selected = await select.selectOption(\"\");\n\n expect(selected).toEqual([\"\"]);\n\n const value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"opt\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"\");\n });\n\n test(\"selectOption() with numeric values\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"nums\">\n <option value=\"1\">One</option>\n <option value=\"2\">Two</option>\n <option value=\"10\">Ten</option>\n <option value=\"100\">Hundred</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#nums\");\n await select.selectOption(\"10\");\n\n const value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"nums\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"10\");\n });\n\n test(\"selectOption() with disabled option\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <select id=\"mixed\">\n <option value=\"a\">Available</option>\n <option value=\"b\" disabled>Unavailable</option>\n <option value=\"c\">Available</option>\n </select>\n </body></html>`,\n ),\n );\n\n const select = page.mainFrame().locator(\"#mixed\");\n // Should still select disabled option if explicitly requested\n await select.selectOption(\"b\");\n\n const value = await page.mainFrame().evaluate(() => {\n const s = document.getElementById(\"mixed\") as HTMLSelectElement | null;\n return s?.value;\n });\n expect(value).toBe(\"b\");\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAE7B,KAAK,SAAS,iCAAiC,MAAM;AACnD,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,CAAC,MAAM;AAAA,
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -62,7 +62,7 @@ test.describe("page.addInitScript", () => {
|
|
|
62
62
|
test("supports passing arguments to function sources", async () => {
|
|
63
63
|
const page = await ctx.awaitActivePage();
|
|
64
64
|
const payload = { greeting: "hi", nested: { count: 1 } };
|
|
65
|
-
const initPayload = (arg) => {
|
|
65
|
+
const initPayload = ((arg) => {
|
|
66
66
|
function setPayload() {
|
|
67
67
|
const root = document.documentElement;
|
|
68
68
|
if (!root) return;
|
|
@@ -75,7 +75,7 @@ test.describe("page.addInitScript", () => {
|
|
|
75
75
|
} else {
|
|
76
76
|
setPayload();
|
|
77
77
|
}
|
|
78
|
-
};
|
|
78
|
+
});
|
|
79
79
|
await page.addInitScript(initPayload, payload);
|
|
80
80
|
await page.goto(`${EXAMPLE_URL}/?page=payload`, {
|
|
81
81
|
waitUntil: "domcontentloaded"
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../lib/v3/tests/page-addInitScript.spec.ts"],
|
|
4
4
|
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport { V3Context } from \"../understudy/context.js\";\n\nconst EXAMPLE_URL = \"https://example.com\";\n\ntest.describe(\"page.addInitScript\", () => {\n let v3: V3;\n let ctx: V3Context;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n ctx = v3.context;\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"runs scripts on real network navigations\", async () => {\n const page = await ctx.awaitActivePage();\n\n await page.addInitScript(() => {\n (window as unknown as { __fromPageInit?: string }).__fromPageInit =\n \"page-level\";\n });\n\n await page.goto(EXAMPLE_URL, { waitUntil: \"domcontentloaded\" });\n\n const observed = await page.evaluate(() => {\n return (window as unknown as { __fromPageInit?: string }).__fromPageInit;\n });\n\n expect(observed).toBe(\"page-level\");\n });\n\n test(\"scopes scripts to the page only\", async () => {\n const first = await ctx.awaitActivePage();\n\n await first.addInitScript(`\n (function () {\n function markScope() {\n var root = document.documentElement;\n if (!root) return;\n root.dataset.scopeWitness = \"page-one\";\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", markScope, {\n once: true,\n });\n } else {\n markScope();\n }\n })();\n `);\n\n await first.goto(`${EXAMPLE_URL}/?page=one`, {\n waitUntil: \"domcontentloaded\",\n });\n\n const second = await ctx.newPage();\n await second.goto(`${EXAMPLE_URL}/?page=two`, {\n waitUntil: \"domcontentloaded\",\n });\n\n const firstValue = await first.evaluate(() => {\n return document.documentElement.dataset.scopeWitness ?? \"missing\";\n });\n const secondValue = await second.evaluate(() => {\n return document.documentElement.dataset.scopeWitness ?? \"missing\";\n });\n\n expect(firstValue).toBe(\"page-one\");\n expect(secondValue).toBe(\"missing\");\n });\n\n test(\"supports passing arguments to function sources\", async () => {\n const page = await ctx.awaitActivePage();\n const payload = { greeting: \"hi\", nested: { count: 1 } };\n\n const initPayload = ((arg) => {\n function setPayload() {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.pageInitPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }) as (arg: typeof payload) => void;\n await page.addInitScript(initPayload, payload);\n\n await page.goto(`${EXAMPLE_URL}/?page=payload`, {\n waitUntil: \"domcontentloaded\",\n });\n\n const observed = await page.evaluate(() => {\n const raw = document.documentElement.dataset.pageInitPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n\n expect(observed).toEqual(payload);\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAG7B,MAAM,cAAc;AAEpB,KAAK,SAAS,sBAAsB,MAAM;AACxC,MAAI;AACJ,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AACd,UAAM,GAAG;AAAA,EACX,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC,CAAC;AAED,OAAK,4CAA4C,YAAY;AAC3D,UAAM,OAAO,MAAM,IAAI,gBAAgB;AAEvC,UAAM,KAAK,cAAc,MAAM;AAC7B,MAAC,OAAkD,iBACjD;AAAA,IACJ,CAAC;AAED,UAAM,KAAK,KAAK,aAAa,EAAE,WAAW,mBAAmB,CAAC;AAE9D,UAAM,WAAW,MAAM,KAAK,SAAS,MAAM;AACzC,aAAQ,OAAkD;AAAA,IAC5D,CAAC;AAED,WAAO,QAAQ,EAAE,KAAK,YAAY;AAAA,EACpC,CAAC;AAED,OAAK,mCAAmC,YAAY;AAClD,UAAM,QAAQ,MAAM,IAAI,gBAAgB;AAExC,UAAM,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAezB;AAED,UAAM,MAAM,KAAK,GAAG,WAAW,cAAc;AAAA,MAC3C,WAAW;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,UAAM,OAAO,KAAK,GAAG,WAAW,cAAc;AAAA,MAC5C,WAAW;AAAA,IACb,CAAC;AAED,UAAM,aAAa,MAAM,MAAM,SAAS,MAAM;AAC5C,aAAO,SAAS,gBAAgB,QAAQ,gBAAgB;AAAA,IAC1D,CAAC;AACD,UAAM,cAAc,MAAM,OAAO,SAAS,MAAM;AAC9C,aAAO,SAAS,gBAAgB,QAAQ,gBAAgB;AAAA,IAC1D,CAAC;AAED,WAAO,UAAU,EAAE,KAAK,UAAU;AAClC,WAAO,WAAW,EAAE,KAAK,SAAS;AAAA,EACpC,CAAC;AAED,OAAK,kDAAkD,YAAY;AACjE,UAAM,OAAO,MAAM,IAAI,gBAAgB;AACvC,UAAM,UAAU,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,EAAE,EAAE;AAEvD,UAAM,
|
|
5
|
+
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,UAAU;AACnB,SAAS,oBAAoB;AAG7B,MAAM,cAAc;AAEpB,KAAK,SAAS,sBAAsB,MAAM;AACxC,MAAI;AACJ,MAAI;AAEJ,OAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,GAAG,YAAY;AACxB,UAAM,GAAG,KAAK;AACd,UAAM,GAAG;AAAA,EACX,CAAC;AAED,OAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC,CAAC;AAED,OAAK,4CAA4C,YAAY;AAC3D,UAAM,OAAO,MAAM,IAAI,gBAAgB;AAEvC,UAAM,KAAK,cAAc,MAAM;AAC7B,MAAC,OAAkD,iBACjD;AAAA,IACJ,CAAC;AAED,UAAM,KAAK,KAAK,aAAa,EAAE,WAAW,mBAAmB,CAAC;AAE9D,UAAM,WAAW,MAAM,KAAK,SAAS,MAAM;AACzC,aAAQ,OAAkD;AAAA,IAC5D,CAAC;AAED,WAAO,QAAQ,EAAE,KAAK,YAAY;AAAA,EACpC,CAAC;AAED,OAAK,mCAAmC,YAAY;AAClD,UAAM,QAAQ,MAAM,IAAI,gBAAgB;AAExC,UAAM,MAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAezB;AAED,UAAM,MAAM,KAAK,GAAG,WAAW,cAAc;AAAA,MAC3C,WAAW;AAAA,IACb,CAAC;AAED,UAAM,SAAS,MAAM,IAAI,QAAQ;AACjC,UAAM,OAAO,KAAK,GAAG,WAAW,cAAc;AAAA,MAC5C,WAAW;AAAA,IACb,CAAC;AAED,UAAM,aAAa,MAAM,MAAM,SAAS,MAAM;AAC5C,aAAO,SAAS,gBAAgB,QAAQ,gBAAgB;AAAA,IAC1D,CAAC;AACD,UAAM,cAAc,MAAM,OAAO,SAAS,MAAM;AAC9C,aAAO,SAAS,gBAAgB,QAAQ,gBAAgB;AAAA,IAC1D,CAAC;AAED,WAAO,UAAU,EAAE,KAAK,UAAU;AAClC,WAAO,WAAW,EAAE,KAAK,SAAS;AAAA,EACpC,CAAC;AAED,OAAK,kDAAkD,YAAY;AACjE,UAAM,OAAO,MAAM,IAAI,gBAAgB;AACvC,UAAM,UAAU,EAAE,UAAU,MAAM,QAAQ,EAAE,OAAO,EAAE,EAAE;AAEvD,UAAM,eAAe,CAAC,QAAQ;AAC5B,eAAS,aAAa;AACpB,cAAM,OAAO,SAAS;AACtB,YAAI,CAAC,KAAM;AACX,aAAK,QAAQ,kBAAkB,KAAK,UAAU,GAAG;AAAA,MACnD;AACA,UAAI,SAAS,eAAe,WAAW;AACrC,iBAAS,iBAAiB,oBAAoB,YAAY;AAAA,UACxD,MAAM;AAAA,QACR,CAAC;AAAA,MACH,OAAO;AACL,mBAAW;AAAA,MACb;AAAA,IACF;AACA,UAAM,KAAK,cAAc,aAAa,OAAO;AAE7C,UAAM,KAAK,KAAK,GAAG,WAAW,kBAAkB;AAAA,MAC9C,WAAW;AAAA,IACb,CAAC;AAED,UAAM,WAAW,MAAM,KAAK,SAAS,MAAM;AACzC,YAAM,MAAM,SAAS,gBAAgB,QAAQ;AAC7C,aAAO,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,IACjC,CAAC;AAED,WAAO,QAAQ,EAAE,QAAQ,OAAO;AAAA,EAClC,CAAC;AACH,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -260,6 +260,13 @@ export declare const ProxyConfigSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
|
260
260
|
username: z.ZodOptional<z.ZodString>;
|
|
261
261
|
password: z.ZodOptional<z.ZodString>;
|
|
262
262
|
}, z.core.$strip>], "type">;
|
|
263
|
+
/** Browserbase region identifier for multi-region support */
|
|
264
|
+
export declare const BrowserbaseRegionSchema: z.ZodEnum<{
|
|
265
|
+
"us-west-2": "us-west-2";
|
|
266
|
+
"us-east-1": "us-east-1";
|
|
267
|
+
"eu-central-1": "eu-central-1";
|
|
268
|
+
"ap-southeast-1": "ap-southeast-1";
|
|
269
|
+
}>;
|
|
263
270
|
/** Browserbase session creation parameters */
|
|
264
271
|
export declare const BrowserbaseSessionCreateParamsSchema: z.ZodObject<{
|
|
265
272
|
projectId: z.ZodOptional<z.ZodString>;
|
|
@@ -1174,6 +1181,7 @@ export type BrowserbaseBrowserSettings = z.infer<typeof BrowserbaseBrowserSettin
|
|
|
1174
1181
|
export type BrowserbaseProxyGeolocation = z.infer<typeof BrowserbaseProxyGeolocationSchema>;
|
|
1175
1182
|
export type BrowserbaseProxyConfig = z.infer<typeof BrowserbaseProxyConfigSchema>;
|
|
1176
1183
|
export type ExternalProxyConfig = z.infer<typeof ExternalProxyConfigSchema>;
|
|
1184
|
+
export type BrowserbaseRegion = z.infer<typeof BrowserbaseRegionSchema>;
|
|
1177
1185
|
export type BrowserbaseSessionCreateParams = z.infer<typeof BrowserbaseSessionCreateParamsSchema>;
|
|
1178
1186
|
export type SessionStartRequest = z.infer<typeof SessionStartRequestSchema>;
|
|
1179
1187
|
export type SessionStartResult = z.infer<typeof SessionStartResultSchema>;
|
|
@@ -247,6 +247,10 @@ export const ProxyConfigSchema = z
|
|
|
247
247
|
ExternalProxyConfigSchema,
|
|
248
248
|
])
|
|
249
249
|
.meta({ id: "ProxyConfig" });
|
|
250
|
+
/** Browserbase region identifier for multi-region support */
|
|
251
|
+
export const BrowserbaseRegionSchema = z
|
|
252
|
+
.enum(["us-west-2", "us-east-1", "eu-central-1", "ap-southeast-1"])
|
|
253
|
+
.meta({ id: "BrowserbaseRegion" });
|
|
250
254
|
/** Browserbase session creation parameters */
|
|
251
255
|
export const BrowserbaseSessionCreateParamsSchema = z
|
|
252
256
|
.object({
|
|
@@ -255,9 +259,7 @@ export const BrowserbaseSessionCreateParamsSchema = z
|
|
|
255
259
|
extensionId: z.string().optional(),
|
|
256
260
|
keepAlive: z.boolean().optional(),
|
|
257
261
|
proxies: z.union([z.boolean(), z.array(ProxyConfigSchema)]).optional(),
|
|
258
|
-
region:
|
|
259
|
-
.enum(["us-west-2", "us-east-1", "eu-central-1", "ap-southeast-1"])
|
|
260
|
-
.optional(),
|
|
262
|
+
region: BrowserbaseRegionSchema.optional(),
|
|
261
263
|
timeout: z.number().optional(),
|
|
262
264
|
userMetadata: z.record(z.string(), z.unknown()).optional(),
|
|
263
265
|
})
|