@browserbasehq/orca 3.1.0-patch.0 → 3.1.0-patch.1

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 (387) hide show
  1. package/dist/cjs/cli.js +183 -0
  2. package/dist/cjs/cli.js.map +7 -0
  3. package/dist/cjs/index.d.ts +1 -0
  4. package/dist/cjs/index.js +24956 -0
  5. package/dist/cjs/index.js.map +7 -0
  6. package/dist/cjs/lib/inference.d.ts +65 -0
  7. package/dist/cjs/lib/inferenceLogUtils.d.ts +12 -0
  8. package/dist/cjs/lib/logger.d.ts +69 -0
  9. package/dist/cjs/lib/modelUtils.d.ts +11 -0
  10. package/dist/cjs/lib/prompt.d.ts +14 -0
  11. package/dist/cjs/lib/utils.d.ts +68 -0
  12. package/dist/cjs/lib/v3/agent/AgentClient.d.ts +19 -0
  13. package/dist/cjs/lib/v3/agent/AgentProvider.d.ts +20 -0
  14. package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +57 -0
  15. package/dist/cjs/lib/v3/agent/GoogleCUAClient.d.ts +74 -0
  16. package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.d.ts +71 -0
  17. package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +69 -0
  18. package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +12 -0
  19. package/dist/cjs/lib/v3/agent/tools/act.d.ts +12 -0
  20. package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +5 -0
  21. package/dist/cjs/lib/v3/agent/tools/click.d.ts +6 -0
  22. package/dist/cjs/lib/v3/agent/tools/clickAndHold.d.ts +14 -0
  23. package/dist/cjs/lib/v3/agent/tools/dragAndDrop.d.ts +7 -0
  24. package/dist/cjs/lib/v3/agent/tools/extract.d.ts +20 -0
  25. package/dist/cjs/lib/v3/agent/tools/fillFormVision.d.ts +12 -0
  26. package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +12 -0
  27. package/dist/cjs/lib/v3/agent/tools/goto.d.ts +12 -0
  28. package/dist/cjs/lib/v3/agent/tools/index.d.ts +92 -0
  29. package/dist/cjs/lib/v3/agent/tools/keys.d.ts +24 -0
  30. package/dist/cjs/lib/v3/agent/tools/navback.d.ts +6 -0
  31. package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +6 -0
  32. package/dist/cjs/lib/v3/agent/tools/scroll.d.ts +19 -0
  33. package/dist/cjs/lib/v3/agent/tools/search.d.ts +15 -0
  34. package/dist/cjs/lib/v3/agent/tools/think.d.ts +6 -0
  35. package/dist/cjs/lib/v3/agent/tools/type.d.ts +7 -0
  36. package/dist/cjs/lib/v3/agent/tools/wait.d.ts +5 -0
  37. package/dist/cjs/lib/v3/agent/utils/actionMapping.d.ts +3 -0
  38. package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.d.ts +13 -0
  39. package/dist/cjs/lib/v3/agent/utils/cuaKeyMapping.d.ts +10 -0
  40. package/dist/cjs/lib/v3/agent/utils/googleCustomToolHandler.d.ts +25 -0
  41. package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.d.ts +22 -0
  42. package/dist/cjs/lib/v3/agent/utils/imageCompression.d.ts +53 -0
  43. package/dist/cjs/lib/v3/agent/utils/messageProcessing.d.ts +12 -0
  44. package/dist/cjs/lib/v3/agent/utils/screenshotHandler.d.ts +10 -0
  45. package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.d.ts +26 -0
  46. package/dist/cjs/lib/v3/agent/utils/xpath.d.ts +11 -0
  47. package/dist/cjs/lib/v3/api.d.ts +86 -0
  48. package/dist/cjs/lib/v3/cache/ActCache.d.ts +23 -0
  49. package/dist/cjs/lib/v3/cache/AgentCache.d.ts +109 -0
  50. package/dist/cjs/lib/v3/cache/CacheStorage.d.ts +17 -0
  51. package/dist/cjs/lib/v3/cache/serverAgentCache.d.ts +7 -0
  52. package/dist/cjs/lib/v3/cache/utils.d.ts +15 -0
  53. package/dist/cjs/lib/v3/cli.d.ts +2 -0
  54. package/dist/cjs/lib/v3/dom/a11yScripts/index.d.ts +11 -0
  55. package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.d.ts +16 -0
  56. package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +52 -0
  57. package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -0
  58. package/dist/cjs/lib/v3/dom/build/rerender-index.d.ts +0 -0
  59. package/dist/cjs/lib/v3/dom/build/rerender-index.js +1 -0
  60. package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.d.ts +4 -0
  61. package/dist/cjs/lib/v3/dom/build/scriptV3Content.d.ts +1 -0
  62. package/dist/cjs/lib/v3/dom/build/v3-index.d.ts +0 -0
  63. package/dist/cjs/lib/v3/dom/build/v3-index.js +1 -0
  64. package/dist/cjs/lib/v3/dom/genA11yScripts.d.ts +1 -0
  65. package/dist/cjs/lib/v3/dom/genDomScripts.d.ts +1 -0
  66. package/dist/cjs/lib/v3/dom/genLocatorScripts.d.ts +1 -0
  67. package/dist/cjs/lib/v3/dom/genScreenshotScripts.d.ts +1 -0
  68. package/dist/cjs/lib/v3/dom/index.d.ts +1 -0
  69. package/dist/cjs/lib/v3/dom/locatorScripts/counts.d.ts +15 -0
  70. package/dist/cjs/lib/v3/dom/locatorScripts/index.d.ts +4 -0
  71. package/dist/cjs/lib/v3/dom/locatorScripts/scripts.d.ts +37 -0
  72. package/dist/cjs/lib/v3/dom/locatorScripts/selectors.d.ts +4 -0
  73. package/dist/cjs/lib/v3/dom/locatorScripts/waitForSelector.d.ts +19 -0
  74. package/dist/cjs/lib/v3/dom/locatorScripts/xpathParser.d.ts +76 -0
  75. package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.d.ts +9 -0
  76. package/dist/cjs/lib/v3/dom/piercer.entry.d.ts +1 -0
  77. package/dist/cjs/lib/v3/dom/piercer.runtime.d.ts +23 -0
  78. package/dist/cjs/lib/v3/dom/rerenderMissingShadows.entry.d.ts +1 -0
  79. package/dist/cjs/lib/v3/dom/rerenderMissingShadows.runtime.d.ts +1 -0
  80. package/dist/cjs/lib/v3/dom/screenshotScripts/index.d.ts +1 -0
  81. package/dist/cjs/lib/v3/dom/screenshotScripts/resolveMaskRect.d.ts +8 -0
  82. package/dist/cjs/lib/v3/external_clients/aisdk.d.ts +11 -0
  83. package/dist/cjs/lib/v3/external_clients/customOpenAI.d.ts +18 -0
  84. package/dist/cjs/lib/v3/flowLogger.d.ts +139 -0
  85. package/dist/cjs/lib/v3/handlers/actHandler.d.ts +21 -0
  86. package/dist/cjs/lib/v3/handlers/extractHandler.d.ts +31 -0
  87. package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +24 -0
  88. package/dist/cjs/lib/v3/handlers/handlerUtils/timeoutGuard.d.ts +2 -0
  89. package/dist/cjs/lib/v3/handlers/observeHandler.d.ts +17 -0
  90. package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +32 -0
  91. package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +33 -0
  92. package/dist/cjs/lib/v3/index.d.ts +18 -0
  93. package/dist/cjs/lib/v3/launch/browserbase.d.ts +7 -0
  94. package/dist/cjs/lib/v3/launch/local.d.ts +15 -0
  95. package/dist/cjs/lib/v3/llm/AnthropicClient.d.ts +16 -0
  96. package/dist/cjs/lib/v3/llm/CerebrasClient.d.ts +17 -0
  97. package/dist/cjs/lib/v3/llm/GoogleClient.d.ts +19 -0
  98. package/dist/cjs/lib/v3/llm/GroqClient.d.ts +17 -0
  99. package/dist/cjs/lib/v3/llm/LLMClient.d.ts +121 -0
  100. package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +13 -0
  101. package/dist/cjs/lib/v3/llm/OpenAIClient.d.ts +15 -0
  102. package/dist/cjs/lib/v3/llm/aisdk.d.ts +15 -0
  103. package/dist/cjs/lib/v3/logger.d.ts +9 -0
  104. package/dist/cjs/lib/v3/mcp/connection.d.ts +11 -0
  105. package/dist/cjs/lib/v3/mcp/utils.d.ts +3 -0
  106. package/dist/cjs/lib/v3/shutdown/cleanupLocal.d.ts +14 -0
  107. package/dist/cjs/lib/v3/shutdown/supervisor.d.ts +11 -0
  108. package/dist/cjs/lib/v3/shutdown/supervisorClient.d.ts +15 -0
  109. package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js +113 -0
  110. package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js.map +7 -0
  111. package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js +102 -0
  112. package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js.map +7 -0
  113. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +374 -0
  114. package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +7 -0
  115. package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js +354 -0
  116. package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js.map +7 -0
  117. package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js +247 -0
  118. package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js.map +7 -0
  119. package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js +105 -0
  120. package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js.map +7 -0
  121. package/dist/cjs/lib/v3/tests/agent-streaming.spec.js +126 -0
  122. package/dist/cjs/lib/v3/tests/agent-streaming.spec.js.map +7 -0
  123. package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js +44 -0
  124. package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js.map +7 -0
  125. package/dist/cjs/lib/v3/tests/click-count.spec.js +147 -0
  126. package/dist/cjs/lib/v3/tests/click-count.spec.js.map +7 -0
  127. package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js +54 -0
  128. package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js.map +7 -0
  129. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +176 -0
  130. package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +7 -0
  131. package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js +53 -0
  132. package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js.map +7 -0
  133. package/dist/cjs/lib/v3/tests/downloads.spec.js +80 -0
  134. package/dist/cjs/lib/v3/tests/downloads.spec.js.map +7 -0
  135. package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js +53 -0
  136. package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js.map +7 -0
  137. package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js +493 -0
  138. package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +7 -0
  139. package/dist/cjs/lib/v3/tests/keep-alive.child.js +92 -0
  140. package/dist/cjs/lib/v3/tests/keep-alive.child.js.map +7 -0
  141. package/dist/cjs/lib/v3/tests/keep-alive.helpers.js +568 -0
  142. package/dist/cjs/lib/v3/tests/keep-alive.helpers.js.map +7 -0
  143. package/dist/cjs/lib/v3/tests/keep-alive.spec.js +15 -0
  144. package/dist/cjs/lib/v3/tests/keep-alive.spec.js.map +7 -0
  145. package/dist/cjs/lib/v3/tests/keyboard.spec.js +296 -0
  146. package/dist/cjs/lib/v3/tests/keyboard.spec.js.map +7 -0
  147. package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js +159 -0
  148. package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js.map +7 -0
  149. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +191 -0
  150. package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +7 -0
  151. package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js +108 -0
  152. package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js.map +7 -0
  153. package/dist/cjs/lib/v3/tests/locator-count.spec.js +71 -0
  154. package/dist/cjs/lib/v3/tests/locator-count.spec.js.map +7 -0
  155. package/dist/cjs/lib/v3/tests/locator-fill.spec.js +118 -0
  156. package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +7 -0
  157. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +136 -0
  158. package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +7 -0
  159. package/dist/cjs/lib/v3/tests/locator-nth.spec.js +157 -0
  160. package/dist/cjs/lib/v3/tests/locator-nth.spec.js.map +7 -0
  161. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +242 -0
  162. package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +7 -0
  163. package/dist/cjs/lib/v3/tests/logger-initialization.spec.js +547 -0
  164. package/dist/cjs/lib/v3/tests/logger-initialization.spec.js.map +7 -0
  165. package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js +269 -0
  166. package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js.map +7 -0
  167. package/dist/cjs/lib/v3/tests/nested-div.spec.js +23 -0
  168. package/dist/cjs/lib/v3/tests/nested-div.spec.js.map +7 -0
  169. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +90 -0
  170. package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +7 -0
  171. package/dist/cjs/lib/v3/tests/page-console.spec.js +56 -0
  172. package/dist/cjs/lib/v3/tests/page-console.spec.js.map +7 -0
  173. package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js +418 -0
  174. package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js.map +7 -0
  175. package/dist/cjs/lib/v3/tests/page-goto-response.spec.js +35 -0
  176. package/dist/cjs/lib/v3/tests/page-goto-response.spec.js.map +7 -0
  177. package/dist/cjs/lib/v3/tests/page-hover.spec.js +167 -0
  178. package/dist/cjs/lib/v3/tests/page-hover.spec.js.map +7 -0
  179. package/dist/cjs/lib/v3/tests/page-screenshot.spec.js +295 -0
  180. package/dist/cjs/lib/v3/tests/page-screenshot.spec.js.map +7 -0
  181. package/dist/cjs/lib/v3/tests/page-scroll.spec.js +182 -0
  182. package/dist/cjs/lib/v3/tests/page-scroll.spec.js.map +7 -0
  183. package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js +46 -0
  184. package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js.map +7 -0
  185. package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js +98 -0
  186. package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js.map +7 -0
  187. package/dist/cjs/lib/v3/tests/setinputfiles.spec.js +148 -0
  188. package/dist/cjs/lib/v3/tests/setinputfiles.spec.js.map +7 -0
  189. package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js +156 -0
  190. package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js.map +7 -0
  191. package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js +156 -0
  192. package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js.map +7 -0
  193. package/dist/cjs/lib/v3/tests/testUtils.js +54 -0
  194. package/dist/cjs/lib/v3/tests/testUtils.js.map +7 -0
  195. package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js +100 -0
  196. package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js.map +7 -0
  197. package/dist/cjs/lib/v3/tests/timeouts.spec.js +32 -0
  198. package/dist/cjs/lib/v3/tests/timeouts.spec.js.map +7 -0
  199. package/dist/cjs/lib/v3/tests/user-data-dir.spec.js +65 -0
  200. package/dist/cjs/lib/v3/tests/user-data-dir.spec.js.map +7 -0
  201. package/dist/cjs/lib/v3/tests/v3.config.js +36 -0
  202. package/dist/cjs/lib/v3/tests/v3.config.js.map +7 -0
  203. package/dist/cjs/lib/v3/tests/v3.dynamic.config.js +67 -0
  204. package/dist/cjs/lib/v3/tests/v3.dynamic.config.js.map +7 -0
  205. package/dist/cjs/lib/v3/tests/v3.playwright.config.js +61 -0
  206. package/dist/cjs/lib/v3/tests/v3.playwright.config.js.map +7 -0
  207. package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js +593 -0
  208. package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js.map +7 -0
  209. package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js +97 -0
  210. package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js.map +7 -0
  211. package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js +77 -0
  212. package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js.map +7 -0
  213. package/dist/cjs/lib/v3/timeoutConfig.d.ts +2 -0
  214. package/dist/cjs/lib/v3/types/private/agent.d.ts +6 -0
  215. package/dist/cjs/lib/v3/types/private/api.d.ts +11 -0
  216. package/dist/cjs/lib/v3/types/private/cache.d.ts +128 -0
  217. package/dist/cjs/lib/v3/types/private/evaluator.d.ts +40 -0
  218. package/dist/cjs/lib/v3/types/private/handlers.d.ts +38 -0
  219. package/dist/cjs/lib/v3/types/private/index.d.ts +7 -0
  220. package/dist/cjs/lib/v3/types/private/internal.d.ts +39 -0
  221. package/dist/cjs/lib/v3/types/private/locator.d.ts +9 -0
  222. package/dist/cjs/lib/v3/types/private/network.d.ts +34 -0
  223. package/dist/cjs/lib/v3/types/private/shutdown.d.ts +19 -0
  224. package/dist/cjs/lib/v3/types/private/shutdownErrors.d.ts +12 -0
  225. package/dist/cjs/lib/v3/types/private/snapshot.d.ts +117 -0
  226. package/dist/cjs/lib/v3/types/public/agent.d.ts +595 -0
  227. package/dist/cjs/lib/v3/types/public/api.d.ts +1211 -0
  228. package/dist/cjs/lib/v3/types/public/apiErrors.d.ts +18 -0
  229. package/dist/cjs/lib/v3/types/public/index.d.ts +12 -0
  230. package/dist/cjs/lib/v3/types/public/locator.d.ts +9 -0
  231. package/dist/cjs/lib/v3/types/public/logs.d.ts +23 -0
  232. package/dist/cjs/lib/v3/types/public/methods.d.ts +56 -0
  233. package/dist/cjs/lib/v3/types/public/metrics.d.ts +27 -0
  234. package/dist/cjs/lib/v3/types/public/model.d.ts +65 -0
  235. package/dist/cjs/lib/v3/types/public/options.d.ts +70 -0
  236. package/dist/cjs/lib/v3/types/public/page.d.ts +18 -0
  237. package/dist/cjs/lib/v3/types/public/screenshotTypes.d.ts +25 -0
  238. package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +152 -0
  239. package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.d.ts +15 -0
  240. package/dist/cjs/lib/v3/understudy/a11y/snapshot/activeElement.d.ts +8 -0
  241. package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.d.ts +77 -0
  242. package/dist/cjs/lib/v3/understudy/a11y/snapshot/coordinateResolver.d.ts +7 -0
  243. package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.d.ts +46 -0
  244. package/dist/cjs/lib/v3/understudy/a11y/snapshot/focusSelectors.d.ts +24 -0
  245. package/dist/cjs/lib/v3/understudy/a11y/snapshot/index.d.ts +4 -0
  246. package/dist/cjs/lib/v3/understudy/a11y/snapshot/sessions.d.ts +16 -0
  247. package/dist/cjs/lib/v3/understudy/a11y/snapshot/treeFormatUtils.d.ts +28 -0
  248. package/dist/cjs/lib/v3/understudy/a11y/snapshot/xpathUtils.d.ts +26 -0
  249. package/dist/cjs/lib/v3/understudy/a11yInvocation.d.ts +8 -0
  250. package/dist/cjs/lib/v3/understudy/cdp.d.ts +69 -0
  251. package/dist/cjs/lib/v3/understudy/consoleMessage.d.ts +22 -0
  252. package/dist/cjs/lib/v3/understudy/context.d.ts +132 -0
  253. package/dist/cjs/lib/v3/understudy/deepLocator.d.ts +87 -0
  254. package/dist/cjs/lib/v3/understudy/executionContextRegistry.d.ts +15 -0
  255. package/dist/cjs/lib/v3/understudy/fileUploadUtils.d.ts +13 -0
  256. package/dist/cjs/lib/v3/understudy/frame.d.ts +69 -0
  257. package/dist/cjs/lib/v3/understudy/frameLocator.d.ts +50 -0
  258. package/dist/cjs/lib/v3/understudy/frameRegistry.d.ts +101 -0
  259. package/dist/cjs/lib/v3/understudy/initScripts.d.ts +2 -0
  260. package/dist/cjs/lib/v3/understudy/lifecycleWatcher.d.ts +64 -0
  261. package/dist/cjs/lib/v3/understudy/locator.d.ts +194 -0
  262. package/dist/cjs/lib/v3/understudy/locatorInvocation.d.ts +8 -0
  263. package/dist/cjs/lib/v3/understudy/navigationResponseTracker.d.ts +84 -0
  264. package/dist/cjs/lib/v3/understudy/networkManager.d.ts +53 -0
  265. package/dist/cjs/lib/v3/understudy/page.d.ts +354 -0
  266. package/dist/cjs/lib/v3/understudy/piercer.d.ts +4 -0
  267. package/dist/cjs/lib/v3/understudy/response.d.ts +137 -0
  268. package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +16 -0
  269. package/dist/cjs/lib/v3/understudy/selectorResolver.d.ts +38 -0
  270. package/dist/cjs/lib/v3/v3.d.ts +191 -0
  271. package/dist/cjs/lib/v3/zodCompat.d.ts +12 -0
  272. package/dist/cjs/lib/v3Evaluator.d.ts +19 -0
  273. package/dist/cjs/lib/version.d.ts +5 -0
  274. package/dist/cjs/package.json +3 -0
  275. package/dist/cjs/tests/browserbase-session-accessors.test.js +101 -0
  276. package/dist/cjs/tests/browserbase-session-accessors.test.js.map +7 -0
  277. package/dist/cjs/tests/cache-llm-resolution.test.js +187 -0
  278. package/dist/cjs/tests/cache-llm-resolution.test.js.map +7 -0
  279. package/dist/cjs/tests/helpers/mockCDPSession.js +50 -0
  280. package/dist/cjs/tests/helpers/mockCDPSession.js.map +7 -0
  281. package/dist/cjs/tests/llm-provider.test.js +57 -0
  282. package/dist/cjs/tests/llm-provider.test.js.map +7 -0
  283. package/dist/cjs/tests/model-deprecation.test.js +132 -0
  284. package/dist/cjs/tests/model-deprecation.test.js.map +7 -0
  285. package/dist/cjs/tests/page-snapshot.test.js +58 -0
  286. package/dist/cjs/tests/page-snapshot.test.js.map +7 -0
  287. package/dist/cjs/tests/public-api/export-surface.test.js +76 -0
  288. package/dist/cjs/tests/public-api/export-surface.test.js.map +7 -0
  289. package/dist/cjs/tests/public-api/llm-and-agents.test.js +150 -0
  290. package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +7 -0
  291. package/dist/cjs/tests/public-api/public-error-types.test.js +104 -0
  292. package/dist/cjs/tests/public-api/public-error-types.test.js.map +7 -0
  293. package/dist/cjs/tests/public-api/public-types.test.js +74 -0
  294. package/dist/cjs/tests/public-api/public-types.test.js.map +7 -0
  295. package/dist/cjs/tests/public-api/runtime-utils.test.js +53 -0
  296. package/dist/cjs/tests/public-api/runtime-utils.test.js.map +7 -0
  297. package/dist/cjs/tests/public-api/schema-utils.test.js +100 -0
  298. package/dist/cjs/tests/public-api/schema-utils.test.js.map +7 -0
  299. package/dist/cjs/tests/public-api/timeout-error-types.test.js +103 -0
  300. package/dist/cjs/tests/public-api/timeout-error-types.test.js.map +7 -0
  301. package/dist/cjs/tests/public-api/tool-type-export.test.js +47 -0
  302. package/dist/cjs/tests/public-api/tool-type-export.test.js.map +7 -0
  303. package/dist/cjs/tests/public-api/v3-core.test.js +104 -0
  304. package/dist/cjs/tests/public-api/v3-core.test.js.map +7 -0
  305. package/dist/cjs/tests/safety-confirmation.test.js +134 -0
  306. package/dist/cjs/tests/safety-confirmation.test.js.map +7 -0
  307. package/dist/cjs/tests/snapshot-a11y-resolvers.test.js +370 -0
  308. package/dist/cjs/tests/snapshot-a11y-resolvers.test.js.map +7 -0
  309. package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js +294 -0
  310. package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js.map +7 -0
  311. package/dist/cjs/tests/snapshot-capture-orchestration.test.js +403 -0
  312. package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +7 -0
  313. package/dist/cjs/tests/snapshot-cbor.test.js +197 -0
  314. package/dist/cjs/tests/snapshot-cbor.test.js.map +7 -0
  315. package/dist/cjs/tests/snapshot-dom-session-builders.test.js +246 -0
  316. package/dist/cjs/tests/snapshot-dom-session-builders.test.js.map +7 -0
  317. package/dist/cjs/tests/snapshot-dom-tree-utils.test.js +104 -0
  318. package/dist/cjs/tests/snapshot-dom-tree-utils.test.js.map +7 -0
  319. package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js +45 -0
  320. package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js.map +7 -0
  321. package/dist/cjs/tests/snapshot-frame-merge.test.js +388 -0
  322. package/dist/cjs/tests/snapshot-frame-merge.test.js.map +7 -0
  323. package/dist/cjs/tests/snapshot-tree-format-utils.test.js +106 -0
  324. package/dist/cjs/tests/snapshot-tree-format-utils.test.js.map +7 -0
  325. package/dist/cjs/tests/snapshot-xpath-utils.test.js +74 -0
  326. package/dist/cjs/tests/snapshot-xpath-utils.test.js.map +7 -0
  327. package/dist/cjs/tests/timeout-handlers.test.js +864 -0
  328. package/dist/cjs/tests/timeout-handlers.test.js.map +7 -0
  329. package/dist/cjs/tests/xpath-parser.test.js +314 -0
  330. package/dist/cjs/tests/xpath-parser.test.js.map +7 -0
  331. package/dist/cjs/tests/xpath-resolver.test.js +70 -0
  332. package/dist/cjs/tests/xpath-resolver.test.js.map +7 -0
  333. package/dist/cjs/tests/zod-enum-compatibility.test.js +119 -0
  334. package/dist/cjs/tests/zod-enum-compatibility.test.js.map +7 -0
  335. package/dist/esm/lib/modelUtils.d.ts +0 -3
  336. package/dist/esm/lib/modelUtils.js +2 -7
  337. package/dist/esm/lib/modelUtils.js.map +1 -1
  338. package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -2
  339. package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
  340. package/dist/esm/lib/v3/agent/tools/extract.d.ts +1 -2
  341. package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
  342. package/dist/esm/lib/v3/agent/tools/fillform.d.ts +1 -2
  343. package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
  344. package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
  345. package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
  346. package/dist/esm/lib/v3/cli.d.ts +2 -0
  347. package/dist/esm/lib/v3/cli.js +10 -0
  348. package/dist/esm/lib/v3/cli.js.map +1 -0
  349. package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
  350. package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
  351. package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
  352. package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
  353. package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
  354. package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
  355. package/dist/esm/lib/v3/index.d.ts +1 -0
  356. package/dist/esm/lib/v3/index.js +1 -0
  357. package/dist/esm/lib/v3/index.js.map +1 -1
  358. package/dist/esm/lib/v3/shutdown/supervisor.d.ts +7 -5
  359. package/dist/esm/lib/v3/shutdown/supervisor.js +62 -52
  360. package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
  361. package/dist/esm/lib/v3/shutdown/supervisorClient.js +48 -52
  362. package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
  363. package/dist/esm/lib/v3/tests/click-count.spec.js +47 -12
  364. package/dist/esm/lib/v3/tests/click-count.spec.js.map +2 -2
  365. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +67 -21
  366. package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +2 -2
  367. package/dist/esm/lib/v3/tests/v3.playwright.config.js +3 -60
  368. package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +2 -2
  369. package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -13
  370. package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
  371. package/dist/esm/lib/v3/understudy/context.js +10 -1
  372. package/dist/esm/lib/v3/understudy/context.js.map +1 -1
  373. package/dist/esm/lib/v3/understudy/locator.js +2 -2
  374. package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
  375. package/dist/esm/lib/v3/understudy/page.js +2 -1
  376. package/dist/esm/lib/v3/understudy/page.js.map +1 -1
  377. package/dist/esm/lib/v3/v3.js +10 -13
  378. package/dist/esm/lib/v3/v3.js.map +1 -1
  379. package/dist/esm/tests/public-api/export-surface.test.js +1 -0
  380. package/dist/esm/tests/public-api/export-surface.test.js.map +2 -2
  381. package/package.json +13 -9
  382. package/dist/esm/lib/v3/tests/envReporter.js +0 -57
  383. package/dist/esm/lib/v3/tests/envReporter.js.map +0 -7
  384. package/dist/esm/tests/agent-execution-model.test.js +0 -139
  385. package/dist/esm/tests/agent-execution-model.test.js.map +0 -7
  386. package/dist/esm/tests/model-utils.test.js +0 -43
  387. package/dist/esm/tests/model-utils.test.js.map +0 -7
