@browserbasehq/orca 3.1.0-patch.2 → 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.
Files changed (107) hide show
  1. package/dist/cjs/cli.js +45 -17
  2. package/dist/cjs/cli.js.map +2 -2
  3. package/dist/cjs/index.js +192 -123
  4. package/dist/cjs/index.js.map +3 -3
  5. package/dist/cjs/lib/logger.d.ts +1 -1
  6. package/dist/cjs/lib/modelUtils.d.ts +3 -0
  7. package/dist/cjs/lib/v3/agent/tools/act.d.ts +2 -1
  8. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +2 -1
  9. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +2 -1
  10. package/dist/cjs/lib/v3/agent/tools/index.d.ts +2 -2
  11. package/dist/cjs/lib/v3/api.d.ts +16 -1
  12. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
  13. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
  14. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +12 -12
  15. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
  16. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +2 -2
  17. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
  18. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +1 -0
  19. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
  20. package/dist/cjs/lib/v3/tests/locator-fill.spec.js +1 -0
  21. package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +1 -1
  22. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +1 -0
  23. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
  24. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +1 -0
  25. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +1 -1
  26. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +2 -2
  27. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
  28. package/dist/cjs/lib/v3/types/public/api.d.ts +8 -0
  29. package/dist/cjs/lib/v3/types/public/index.d.ts +1 -0
  30. package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +3 -0
  31. package/dist/cjs/tests/agent-execution-model.test.js +139 -0
  32. package/dist/cjs/tests/agent-execution-model.test.js.map +7 -0
  33. package/dist/cjs/tests/api-multiregion.test.js +73 -0
  34. package/dist/cjs/tests/api-multiregion.test.js.map +7 -0
  35. package/dist/cjs/tests/model-utils.test.js +43 -0
  36. package/dist/cjs/tests/model-utils.test.js.map +7 -0
  37. package/dist/cjs/tests/public-api/export-surface.test.js +1 -0
  38. package/dist/cjs/tests/public-api/export-surface.test.js.map +1 -1
  39. package/dist/cjs/tests/public-api/llm-and-agents.test.js +1 -0
  40. package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +1 -1
  41. package/dist/cjs/tests/public-api/public-error-types.test.js +3 -1
  42. package/dist/cjs/tests/public-api/public-error-types.test.js.map +2 -2
  43. package/dist/cjs/tests/public-api/v3-core.test.js +1 -0
  44. package/dist/cjs/tests/public-api/v3-core.test.js.map +1 -1
  45. package/dist/cjs/tests/snapshot-capture-orchestration.test.js +2 -0
  46. package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +1 -1
  47. package/dist/cjs/tests/understudy-command-exception.test.js +52 -0
  48. package/dist/cjs/tests/understudy-command-exception.test.js.map +7 -0
  49. package/dist/esm/lib/logger.d.ts +1 -1
  50. package/dist/esm/lib/v3/cli.d.ts +2 -0
  51. package/dist/esm/lib/v3/cli.js +10 -0
  52. package/dist/esm/lib/v3/cli.js.map +1 -0
  53. package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
  54. package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
  55. package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
  56. package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
  57. package/dist/esm/lib/v3/index.d.ts +1 -0
  58. package/dist/esm/lib/v3/index.js +1 -0
  59. package/dist/esm/lib/v3/index.js.map +1 -1
  60. package/dist/esm/lib/v3/shutdown/supervisor.d.ts +7 -5
  61. package/dist/esm/lib/v3/shutdown/supervisor.js +93 -64
  62. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  63. package/dist/esm/lib/v3/shutdown/supervisorClient.js +49 -52
  64. package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
  65. package/dist/esm/lib/v3/tests/agent-callbacks.spec.js +12 -12
  66. package/dist/esm/lib/v3/tests/agent-callbacks.spec.js.map +1 -1
  67. package/dist/esm/lib/v3/tests/click-count.spec.js +47 -12
  68. package/dist/esm/lib/v3/tests/click-count.spec.js.map +2 -2
  69. package/dist/esm/lib/v3/tests/context-addInitScript.spec.js +2 -2
  70. package/dist/esm/lib/v3/tests/context-addInitScript.spec.js.map +1 -1
  71. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +67 -21
  72. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +2 -2
  73. package/dist/esm/lib/v3/tests/locator-content-methods.spec.js +1 -0
  74. package/dist/esm/lib/v3/tests/locator-content-methods.spec.js.map +1 -1
  75. package/dist/esm/lib/v3/tests/locator-fill.spec.js +1 -0
  76. package/dist/esm/lib/v3/tests/locator-fill.spec.js.map +1 -1
  77. package/dist/esm/lib/v3/tests/locator-input-methods.spec.js +1 -0
  78. package/dist/esm/lib/v3/tests/locator-input-methods.spec.js.map +1 -1
  79. package/dist/esm/lib/v3/tests/locator-select-option.spec.js +1 -0
  80. package/dist/esm/lib/v3/tests/locator-select-option.spec.js.map +1 -1
  81. package/dist/esm/lib/v3/tests/page-addInitScript.spec.js +2 -2
  82. package/dist/esm/lib/v3/tests/page-addInitScript.spec.js.map +1 -1
  83. package/dist/esm/lib/v3/tests/v3.playwright.config.js +3 -60
  84. package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +2 -2
  85. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -13
  86. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  87. package/dist/esm/lib/v3/understudy/context.js +10 -1
  88. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  89. package/dist/esm/lib/v3/understudy/locator.js +2 -2
  90. package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
  91. package/dist/esm/lib/v3/understudy/page.js +2 -1
  92. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  93. package/dist/esm/lib/v3/v3.js +2 -6
  94. package/dist/esm/lib/v3/v3.js.map +1 -1
  95. package/dist/esm/tests/public-api/export-surface.test.js +2 -0
  96. package/dist/esm/tests/public-api/export-surface.test.js.map +2 -2
  97. package/dist/esm/tests/public-api/llm-and-agents.test.js +1 -0
  98. package/dist/esm/tests/public-api/llm-and-agents.test.js.map +1 -1
  99. package/dist/esm/tests/public-api/public-error-types.test.js +1 -0
  100. package/dist/esm/tests/public-api/public-error-types.test.js.map +1 -1
  101. package/dist/esm/tests/public-api/v3-core.test.js +1 -0
  102. package/dist/esm/tests/public-api/v3-core.test.js.map +1 -1
  103. package/dist/esm/tests/snapshot-capture-orchestration.test.js +2 -0
  104. package/dist/esm/tests/snapshot-capture-orchestration.test.js.map +1 -1
  105. package/package.json +13 -11
  106. package/dist/esm/lib/v3/tests/envReporter.js +0 -57
  107. package/dist/esm/lib/v3/tests/envReporter.js.map +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"supervisorClient.js","sourceRoot":"","sources":["../../../../../lib/v3/shutdown/supervisorClient.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Parent-side helper for spawning the shutdown supervisor process.\n *\n * The supervisor runs out-of-process and watches a lifeline pipe. If the parent\n * dies, the supervisor performs best-effort cleanup (Chrome kill or Browserbase\n * session release) when keepAlive is false.\n */\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { spawn } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n ShutdownSupervisorConfig,\n ShutdownSupervisorHandle,\n ShutdownSupervisorMessage,\n} from \"../types/private/shutdown.js\";\nimport {\n ShutdownSupervisorResolveError,\n ShutdownSupervisorSpawnError,\n} from \"../types/private/shutdownErrors.js\";\n\nconst READY_TIMEOUT_MS = 500;\n// Prefer import.meta.url always correct per-module in ESM.\n// __dirname may be an incorrect polyfill in some tsx / loader configurations.\nconst thisDir = path.dirname(fileURLToPath(import.meta.url));\n\nconst resolveSupervisorScript = (): {\n command: string;\n args: string[];\n} | null => {\n const jsPath = path.resolve(thisDir, \"supervisor.js\");\n if (fs.existsSync(jsPath)) {\n return { command: process.execPath, args: [jsPath] };\n }\n const tsPath = path.resolve(thisDir, \"supervisor.ts\");\n if (fs.existsSync(tsPath)) {\n return { command: process.execPath, args: [\"--import\", \"tsx\", tsPath] };\n }\n return null;\n};\n\n/**\n * Start a supervisor process for crash cleanup. Returns a handle that can\n * stop the supervisor during a normal shutdown.\n */\nexport function startShutdownSupervisor(\n config: ShutdownSupervisorConfig,\n opts?: { onError?: (error: Error, context: string) => void },\n): ShutdownSupervisorHandle | null {\n const resolved = resolveSupervisorScript();\n if (!resolved) {\n opts?.onError?.(\n new ShutdownSupervisorResolveError(\n `Shutdown supervisor script missing (searched ${thisDir} for supervisor.js or supervisor.ts).`,\n ),\n \"resolve\",\n );\n return null;\n }\n\n const child = spawn(resolved.command, resolved.args, {\n stdio: [\"pipe\", \"ignore\", \"ignore\", \"ipc\"],\n detached: true,\n });\n child.on(\"error\", (error) => {\n opts?.onError?.(\n new ShutdownSupervisorSpawnError(\n `Shutdown supervisor failed to start: ${error.message}`,\n ),\n \"spawn\",\n );\n });\n\n try {\n child.unref();\n const stdin = child.stdin as unknown as { unref?: () => void } | null;\n stdin?.unref?.();\n } catch {\n // best-effort: avoid keeping the event loop alive\n }\n\n try {\n const message: ShutdownSupervisorMessage = { type: \"config\", config };\n child.send?.(message);\n } catch {\n // ignore IPC failures\n }\n\n const ready = new Promise<void>((resolve) => {\n let resolved = false;\n const done = () => {\n if (resolved) return;\n resolved = true;\n clearTimeout(timer);\n child.off(\"message\", onMessage);\n resolve();\n };\n const timer = setTimeout(done, READY_TIMEOUT_MS);\n const onMessage = (msg: unknown) => {\n const payload = msg as ShutdownSupervisorMessage;\n if (payload?.type === \"ready\") {\n done();\n }\n };\n child.on(\"message\", onMessage);\n child.on(\"exit\", done);\n });\n\n const stop = () => {\n try {\n const message: ShutdownSupervisorMessage = { type: \"exit\" };\n child.send?.(message);\n } catch {\n // ignore\n }\n try {\n child.disconnect?.();\n } catch {\n // ignore\n }\n };\n\n return { stop, ready };\n}\n"]}
1
+ {"version":3,"file":"supervisorClient.js","sourceRoot":"","sources":["../../../../../lib/v3/shutdown/supervisorClient.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Parent-side helper for spawning the shutdown supervisor process.\n *\n * The supervisor runs out-of-process and watches a lifeline pipe. If the parent\n * dies, the supervisor performs best-effort cleanup (Chrome kill or Browserbase\n * session release) when keepAlive is false.\n */\n\nimport fs from \"node:fs\";\nimport { spawn } from \"node:child_process\";\nimport { createRequire } from \"node:module\";\nimport { fileURLToPath } from \"node:url\";\nimport type {\n ShutdownSupervisorConfig,\n ShutdownSupervisorHandle,\n} from \"../types/private/shutdown.js\";\nimport {\n ShutdownSupervisorResolveError,\n ShutdownSupervisorSpawnError,\n} from \"../types/private/shutdownErrors.js\";\n// Resolve module path for both CJS and ESM builds.\nconst normalizedFilename =\n typeof __filename === \"string\" ? __filename.replaceAll(\"\\\\\", \"/\") : \"\";\nconst hasAbsoluteFilename =\n normalizedFilename.startsWith(\"/\") || /^[A-Za-z]:\\//.test(normalizedFilename);\nconst modulePath = hasAbsoluteFilename\n ? __filename\n : fileURLToPath(import.meta.url);\nconst normalizedModulePath = modulePath.replaceAll(\"\\\\\", \"/\");\nconst moduleDir = normalizedModulePath.slice(\n 0,\n normalizedModulePath.lastIndexOf(\"/\"),\n);\nconst require = createRequire(modulePath);\n\nconst isSeaRuntime = (): boolean => {\n try {\n const sea = require(\"node:sea\") as { isSea?: () => boolean };\n return Boolean(sea.isSea?.());\n } catch {\n return false;\n }\n};\n\n// SEA: re-exec current binary with supervisor args.\n// Non-SEA: execute Stagehand CLI entrypoint with supervisor args.\nconst resolveSupervisorCommand = (\n config: ShutdownSupervisorConfig,\n): {\n command: string;\n args: string[];\n} | null => {\n const baseArgs = [\"--supervisor\", serializeConfigArg(config)];\n\n if (isSeaRuntime()) {\n return { command: process.execPath, args: baseArgs };\n }\n\n const cliPathCandidates = [`${moduleDir}/../cli.js`, `${moduleDir}/cli.js`];\n const cliPath =\n cliPathCandidates.find((candidate) => fs.existsSync(candidate)) ?? null;\n if (!cliPath) return null;\n const needsTsxLoader =\n fs.existsSync(`${moduleDir}/supervisor.ts`) &&\n !fs.existsSync(`${moduleDir}/supervisor.js`);\n return {\n command: process.execPath,\n args: needsTsxLoader\n ? [\"--import\", \"tsx\", cliPath, ...baseArgs]\n : [cliPath, ...baseArgs],\n };\n};\n\n// Single JSON arg keeps supervisor bootstrap parsing tiny and versionable.\nconst serializeConfigArg = (config: ShutdownSupervisorConfig): string =>\n `--supervisor-config=${JSON.stringify({\n ...config,\n parentPid: process.pid,\n })}`;\n\n/**\n * Start a supervisor process for crash cleanup. Returns a handle that can\n * stop the supervisor during a normal shutdown.\n */\nexport function startShutdownSupervisor(\n config: ShutdownSupervisorConfig,\n opts?: { onError?: (error: Error, context: string) => void },\n): ShutdownSupervisorHandle | null {\n const resolved = resolveSupervisorCommand(config);\n if (!resolved) {\n opts?.onError?.(\n new ShutdownSupervisorResolveError(\n \"Shutdown supervisor entry missing (expected Stagehand CLI entrypoint).\",\n ),\n \"resolve\",\n );\n return null;\n }\n\n const child = spawn(resolved.command, resolved.args, {\n // stdin is the parent lifeline.\n // Preserve supervisor stderr so crash-cleanup debug lines are visible.\n stdio: [\"pipe\", \"ignore\", \"inherit\"],\n detached: true,\n });\n child.on(\"error\", (error) => {\n opts?.onError?.(\n new ShutdownSupervisorSpawnError(\n `Shutdown supervisor failed to start: ${error.message}`,\n ),\n \"spawn\",\n );\n });\n\n try {\n child.unref();\n const stdin = child.stdin as unknown as { unref?: () => void } | null;\n stdin?.unref?.();\n } catch {\n // best-effort: avoid keeping the event loop alive\n }\n\n const stop = () => {\n // Normal close path: terminate supervisor directly.\n try {\n child.kill(\"SIGTERM\");\n } catch {\n // ignore\n }\n };\n\n return { stop };\n}\n"]}
@@ -201,8 +201,8 @@ test.describe("Stagehand agent callbacks behavior", () => {
201
201
  await agent.execute({
202
202
  instruction: "test",
203
203
  callbacks: {
204
- onChunk: () => {
205
- }
204
+ onChunk: (() => {
205
+ })
206
206
  }
207
207
  });
208
208
  throw new Error("Expected error to be thrown");
@@ -223,8 +223,8 @@ test.describe("Stagehand agent callbacks behavior", () => {
223
223
  await agent.execute({
224
224
  instruction: "test",
225
225
  callbacks: {
226
- onFinish: () => {
227
- }
226
+ onFinish: (() => {
227
+ })
228
228
  }
229
229
  });
230
230
  throw new Error("Expected error to be thrown");
@@ -245,8 +245,8 @@ test.describe("Stagehand agent callbacks behavior", () => {
245
245
  await agent.execute({
246
246
  instruction: "test",
247
247
  callbacks: {
248
- onError: () => {
249
- }
248
+ onError: (() => {
249
+ })
250
250
  }
251
251
  });
252
252
  throw new Error("Expected error to be thrown");
@@ -267,8 +267,8 @@ test.describe("Stagehand agent callbacks behavior", () => {
267
267
  await agent.execute({
268
268
  instruction: "test",
269
269
  callbacks: {
270
- onAbort: () => {
271
- }
270
+ onAbort: (() => {
271
+ })
272
272
  }
273
273
  });
274
274
  throw new Error("Expected error to be thrown");
@@ -289,10 +289,10 @@ test.describe("Stagehand agent callbacks behavior", () => {
289
289
  await agent.execute({
290
290
  instruction: "test",
291
291
  callbacks: {
292
- onChunk: () => {
293
- },
294
- onFinish: () => {
295
- }
292
+ onChunk: (() => {
293
+ }),
294
+ onFinish: (() => {
295
+ })
296
296
  }
297
297
  });
298
298
  throw new Error("Expected error to be thrown");
@@ -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
  }
@@ -1,6 +1,37 @@
1
1
  import { test, expect } from "@playwright/test";
2
2
  import { V3 } from "../v3.js";
3
3
  import { v3TestConfig } from "./v3.config.js";
4
+ const doubleClickFixtureUrl = `data:text/html,${encodeURIComponent(`<!DOCTYPE html>
5
+ <html>
6
+ <body>
7
+ <div id="target" style="width: 240px; height: 120px; border: 1px solid #000;">target</div>
8
+ <input id="clickCount" value="0" readonly />
9
+ <input id="dblClickCount" value="0" readonly />
10
+ <input id="lastClickDetail" value="0" readonly />
11
+ <input id="lastDblClickDetail" value="0" readonly />
12
+ <script>
13
+ const target = document.getElementById("target");
14
+ const clickCount = document.getElementById("clickCount");
15
+ const dblClickCount = document.getElementById("dblClickCount");
16
+ const lastClickDetail = document.getElementById("lastClickDetail");
17
+ const lastDblClickDetail = document.getElementById("lastDblClickDetail");
18
+ let clicks = 0;
19
+ let dblClicks = 0;
20
+
21
+ target.addEventListener("click", (event) => {
22
+ clicks += 1;
23
+ clickCount.value = String(clicks);
24
+ lastClickDetail.value = String(event.detail);
25
+ });
26
+
27
+ target.addEventListener("dblclick", (event) => {
28
+ dblClicks += 1;
29
+ dblClickCount.value = String(dblClicks);
30
+ lastDblClickDetail.value = String(event.detail);
31
+ });
32
+ </script>
33
+ </body>
34
+ </html>`)}`;
4
35
  test.describe("Locator and Page click methods", () => {
5
36
  let v3;
6
37
  test.beforeEach(async () => {
@@ -27,22 +58,24 @@ test.describe("Locator and Page click methods", () => {
27
58
  });
28
59
  test("locator.click() with clickCount: 2 performs double-click", async () => {
29
60
  const page = v3.context.pages()[0];
30
- await page.goto(
31
- "https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
32
- );
61
+ await page.goto(doubleClickFixtureUrl);
33
62
  await page.waitForLoadState("domcontentloaded");
34
- const countDisplay = page.locator("#count");
35
- const dcCountDisplay = page.locator("#dcCount");
63
+ const countDisplay = page.locator("#clickCount");
64
+ const dcCountDisplay = page.locator("#dblClickCount");
65
+ const clickDetailDisplay = page.locator("#lastClickDetail");
66
+ const dblClickDetailDisplay = page.locator("#lastDblClickDetail");
36
67
  const initialCount = await countDisplay.inputValue();
37
68
  const initialDcCount = await dcCountDisplay.inputValue();
38
69
  expect(initialCount).toBe("0");
39
70
  expect(initialDcCount).toBe("0");
40
- const clickArea = page.locator("#textarea");
71
+ const clickArea = page.locator("#target");
41
72
  await clickArea.click({ clickCount: 2 });
42
73
  const newCount = await countDisplay.inputValue();
43
74
  expect(newCount).toBe("2");
44
75
  const newDcCount = await dcCountDisplay.inputValue();
45
76
  expect(newDcCount).toBe("1");
77
+ expect(await clickDetailDisplay.inputValue()).toBe("2");
78
+ expect(await dblClickDetailDisplay.inputValue()).toBe("2");
46
79
  });
47
80
  test("locator.click() with clickCount: 3 performs triple-click", async () => {
48
81
  const page = v3.context.pages()[0];
@@ -75,23 +108,25 @@ test.describe("Locator and Page click methods", () => {
75
108
  });
76
109
  test("page.click() with clickCount: 2 performs double-click", async () => {
77
110
  const page = v3.context.pages()[0];
78
- await page.goto(
79
- "https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
80
- );
111
+ await page.goto(doubleClickFixtureUrl);
81
112
  await page.waitForLoadState("domcontentloaded");
82
- const countDisplay = page.locator("#count");
83
- const dcCountDisplay = page.locator("#dcCount");
113
+ const countDisplay = page.locator("#clickCount");
114
+ const dcCountDisplay = page.locator("#dblClickCount");
115
+ const clickDetailDisplay = page.locator("#lastClickDetail");
116
+ const dblClickDetailDisplay = page.locator("#lastDblClickDetail");
84
117
  const initialCount = await countDisplay.inputValue();
85
118
  const initialDcCount = await dcCountDisplay.inputValue();
86
119
  expect(initialCount).toBe("0");
87
120
  expect(initialDcCount).toBe("0");
88
- const clickArea = page.locator("#textarea");
121
+ const clickArea = page.locator("#target");
89
122
  const { x, y } = await clickArea.centroid();
90
123
  await page.click(x, y, { clickCount: 2 });
91
124
  const newCount = await countDisplay.inputValue();
92
125
  expect(newCount).toBe("2");
93
126
  const newDcCount = await dcCountDisplay.inputValue();
94
127
  expect(newDcCount).toBe("1");
128
+ expect(await clickDetailDisplay.inputValue()).toBe("2");
129
+ expect(await dblClickDetailDisplay.inputValue()).toBe("2");
95
130
  });
96
131
  test("page.click() with clickCount: 3 performs triple-click", async () => {
97
132
  const page = v3.context.pages()[0];
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../lib/v3/tests/click-count.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator and Page click methods\", () => {\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(() => {});\n });\n\n test(\"locator.click() performs single click by default\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform single click on the textarea (the clickable area)\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click();\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"locator.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial counts\n const countDisplay = page.locator(\"#count\");\n const dcCountDisplay = page.locator(\"#dcCount\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n // Perform double-click on the textarea\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click({ clickCount: 2 });\n\n // Verify both counters incremented\n // Regular count should be 2 (one for each click in the double-click)\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n // Double-click count should be 1 (one double-click event detected)\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n });\n\n test(\"locator.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform triple-click on the textarea\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click({ clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n\n test(\"page.click() performs single click with coordinates\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform single click using page.click() with coordinates\n await page.click(x, y);\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"page.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial counts\n const countDisplay = page.locator(\"#count\");\n const dcCountDisplay = page.locator(\"#dcCount\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform double-click using page.click() with coordinates\n await page.click(x, y, { clickCount: 2 });\n\n // Verify both counters incremented\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n // Double-click count should be 1\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n });\n\n test(\"page.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform triple-click using page.click() with coordinates\n await page.click(x, y, { clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\n// Keep double-click verification event-based and deterministic.\n// Time-delta counters (Date.now() between mousedowns) are flaky at ms boundaries\n// and can miss valid double-clicks when synthetic input lands in the same millisecond.\nconst doubleClickFixtureUrl = `data:text/html,${encodeURIComponent(`<!DOCTYPE html>\n<html>\n <body>\n <div id=\"target\" style=\"width: 240px; height: 120px; border: 1px solid #000;\">target</div>\n <input id=\"clickCount\" value=\"0\" readonly />\n <input id=\"dblClickCount\" value=\"0\" readonly />\n <input id=\"lastClickDetail\" value=\"0\" readonly />\n <input id=\"lastDblClickDetail\" value=\"0\" readonly />\n <script>\n const target = document.getElementById(\"target\");\n const clickCount = document.getElementById(\"clickCount\");\n const dblClickCount = document.getElementById(\"dblClickCount\");\n const lastClickDetail = document.getElementById(\"lastClickDetail\");\n const lastDblClickDetail = document.getElementById(\"lastDblClickDetail\");\n let clicks = 0;\n let dblClicks = 0;\n\n target.addEventListener(\"click\", (event) => {\n clicks += 1;\n clickCount.value = String(clicks);\n lastClickDetail.value = String(event.detail);\n });\n\n target.addEventListener(\"dblclick\", (event) => {\n dblClicks += 1;\n dblClickCount.value = String(dblClicks);\n lastDblClickDetail.value = String(event.detail);\n });\n </script>\n </body>\n</html>`)}`;\n\ntest.describe(\"Locator and Page click methods\", () => {\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(() => {});\n });\n\n test(\"locator.click() performs single click by default\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform single click on the textarea (the clickable area)\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click();\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"locator.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(doubleClickFixtureUrl);\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#clickCount\");\n const dcCountDisplay = page.locator(\"#dblClickCount\");\n const clickDetailDisplay = page.locator(\"#lastClickDetail\");\n const dblClickDetailDisplay = page.locator(\"#lastDblClickDetail\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n const clickArea = page.locator(\"#target\");\n await clickArea.click({ clickCount: 2 });\n\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n // `dblclick` is the browser-level contract for double-click behavior.\n // Verifying `detail=2` ensures the click sequence is recognized as a true multi-click.\n expect(await clickDetailDisplay.inputValue()).toBe(\"2\");\n expect(await dblClickDetailDisplay.inputValue()).toBe(\"2\");\n });\n\n test(\"locator.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform triple-click on the textarea\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click({ clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n\n test(\"page.click() performs single click with coordinates\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform single click using page.click() with coordinates\n await page.click(x, y);\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"page.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(doubleClickFixtureUrl);\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#clickCount\");\n const dcCountDisplay = page.locator(\"#dblClickCount\");\n const clickDetailDisplay = page.locator(\"#lastClickDetail\");\n const dblClickDetailDisplay = page.locator(\"#lastDblClickDetail\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n const clickArea = page.locator(\"#target\");\n const { x, y } = await clickArea.centroid();\n\n await page.click(x, y, { clickCount: 2 });\n\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n // `dblclick` is the browser-level contract for double-click behavior.\n // Verifying `detail=2` ensures the click sequence is recognized as a true multi-click.\n expect(await clickDetailDisplay.inputValue()).toBe(\"2\");\n expect(await dblClickDetailDisplay.inputValue()).toBe(\"2\");\n });\n\n test(\"page.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform triple-click using page.click() with coordinates\n await page.click(x, y, { clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n});\n"],
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": "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",
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -132,10 +132,11 @@ async function closeAllPages(ctx) {
132
132
  const pages = ctx.pages();
133
133
  await Promise.allSettled(pages.map((page) => page.close()));
134
134
  }
135
- async function waitForChildFrame(page, timeoutMs = CHILD_FRAME_TIMEOUT_MS) {
135
+ async function waitForChildFrame(page, expectedChildUrl, timeoutMs = CHILD_FRAME_TIMEOUT_MS) {
136
136
  const mainFrameId = page.mainFrame().frameId;
137
137
  const deadline = Date.now() + timeoutMs;
138
138
  let observedFrameCount = 0;
139
+ const observedChildFrameIds = /* @__PURE__ */ new Set();
139
140
  let lastUrl = "";
140
141
  let lastLogAt = Date.now();
141
142
  while (Date.now() < deadline) {
@@ -148,29 +149,71 @@ async function waitForChildFrame(page, timeoutMs = CHILD_FRAME_TIMEOUT_MS) {
148
149
  url: lastUrl,
149
150
  mainFrameId,
150
151
  observedFrameCount,
151
- childIds
152
+ childIds,
153
+ expectedChildUrl
152
154
  });
153
155
  lastLogAt = Date.now();
154
156
  }
155
- const child = frames.find((f) => f.frameId !== mainFrameId);
156
- if (child) {
157
- try {
158
- const ready = await child.evaluate(() => document.readyState);
159
- if (ready === "complete") {
160
- debugLog("waitForChildFrame:ready", {
161
- childFrameId: child.frameId,
162
- url: lastUrl
163
- });
164
- return child;
165
- }
166
- } catch {
157
+ for (const childId of childIds) observedChildFrameIds.add(childId);
158
+ const childFrames = frames.filter((f) => f.frameId !== mainFrameId).reverse();
159
+ if (childFrames.length) {
160
+ const probes = await Promise.all(
161
+ childFrames.map(async (child) => {
162
+ try {
163
+ const state = await child.evaluate(() => ({
164
+ href: location.href,
165
+ readyState: document.readyState
166
+ }));
167
+ return {
168
+ child,
169
+ href: state.href,
170
+ readyState: state.readyState,
171
+ error: void 0
172
+ };
173
+ } catch (error) {
174
+ return {
175
+ child,
176
+ href: void 0,
177
+ readyState: void 0,
178
+ error: formatError(error)
179
+ };
180
+ }
181
+ })
182
+ );
183
+ const ready = probes.find(
184
+ (probe) => probe.readyState === "complete" && probe.href === expectedChildUrl
185
+ );
186
+ if (ready) {
187
+ debugLog("waitForChildFrame:ready", {
188
+ childFrameId: ready.child.frameId,
189
+ childSessionId: ready.child.sessionId ?? "root",
190
+ childUrl: ready.href ?? "<unknown>",
191
+ expectedChildUrl,
192
+ url: lastUrl
193
+ });
194
+ return ready.child;
195
+ }
196
+ if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {
197
+ debugLog("waitForChildFrame:not-ready", {
198
+ url: lastUrl,
199
+ mainFrameId,
200
+ expectedChildUrl,
201
+ probes: probes.map((probe) => ({
202
+ frameId: probe.child.frameId,
203
+ sessionId: probe.child.sessionId ?? "root",
204
+ readyState: probe.readyState ?? "<unknown>",
205
+ href: probe.href ?? "<unknown>",
206
+ error: probe.error ?? "<none>"
207
+ }))
208
+ });
209
+ lastLogAt = Date.now();
167
210
  }
168
211
  }
169
212
  await new Promise((r) => setTimeout(r, 100));
170
213
  }
171
214
  await logPageDiagnostics(page, "waitForChildFrame timeout");
172
215
  throw new Error(
173
- `Timed out waiting for child frame to load (timeout=${timeoutMs}ms, mainFrameId=${mainFrameId}, maxObservedFrames=${observedFrameCount}, url=${lastUrl || "<unknown>"})`
216
+ `Timed out waiting for child frame to load (timeout=${timeoutMs}ms, mainFrameId=${mainFrameId}, expectedChildUrl=${expectedChildUrl}, maxObservedFrames=${observedFrameCount}, observedChildFrameIds=[${[...observedChildFrameIds].join(",")}], url=${lastUrl || "<unknown>"})`
174
217
  );
175
218
  }
176
219
  async function waitForPageUrl(page, expectedUrlSubstring, timeoutMs = POPUP_URL_TIMEOUT_MS) {
@@ -278,6 +321,9 @@ async function waitForPopupPage(ctx, opener, timeoutMs = POPUP_TIMEOUT_MS) {
278
321
  );
279
322
  }
280
323
  test.describe("context.addInitScript with iframes", () => {
324
+ const OOPIF_CHILD_URL = "https://seanmcguire12.github.io/stagehand-oopif-sites/sites/form-filling/";
325
+ const SPIF_CHILD_URL = "https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/iframe.html";
326
+ const POPUP_SPIF_CHILD_URL = "https://browserbase.github.io/stagehand-eval-sites/sites/closed-shadow-dom-in-spif/embedded.html";
281
327
  if (isBrowserbase) {
282
328
  test.describe.configure({ mode: "serial" });
283
329
  }
@@ -318,7 +364,7 @@ test.describe("context.addInitScript with iframes", () => {
318
364
  "https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/",
319
365
  { waitUntil: "networkidle" }
320
366
  );
321
- const iframe = await waitForChildFrame(page);
367
+ const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);
322
368
  const mainBgColor = await page.mainFrame().evaluate(() => {
323
369
  return getComputedStyle(document.documentElement).backgroundColor;
324
370
  });
@@ -334,7 +380,7 @@ test.describe("context.addInitScript with iframes", () => {
334
380
  "https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/",
335
381
  { waitUntil: "networkidle" }
336
382
  );
337
- const iframe = await waitForChildFrame(page);
383
+ const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);
338
384
  const mainBgColor = await page.mainFrame().evaluate(() => {
339
385
  return getComputedStyle(document.documentElement).backgroundColor;
340
386
  });
@@ -352,7 +398,7 @@ test.describe("context.addInitScript with iframes", () => {
352
398
  "https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/",
353
399
  { waitUntil: "networkidle" }
354
400
  );
355
- const iframe = await waitForChildFrame(page);
401
+ const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);
356
402
  const mainBgColor = await page.mainFrame().evaluate(() => {
357
403
  return getComputedStyle(document.documentElement).backgroundColor;
358
404
  });
@@ -368,7 +414,7 @@ test.describe("context.addInitScript with iframes", () => {
368
414
  "https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/",
369
415
  { waitUntil: "networkidle" }
370
416
  );
371
- const iframe = await waitForChildFrame(page);
417
+ const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);
372
418
  const mainBgColor = await page.mainFrame().evaluate(() => {
373
419
  return getComputedStyle(document.documentElement).backgroundColor;
374
420
  });
@@ -406,7 +452,7 @@ test.describe("context.addInitScript with iframes", () => {
406
452
  "shadow-host"
407
453
  );
408
454
  await preparePopupForFrameAttach(popup, "shadow-host");
409
- const iframe = await waitForChildFrame(popup);
455
+ const iframe = await waitForChildFrame(popup, OOPIF_CHILD_URL);
410
456
  const mainBgColor = await popup.mainFrame().evaluate(() => {
411
457
  return getComputedStyle(document.documentElement).backgroundColor;
412
458
  });
@@ -432,7 +478,7 @@ test.describe("context.addInitScript with iframes", () => {
432
478
  "/stagehand-eval-sites/sites/closed-shadow-dom-in-spif/"
433
479
  );
434
480
  await preparePopupForFrameAttach(popup, "iframe");
435
- const iframe = await waitForChildFrame(popup);
481
+ const iframe = await waitForChildFrame(popup, POPUP_SPIF_CHILD_URL);
436
482
  const mainBgColor = await popup.mainFrame().evaluate(() => {
437
483
  return getComputedStyle(document.documentElement).backgroundColor;
438
484
  });