@@ -0,0 +1,593 @@
1
+ var import_test = require("@playwright/test");
2
+ var import_v3 = require("../v3.js");
3
+ var import_v3_dynamic_config = require("./v3.dynamic.config.js");
4
+ var import_testUtils = require("./testUtils.js");
5
+ import_test.test.describe.configure({ mode: "serial" });
6
+ import_test.test.describe("Page.waitForSelector tests", () => {
7
+ let v3;
8
+ import_test.test.beforeAll(async () => {
9
+ v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
10
+ await v3.init();
11
+ });
12
+ import_test.test.beforeEach(async () => {
13
+ const pages = v3.context.pages();
14
+ if (pages.length === 0) {
15
+ await v3.context.newPage("about:blank");
16
+ return;
17
+ }
18
+ const [primary, ...extras] = pages;
19
+ for (const page of extras) {
20
+ await page.close().catch(() => {
21
+ });
22
+ }
23
+ v3.context.setActivePage(primary);
24
+ await primary.goto("about:blank", {
25
+ waitUntil: "load",
26
+ timeoutMs: 15e3
27
+ });
28
+ });
29
+ import_test.test.afterAll(async () => {
30
+ await (0, import_testUtils.closeV3)(v3);
31
+ });
32
+ import_test.test.describe("Basic state tests", () => {
33
+ (0, import_test.test)("resolves when element is already visible", async () => {
34
+ const page = v3.context.pages()[0];
35
+ await page.goto(
36
+ "data:text/html," + encodeURIComponent('<button id="submit-btn">Submit</button>')
37
+ );
38
+ const result = await page.waitForSelector("#submit-btn");
39
+ (0, import_test.expect)(result).toBe(true);
40
+ });
41
+ (0, import_test.test)("resolves when element appears after delay", async () => {
42
+ const page = v3.context.pages()[0];
43
+ await page.goto(
44
+ "data:text/html," + encodeURIComponent(
45
+ "<div id='container'></div><script>setTimeout(() => { const btn = document.createElement('button'); btn.id = 'delayed-btn'; btn.textContent = 'Delayed Button'; document.getElementById('container').appendChild(btn);}, 300);</script>"
46
+ )
47
+ );
48
+ const result = await page.waitForSelector("#delayed-btn", {
49
+ timeout: 5e3
50
+ });
51
+ (0, import_test.expect)(result).toBe(true);
52
+ });
53
+ (0, import_test.test)("state 'attached' resolves for hidden elements", async () => {
54
+ const page = v3.context.pages()[0];
55
+ await page.goto(
56
+ "data:text/html," + encodeURIComponent(
57
+ '<div id="hidden-div" style="display: none;">Hidden Content</div>'
58
+ )
59
+ );
60
+ const result = await page.waitForSelector("#hidden-div", {
61
+ state: "attached"
62
+ });
63
+ (0, import_test.expect)(result).toBe(true);
64
+ });
65
+ (0, import_test.test)("state 'visible' waits for element to become visible", async () => {
66
+ const page = v3.context.pages()[0];
67
+ await page.goto(
68
+ "data:text/html," + encodeURIComponent(
69
+ `<div id="show-later" style="display: none;">Now Visible</div><script>setTimeout(() => { document.getElementById('show-later').style.display = 'block';}, 300);</script>`
70
+ )
71
+ );
72
+ const result = await page.waitForSelector("#show-later", {
73
+ state: "visible",
74
+ timeout: 5e3
75
+ });
76
+ (0, import_test.expect)(result).toBe(true);
77
+ });
78
+ (0, import_test.test)("state 'hidden' waits for element to become hidden", async () => {
79
+ const page = v3.context.pages()[0];
80
+ await page.goto(
81
+ "data:text/html," + encodeURIComponent(
82
+ `<div id="hide-later" style="display: block;">Will Hide</div><script>setTimeout(() => { document.getElementById('hide-later').style.display = 'none';}, 300);</script>`
83
+ )
84
+ );
85
+ const result = await page.waitForSelector("#hide-later", {
86
+ state: "hidden",
87
+ timeout: 5e3
88
+ });
89
+ (0, import_test.expect)(result).toBe(true);
90
+ });
91
+ (0, import_test.test)("state 'detached' waits for element to be removed", async () => {
92
+ const page = v3.context.pages()[0];
93
+ await page.goto(
94
+ "data:text/html," + encodeURIComponent(
95
+ `<div id="remove-me">Will Be Removed</div><script>setTimeout(() => { const el = document.getElementById('remove-me'); el.parentNode.removeChild(el);}, 300);</script>`
96
+ )
97
+ );
98
+ const result = await page.waitForSelector("#remove-me", {
99
+ state: "detached",
100
+ timeout: 5e3
101
+ });
102
+ (0, import_test.expect)(result).toBe(true);
103
+ });
104
+ (0, import_test.test)("state 'detached' resolves immediately for non-existent element", async () => {
105
+ const page = v3.context.pages()[0];
106
+ await page.goto(
107
+ "data:text/html," + encodeURIComponent("<div>Content</div>")
108
+ );
109
+ const result = await page.waitForSelector("#does-not-exist", {
110
+ state: "detached",
111
+ timeout: 1e3
112
+ });
113
+ (0, import_test.expect)(result).toBe(true);
114
+ });
115
+ });
116
+ import_test.test.describe("Timeout behavior", () => {
117
+ (0, import_test.test)("throws on timeout when element never appears", async () => {
118
+ const page = v3.context.pages()[0];
119
+ await page.goto(
120
+ "data:text/html," + encodeURIComponent("<div>No button here</div>")
121
+ );
122
+ let error = null;
123
+ try {
124
+ await page.waitForSelector("#nonexistent", { timeout: 300 });
125
+ } catch (e) {
126
+ error = e;
127
+ }
128
+ (0, import_test.expect)(error).not.toBeNull();
129
+ (0, import_test.expect)(error?.message).toContain("Timeout");
130
+ (0, import_test.expect)(error?.message).toContain("#nonexistent");
131
+ });
132
+ (0, import_test.test)("respects custom timeout duration", async () => {
133
+ const page = v3.context.pages()[0];
134
+ await page.goto(
135
+ "data:text/html," + encodeURIComponent("<div>Content</div>")
136
+ );
137
+ const startTime = Date.now();
138
+ try {
139
+ await page.waitForSelector("#nonexistent", { timeout: 500 });
140
+ } catch {
141
+ }
142
+ const elapsed = Date.now() - startTime;
143
+ (0, import_test.expect)(elapsed).toBeGreaterThanOrEqual(450);
144
+ (0, import_test.expect)(elapsed).toBeLessThan(2e3);
145
+ });
146
+ });
147
+ import_test.test.describe("CSS selector variants", () => {
148
+ (0, import_test.test)("handles complex CSS selectors", async () => {
149
+ const page = v3.context.pages()[0];
150
+ await page.goto(
151
+ "data:text/html," + encodeURIComponent(
152
+ '<div class="container"><form id="login-form"><button type="submit">Login</button></form></div>'
153
+ )
154
+ );
155
+ const result = await page.waitForSelector(
156
+ ".container #login-form button[type='submit']"
157
+ );
158
+ (0, import_test.expect)(result).toBe(true);
159
+ });
160
+ });
161
+ import_test.test.describe("Open shadow DOM", () => {
162
+ (0, import_test.test)("finds element inside open shadow DOM with pierceShadow: true", async () => {
163
+ const page = v3.context.pages()[0];
164
+ await page.goto(
165
+ "data:text/html," + encodeURIComponent(
166
+ '<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button id=\\"shadow-btn\\">Shadow Button</button>";</script>'
167
+ ),
168
+ { waitUntil: "load", timeoutMs: 3e4 }
169
+ );
170
+ await page.waitForTimeout(100);
171
+ const result = await page.waitForSelector("#shadow-btn", {
172
+ pierceShadow: true,
173
+ timeout: 5e3
174
+ });
175
+ (0, import_test.expect)(result).toBe(true);
176
+ });
177
+ (0, import_test.test)("does NOT find shadow DOM element with pierceShadow: false", async () => {
178
+ const page = v3.context.pages()[0];
179
+ await page.goto(
180
+ "data:text/html," + encodeURIComponent(
181
+ '<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button id=\\"shadow-only-btn\\">Shadow Only</button>";</script>'
182
+ ),
183
+ { waitUntil: "load", timeoutMs: 3e4 }
184
+ );
185
+ await page.waitForTimeout(100);
186
+ let error = null;
187
+ try {
188
+ await page.waitForSelector("#shadow-only-btn", {
189
+ pierceShadow: false,
190
+ timeout: 300
191
+ });
192
+ } catch (e) {
193
+ error = e;
194
+ }
195
+ (0, import_test.expect)(error).not.toBeNull();
196
+ (0, import_test.expect)(error?.message).toContain("Timeout");
197
+ });
198
+ (0, import_test.test)("finds element in nested open shadow DOM", async () => {
199
+ const page = v3.context.pages()[0];
200
+ await page.goto(
201
+ "data:text/html," + encodeURIComponent(
202
+ '<div id="outer-host"></div><script>const outerHost = document.getElementById("outer-host");const outerShadow = outerHost.attachShadow({mode: "open"});outerShadow.innerHTML = "<div id=\\"inner-host\\"></div>";const innerHost = outerShadow.getElementById("inner-host");const innerShadow = innerHost.attachShadow({mode: "open"});innerShadow.innerHTML = "<span id=\\"deep-element\\">Deep!</span>";</script>'
203
+ ),
204
+ { waitUntil: "load", timeoutMs: 3e4 }
205
+ );
206
+ await page.waitForTimeout(100);
207
+ const result = await page.waitForSelector("#deep-element", {
208
+ pierceShadow: true,
209
+ timeout: 5e3
210
+ });
211
+ (0, import_test.expect)(result).toBe(true);
212
+ });
213
+ });
214
+ import_test.test.describe("Closed shadow DOM (via piercer)", () => {
215
+ (0, import_test.test)("finds element inside closed shadow DOM via custom element", async () => {
216
+ const page = v3.context.pages()[0];
217
+ await page.goto(
218
+ "data:text/html," + encodeURIComponent(
219
+ `<closed-shadow-host></closed-shadow-host><script>class ClosedShadowHost extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<button id=\\"closed-btn\\">Closed Shadow Button</button>"; }}customElements.define('closed-shadow-host', ClosedShadowHost);</script>`
220
+ ),
221
+ { waitUntil: "load", timeoutMs: 3e4 }
222
+ );
223
+ await page.waitForTimeout(100);
224
+ const result = await page.waitForSelector("#closed-btn", {
225
+ pierceShadow: true,
226
+ timeout: 5e3
227
+ });
228
+ (0, import_test.expect)(result).toBe(true);
229
+ });
230
+ (0, import_test.test)("finds element in nested closed shadow DOM", async () => {
231
+ const page = v3.context.pages()[0];
232
+ await page.goto(
233
+ "data:text/html," + encodeURIComponent(
234
+ `<outer-closed></outer-closed><script>class InnerClosed extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<span id=\\"deeply-closed\\">Deeply Nested Closed</span>"; }}customElements.define('inner-closed', InnerClosed);class OuterClosed extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<inner-closed></inner-closed>"; }}customElements.define('outer-closed', OuterClosed);</script>`
235
+ ),
236
+ { waitUntil: "load", timeoutMs: 3e4 }
237
+ );
238
+ await page.waitForTimeout(100);
239
+ const result = await page.waitForSelector("#deeply-closed", {
240
+ pierceShadow: true,
241
+ timeout: 5e3
242
+ });
243
+ (0, import_test.expect)(result).toBe(true);
244
+ });
245
+ (0, import_test.test)("finds element in mixed open/closed nested shadow DOM", async () => {
246
+ const page = v3.context.pages()[0];
247
+ await page.goto(
248
+ "data:text/html," + encodeURIComponent(
249
+ `<div id="open-host"></div><script>class ClosedInner extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<button id=\\"mixed-deep-btn\\">Mixed Deep Button</button>"; }}customElements.define('closed-inner', ClosedInner);const openHost = document.getElementById("open-host");const openShadow = openHost.attachShadow({mode: "open"});openShadow.innerHTML = "<closed-inner></closed-inner>";</script>`
250
+ ),
251
+ { waitUntil: "load", timeoutMs: 3e4 }
252
+ );
253
+ await page.waitForTimeout(100);
254
+ const result = await page.waitForSelector("#mixed-deep-btn", {
255
+ pierceShadow: true,
256
+ timeout: 5e3
257
+ });
258
+ (0, import_test.expect)(result).toBe(true);
259
+ });
260
+ (0, import_test.test)("waits for element to appear inside closed shadow DOM", async () => {
261
+ const page = v3.context.pages()[0];
262
+ await page.goto(
263
+ "data:text/html," + encodeURIComponent(
264
+ `<delayed-closed-host></delayed-closed-host><script>class DelayedClosedHost extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<div id=\\"container\\"></div>"; setTimeout(() => { shadow.getElementById("container").innerHTML = "<button id=\\"delayed-closed-btn\\">Appeared!</button>"; }, 300); }}customElements.define('delayed-closed-host', DelayedClosedHost);</script>`
265
+ ),
266
+ { waitUntil: "load", timeoutMs: 3e4 }
267
+ );
268
+ const result = await page.waitForSelector("#delayed-closed-btn", {
269
+ pierceShadow: true,
270
+ timeout: 5e3
271
+ });
272
+ (0, import_test.expect)(result).toBe(true);
273
+ });
274
+ });
275
+ import_test.test.describe("XPath selectors", () => {
276
+ (0, import_test.test)("finds element with basic XPath", async () => {
277
+ const page = v3.context.pages()[0];
278
+ await page.goto(
279
+ "data:text/html," + encodeURIComponent('<button id="xpath-btn">XPath Button</button>')
280
+ );
281
+ const result = await page.waitForSelector("//button[@id='xpath-btn']", {
282
+ timeout: 5e3
283
+ });
284
+ (0, import_test.expect)(result).toBe(true);
285
+ });
286
+ (0, import_test.test)("finds element with xpath= prefix", async () => {
287
+ const page = v3.context.pages()[0];
288
+ await page.goto(
289
+ "data:text/html," + encodeURIComponent(
290
+ '<div id="container"><span class="target">Target</span></div>'
291
+ )
292
+ );
293
+ const result = await page.waitForSelector(
294
+ "xpath=//span[@class='target']",
295
+ {
296
+ timeout: 5e3
297
+ }
298
+ );
299
+ (0, import_test.expect)(result).toBe(true);
300
+ });
301
+ (0, import_test.test)("waits for element to appear with XPath", async () => {
302
+ const page = v3.context.pages()[0];
303
+ await page.goto(
304
+ "data:text/html," + encodeURIComponent(
305
+ `<div id='container'></div><script>setTimeout(() => { document.getElementById("container").innerHTML = "<span id=\\"delayed-xpath\\">Delayed XPath</span>";}, 300);</script>`
306
+ )
307
+ );
308
+ const result = await page.waitForSelector("//span[@id='delayed-xpath']", {
309
+ timeout: 5e3
310
+ });
311
+ (0, import_test.expect)(result).toBe(true);
312
+ });
313
+ (0, import_test.test)("finds element in open shadow DOM with XPath", async () => {
314
+ const page = v3.context.pages()[0];
315
+ await page.goto(
316
+ "data:text/html," + encodeURIComponent(
317
+ '<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button id=\\"shadow-xpath-btn\\">Shadow XPath</button>";</script>'
318
+ ),
319
+ { waitUntil: "load", timeoutMs: 3e4 }
320
+ );
321
+ await page.waitForTimeout(100);
322
+ const result = await page.waitForSelector(
323
+ "//button[@id='shadow-xpath-btn']",
324
+ {
325
+ pierceShadow: true,
326
+ timeout: 5e3
327
+ }
328
+ );
329
+ (0, import_test.expect)(result).toBe(true);
330
+ });
331
+ (0, import_test.test)("finds element in closed shadow DOM with XPath", async () => {
332
+ const page = v3.context.pages()[0];
333
+ await page.goto(
334
+ "data:text/html," + encodeURIComponent(
335
+ `<xpath-closed-host></xpath-closed-host><script>class XPathClosedHost extends HTMLElement { constructor() { super(); const shadow = this.attachShadow({mode: "closed"}); shadow.innerHTML = "<span id=\\"xpath-closed-target\\">Closed XPath Target</span>"; }}customElements.define('xpath-closed-host', XPathClosedHost);</script>`
336
+ ),
337
+ { waitUntil: "load", timeoutMs: 3e4 }
338
+ );
339
+ await page.waitForTimeout(100);
340
+ const result = await page.waitForSelector(
341
+ "//span[@id='xpath-closed-target']",
342
+ {
343
+ pierceShadow: true,
344
+ timeout: 5e3
345
+ }
346
+ );
347
+ (0, import_test.expect)(result).toBe(true);
348
+ });
349
+ });
350
+ import_test.test.describe("Iframe hop notation (>>)", () => {
351
+ (0, import_test.test)("finds element inside single iframe", async () => {
352
+ const page = v3.context.pages()[0];
353
+ await page.goto(
354
+ "data:text/html," + encodeURIComponent(
355
+ '<button id="main-btn">Main Button</button><iframe id="my-frame"></iframe><script>const frame = document.getElementById("my-frame");const doc = frame.contentDocument;doc.open();doc.write("<button id=\\"frame-btn\\">Frame Button</button>");doc.close();</script>'
356
+ )
357
+ );
358
+ await page.waitForTimeout(100);
359
+ const result = await page.waitForSelector(
360
+ "iframe#my-frame >> #frame-btn",
361
+ {
362
+ timeout: 5e3
363
+ }
364
+ );
365
+ (0, import_test.expect)(result).toBe(true);
366
+ });
367
+ (0, import_test.test)("finds element through multiple iframe hops", async () => {
368
+ const page = v3.context.pages()[0];
369
+ await page.goto(
370
+ "data:text/html," + encodeURIComponent(
371
+ '<iframe id="outer-frame"></iframe><script>const outerFrame = document.getElementById("outer-frame");const outerDoc = outerFrame.contentDocument;outerDoc.open();outerDoc.write("<iframe id=\\"inner-frame\\"></iframe>");outerDoc.close();setTimeout(() => { const innerFrame = outerDoc.getElementById("inner-frame"); const innerDoc = innerFrame.contentDocument; innerDoc.open(); innerDoc.write("<div id=\\"nested-content\\">Deeply Nested</div>"); innerDoc.close();}, 100);</script>'
372
+ )
373
+ );
374
+ await page.waitForTimeout(300);
375
+ const result = await page.waitForSelector(
376
+ "iframe#outer-frame >> iframe#inner-frame >> #nested-content",
377
+ { timeout: 5e3 }
378
+ );
379
+ (0, import_test.expect)(result).toBe(true);
380
+ });
381
+ (0, import_test.test)("waits for element to appear inside iframe", async () => {
382
+ const page = v3.context.pages()[0];
383
+ await page.goto(
384
+ "data:text/html," + encodeURIComponent(
385
+ '<iframe id="delay-frame"></iframe><script>const frame = document.getElementById("delay-frame");const doc = frame.contentDocument;doc.open();doc.write("<div id=\\"container\\"></div>");doc.close();setTimeout(() => { doc.getElementById("container").innerHTML = "<span id=\\"delayed-in-frame\\">Appeared!</span>";}, 300);</script>'
386
+ )
387
+ );
388
+ const result = await page.waitForSelector(
389
+ "iframe#delay-frame >> #delayed-in-frame",
390
+ {
391
+ timeout: 5e3
392
+ }
393
+ );
394
+ (0, import_test.expect)(result).toBe(true);
395
+ });
396
+ });
397
+ import_test.test.describe("Visibility edge cases", () => {
398
+ (0, import_test.test)("visibility: hidden is not visible", async () => {
399
+ const page = v3.context.pages()[0];
400
+ await page.goto(
401
+ "data:text/html," + encodeURIComponent(
402
+ '<div id="vis-hidden" style="visibility: hidden;">Hidden</div>'
403
+ )
404
+ );
405
+ const attached = await page.waitForSelector("#vis-hidden", {
406
+ state: "attached"
407
+ });
408
+ (0, import_test.expect)(attached).toBe(true);
409
+ let error = null;
410
+ try {
411
+ await page.waitForSelector("#vis-hidden", {
412
+ state: "visible",
413
+ timeout: 200
414
+ });
415
+ } catch (e) {
416
+ error = e;
417
+ }
418
+ (0, import_test.expect)(error).not.toBeNull();
419
+ });
420
+ (0, import_test.test)("opacity: 0 is not visible", async () => {
421
+ const page = v3.context.pages()[0];
422
+ await page.goto(
423
+ "data:text/html," + encodeURIComponent(
424
+ '<div id="transparent" style="opacity: 0;">Transparent</div>'
425
+ )
426
+ );
427
+ const attached = await page.waitForSelector("#transparent", {
428
+ state: "attached"
429
+ });
430
+ (0, import_test.expect)(attached).toBe(true);
431
+ let error = null;
432
+ try {
433
+ await page.waitForSelector("#transparent", {
434
+ state: "visible",
435
+ timeout: 200
436
+ });
437
+ } catch (e) {
438
+ error = e;
439
+ }
440
+ (0, import_test.expect)(error).not.toBeNull();
441
+ });
442
+ (0, import_test.test)("zero dimensions is not visible", async () => {
443
+ const page = v3.context.pages()[0];
444
+ await page.goto(
445
+ "data:text/html," + encodeURIComponent(
446
+ '<div id="zero-size" style="width: 0; height: 0;">Zero</div>'
447
+ )
448
+ );
449
+ const attached = await page.waitForSelector("#zero-size", {
450
+ state: "attached"
451
+ });
452
+ (0, import_test.expect)(attached).toBe(true);
453
+ let error = null;
454
+ try {
455
+ await page.waitForSelector("#zero-size", {
456
+ state: "visible",
457
+ timeout: 200
458
+ });
459
+ } catch (e) {
460
+ error = e;
461
+ }
462
+ (0, import_test.expect)(error).not.toBeNull();
463
+ });
464
+ (0, import_test.test)("detects visibility change via class toggle", async () => {
465
+ const page = v3.context.pages()[0];
466
+ await page.goto(
467
+ "data:text/html," + encodeURIComponent(
468
+ `<style>.hidden { display: none; }</style><div id="class-toggle" class="hidden">Class Toggle</div><script>setTimeout(() => { document.getElementById('class-toggle').classList.remove('hidden');}, 300);</script>`
469
+ )
470
+ );
471
+ const result = await page.waitForSelector("#class-toggle", {
472
+ state: "visible",
473
+ timeout: 5e3
474
+ });
475
+ (0, import_test.expect)(result).toBe(true);
476
+ });
477
+ (0, import_test.test)("detects visibility change via style attribute", async () => {
478
+ const page = v3.context.pages()[0];
479
+ await page.goto(
480
+ "data:text/html," + encodeURIComponent(
481
+ `<div id="style-toggle" style="display: none;">Style Toggle</div><script>setTimeout(() => { document.getElementById('style-toggle').style.display = 'block';}, 300);</script>`
482
+ )
483
+ );
484
+ const result = await page.waitForSelector("#style-toggle", {
485
+ state: "visible",
486
+ timeout: 5e3
487
+ });
488
+ (0, import_test.expect)(result).toBe(true);
489
+ });
490
+ });
491
+ import_test.test.describe("Dynamic DOM scenarios", () => {
492
+ (0, import_test.test)("handles rapid DOM mutations", async () => {
493
+ const page = v3.context.pages()[0];
494
+ await page.goto(
495
+ "data:text/html," + encodeURIComponent(
496
+ "<div id='container'></div><script>let count = 0;const interval = setInterval(() => { count++; const div = document.createElement('div'); div.id = 'item-' + count; div.textContent = 'item'; document.getElementById('container').appendChild(div); if (count >= 10) clearInterval(interval);}, 50);</script>"
497
+ ),
498
+ { waitUntil: "load", timeoutMs: 3e4 }
499
+ );
500
+ await page.waitForTimeout(50);
501
+ const result = await page.waitForSelector("#item-7", { timeout: 1e4 });
502
+ (0, import_test.expect)(result).toBe(true);
503
+ });
504
+ (0, import_test.test)("handles element removed and re-added", async () => {
505
+ const page = v3.context.pages()[0];
506
+ await page.goto(
507
+ "data:text/html," + encodeURIComponent('<div id="toggle-me">Toggle</div>')
508
+ );
509
+ const browserTarget = (process.env.STAGEHAND_BROWSER_TARGET ?? "local").toLowerCase();
510
+ const isBrowserbase = browserTarget === "browserbase";
511
+ const removeDelayMs = isBrowserbase ? 1e3 : 200;
512
+ const addDelayMs = isBrowserbase ? 1600 : 500;
513
+ const waitTimeoutMs = isBrowserbase ? 1e4 : 5e3;
514
+ const detachedPromise = page.waitForSelector("#toggle-me", {
515
+ state: "detached",
516
+ timeout: waitTimeoutMs
517
+ });
518
+ await page.evaluate(
519
+ ({ removeDelay, addDelay }) => {
520
+ const el = document.getElementById("toggle-me");
521
+ const parent = el?.parentNode;
522
+ if (!el || !parent) return;
523
+ setTimeout(() => parent.removeChild(el), removeDelay);
524
+ setTimeout(() => parent.appendChild(el), addDelay);
525
+ },
526
+ { removeDelay: removeDelayMs, addDelay: addDelayMs }
527
+ );
528
+ const detached = await detachedPromise;
529
+ (0, import_test.expect)(detached).toBe(true);
530
+ const visible = await page.waitForSelector("#toggle-me", {
531
+ state: "visible",
532
+ timeout: waitTimeoutMs
533
+ });
534
+ (0, import_test.expect)(visible).toBe(true);
535
+ });
536
+ (0, import_test.test)("handles dynamically replaced innerHTML", async () => {
537
+ const page = v3.context.pages()[0];
538
+ await page.goto(
539
+ "data:text/html," + encodeURIComponent(
540
+ '<div id="container">Loading...</div><script>setTimeout(() => { document.getElementById("container").innerHTML = "<button id=\\"loaded-btn\\">Loaded!</button>";}, 300);</script>'
541
+ )
542
+ );
543
+ const result = await page.waitForSelector("#loaded-btn", {
544
+ timeout: 5e3
545
+ });
546
+ (0, import_test.expect)(result).toBe(true);
547
+ });
548
+ (0, import_test.test)("handles element created via insertAdjacentHTML", async () => {
549
+ const page = v3.context.pages()[0];
550
+ await page.goto(
551
+ "data:text/html," + encodeURIComponent(
552
+ '<div id="anchor"></div><script>setTimeout(() => { document.getElementById("anchor").insertAdjacentHTML( "afterend", "<div id=\\"inserted\\">Inserted</div>" );}, 300);</script>'
553
+ )
554
+ );
555
+ const result = await page.waitForSelector("#inserted", { timeout: 5e3 });
556
+ (0, import_test.expect)(result).toBe(true);
557
+ });
558
+ });
559
+ import_test.test.describe("Shadow DOM visibility changes", () => {
560
+ (0, import_test.test)("detects element becoming visible inside open shadow DOM", async () => {
561
+ const page = v3.context.pages()[0];
562
+ await page.goto(
563
+ "data:text/html," + encodeURIComponent(
564
+ '<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button id=\\"shadow-btn\\" style=\\"display:none\\">Shadow</button>";setTimeout(() => { shadow.getElementById("shadow-btn").style.display = "block";}, 300);</script>'
565
+ ),
566
+ { waitUntil: "load", timeoutMs: 3e4 }
567
+ );
568
+ const result = await page.waitForSelector("#shadow-btn", {
569
+ state: "visible",
570
+ pierceShadow: true,
571
+ timeout: 5e3
572
+ });
573
+ (0, import_test.expect)(result).toBe(true);
574
+ });
575
+ (0, import_test.test)("detects element becoming hidden inside shadow DOM", async () => {
576
+ const page = v3.context.pages()[0];
577
+ await page.goto(
578
+ "data:text/html," + encodeURIComponent(
579
+ '<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button id=\\"hide-shadow-btn\\">Will Hide</button>";setTimeout(() => { shadow.getElementById("hide-shadow-btn").style.display = "none";}, 300);</script>'
580
+ ),
581
+ { waitUntil: "load", timeoutMs: 3e4 }
582
+ );
583
+ await page.waitForTimeout(100);
584
+ const result = await page.waitForSelector("#hide-shadow-btn", {
585
+ state: "hidden",
586
+ pierceShadow: true,
587
+ timeout: 5e3
588
+ });
589
+ (0, import_test.expect)(result).toBe(true);
590
+ });
591
+ });
592
+ });
593
+ //# sourceMappingURL=wait-for-selector.spec.js.map