@browserbasehq/orca 3.1.0-patch.0 → 3.1.0-patch.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +183 -0
- package/dist/cjs/cli.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +24956 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/lib/inference.d.ts +65 -0
- package/dist/cjs/lib/inferenceLogUtils.d.ts +12 -0
- package/dist/cjs/lib/logger.d.ts +69 -0
- package/dist/cjs/lib/modelUtils.d.ts +11 -0
- package/dist/cjs/lib/prompt.d.ts +14 -0
- package/dist/cjs/lib/utils.d.ts +68 -0
- package/dist/cjs/lib/v3/agent/AgentClient.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +57 -0
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.d.ts +74 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.d.ts +71 -0
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +69 -0
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/tools/click.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.d.ts +14 -0
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/goto.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +92 -0
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +24 -0
- package/dist/cjs/lib/v3/agent/tools/navback.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/tools/search.d.ts +15 -0
- package/dist/cjs/lib/v3/agent/tools/think.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/type.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/wait.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/actionMapping.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/utils/cuaKeyMapping.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/googleCustomToolHandler.d.ts +25 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.d.ts +22 -0
- package/dist/cjs/lib/v3/agent/utils/imageCompression.d.ts +53 -0
- package/dist/cjs/lib/v3/agent/utils/messageProcessing.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/utils/screenshotHandler.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.d.ts +26 -0
- package/dist/cjs/lib/v3/agent/utils/xpath.d.ts +11 -0
- package/dist/cjs/lib/v3/api.d.ts +86 -0
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +23 -0
- package/dist/cjs/lib/v3/cache/AgentCache.d.ts +109 -0
- package/dist/cjs/lib/v3/cache/CacheStorage.d.ts +17 -0
- package/dist/cjs/lib/v3/cache/serverAgentCache.d.ts +7 -0
- package/dist/cjs/lib/v3/cache/utils.d.ts +15 -0
- package/dist/cjs/lib/v3/cli.d.ts +2 -0
- package/dist/cjs/lib/v3/dom/a11yScripts/index.d.ts +11 -0
- package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.d.ts +16 -0
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +52 -0
- package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.js +1 -0
- package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/build/scriptV3Content.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.js +1 -0
- package/dist/cjs/lib/v3/dom/genA11yScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genDomScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genLocatorScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genScreenshotScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/counts.d.ts +15 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/index.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/scripts.d.ts +37 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/selectors.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/waitForSelector.d.ts +19 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathParser.d.ts +76 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.d.ts +9 -0
- package/dist/cjs/lib/v3/dom/piercer.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/piercer.runtime.d.ts +23 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.runtime.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/resolveMaskRect.d.ts +8 -0
- package/dist/cjs/lib/v3/external_clients/aisdk.d.ts +11 -0
- package/dist/cjs/lib/v3/external_clients/customOpenAI.d.ts +18 -0
- package/dist/cjs/lib/v3/flowLogger.d.ts +139 -0
- package/dist/cjs/lib/v3/handlers/actHandler.d.ts +21 -0
- package/dist/cjs/lib/v3/handlers/extractHandler.d.ts +31 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +24 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/timeoutGuard.d.ts +2 -0
- package/dist/cjs/lib/v3/handlers/observeHandler.d.ts +17 -0
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +32 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +33 -0
- package/dist/cjs/lib/v3/index.d.ts +18 -0
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +7 -0
- package/dist/cjs/lib/v3/launch/local.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/AnthropicClient.d.ts +16 -0
- package/dist/cjs/lib/v3/llm/CerebrasClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/GoogleClient.d.ts +19 -0
- package/dist/cjs/lib/v3/llm/GroqClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/LLMClient.d.ts +121 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +13 -0
- package/dist/cjs/lib/v3/llm/OpenAIClient.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +15 -0
- package/dist/cjs/lib/v3/logger.d.ts +9 -0
- package/dist/cjs/lib/v3/mcp/connection.d.ts +11 -0
- package/dist/cjs/lib/v3/mcp/utils.d.ts +3 -0
- package/dist/cjs/lib/v3/shutdown/cleanupLocal.d.ts +14 -0
- package/dist/cjs/lib/v3/shutdown/supervisor.d.ts +11 -0
- package/dist/cjs/lib/v3/shutdown/supervisorClient.d.ts +15 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js +113 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js +102 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +374 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js +354 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js +247 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js +105 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js +126 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js +44 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js +147 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js +54 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +176 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js +80 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js +493 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js +92 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js +568 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js +15 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js +296 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js +159 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +191 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js +108 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js +71 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js +118 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +136 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js +157 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +242 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js +547 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js +269 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js +23 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +90 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js +56 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js +418 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js +35 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js +167 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js +295 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js +182 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js +46 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js +98 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js +148 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/testUtils.js +54 -0
- package/dist/cjs/lib/v3/tests/testUtils.js.map +7 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js +100 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js +32 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js +65 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.config.js +36 -0
- package/dist/cjs/lib/v3/tests/v3.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js +67 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js +61 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js +593 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js +97 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js +77 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js.map +7 -0
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +2 -0
- package/dist/cjs/lib/v3/types/private/agent.d.ts +6 -0
- package/dist/cjs/lib/v3/types/private/api.d.ts +11 -0
- package/dist/cjs/lib/v3/types/private/cache.d.ts +128 -0
- package/dist/cjs/lib/v3/types/private/evaluator.d.ts +40 -0
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +38 -0
- package/dist/cjs/lib/v3/types/private/index.d.ts +7 -0
- package/dist/cjs/lib/v3/types/private/internal.d.ts +39 -0
- package/dist/cjs/lib/v3/types/private/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/private/network.d.ts +34 -0
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +19 -0
- package/dist/cjs/lib/v3/types/private/shutdownErrors.d.ts +12 -0
- package/dist/cjs/lib/v3/types/private/snapshot.d.ts +117 -0
- package/dist/cjs/lib/v3/types/public/agent.d.ts +595 -0
- package/dist/cjs/lib/v3/types/public/api.d.ts +1211 -0
- package/dist/cjs/lib/v3/types/public/apiErrors.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +12 -0
- package/dist/cjs/lib/v3/types/public/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/public/logs.d.ts +23 -0
- package/dist/cjs/lib/v3/types/public/methods.d.ts +56 -0
- package/dist/cjs/lib/v3/types/public/metrics.d.ts +27 -0
- package/dist/cjs/lib/v3/types/public/model.d.ts +65 -0
- package/dist/cjs/lib/v3/types/public/options.d.ts +70 -0
- package/dist/cjs/lib/v3/types/public/page.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/screenshotTypes.d.ts +25 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +152 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/activeElement.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.d.ts +77 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/coordinateResolver.d.ts +7 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.d.ts +46 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/focusSelectors.d.ts +24 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/index.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/sessions.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/treeFormatUtils.d.ts +28 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/xpathUtils.d.ts +26 -0
- package/dist/cjs/lib/v3/understudy/a11yInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/consoleMessage.d.ts +22 -0
- package/dist/cjs/lib/v3/understudy/context.d.ts +132 -0
- package/dist/cjs/lib/v3/understudy/deepLocator.d.ts +87 -0
- package/dist/cjs/lib/v3/understudy/executionContextRegistry.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/fileUploadUtils.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/frame.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/frameLocator.d.ts +50 -0
- package/dist/cjs/lib/v3/understudy/frameRegistry.d.ts +101 -0
- package/dist/cjs/lib/v3/understudy/initScripts.d.ts +2 -0
- package/dist/cjs/lib/v3/understudy/lifecycleWatcher.d.ts +64 -0
- package/dist/cjs/lib/v3/understudy/locator.d.ts +194 -0
- package/dist/cjs/lib/v3/understudy/locatorInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/navigationResponseTracker.d.ts +84 -0
- package/dist/cjs/lib/v3/understudy/networkManager.d.ts +53 -0
- package/dist/cjs/lib/v3/understudy/page.d.ts +354 -0
- package/dist/cjs/lib/v3/understudy/piercer.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/response.d.ts +137 -0
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/selectorResolver.d.ts +38 -0
- package/dist/cjs/lib/v3/v3.d.ts +191 -0
- package/dist/cjs/lib/v3/zodCompat.d.ts +12 -0
- package/dist/cjs/lib/v3Evaluator.d.ts +19 -0
- package/dist/cjs/lib/version.d.ts +5 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js +101 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js.map +7 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js +187 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js.map +7 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js +50 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js.map +7 -0
- package/dist/cjs/tests/llm-provider.test.js +57 -0
- package/dist/cjs/tests/llm-provider.test.js.map +7 -0
- package/dist/cjs/tests/model-deprecation.test.js +132 -0
- package/dist/cjs/tests/model-deprecation.test.js.map +7 -0
- package/dist/cjs/tests/page-snapshot.test.js +58 -0
- package/dist/cjs/tests/page-snapshot.test.js.map +7 -0
- package/dist/cjs/tests/public-api/export-surface.test.js +76 -0
- package/dist/cjs/tests/public-api/export-surface.test.js.map +7 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js +150 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js +104 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-types.test.js +74 -0
- package/dist/cjs/tests/public-api/public-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js +53 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js +100 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js +103 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js +47 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js.map +7 -0
- package/dist/cjs/tests/public-api/v3-core.test.js +104 -0
- package/dist/cjs/tests/public-api/v3-core.test.js.map +7 -0
- package/dist/cjs/tests/safety-confirmation.test.js +134 -0
- package/dist/cjs/tests/safety-confirmation.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js +370 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js +294 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js +403 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-cbor.test.js +197 -0
- package/dist/cjs/tests/snapshot-cbor.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js +246 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js +104 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js +45 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js +388 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js +106 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js +74 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js.map +7 -0
- package/dist/cjs/tests/timeout-handlers.test.js +864 -0
- package/dist/cjs/tests/timeout-handlers.test.js.map +7 -0
- package/dist/cjs/tests/xpath-parser.test.js +314 -0
- package/dist/cjs/tests/xpath-parser.test.js.map +7 -0
- package/dist/cjs/tests/xpath-resolver.test.js +70 -0
- package/dist/cjs/tests/xpath-resolver.test.js.map +7 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js +119 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js.map +7 -0
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/lib/v3/api.d.ts +16 -1
- package/dist/esm/lib/v3/api.js +41 -5
- package/dist/esm/lib/v3/api.js.map +1 -1
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +0 -3
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js +22 -20
- package/dist/esm/lib/v3/handlers/handlerUtils/actHandlerUtils.js.map +1 -1
- package/dist/esm/lib/v3/llm/aisdk.js +5 -2
- package/dist/esm/lib/v3/llm/aisdk.js.map +1 -1
- package/dist/esm/lib/v3/types/public/api.d.ts +8 -0
- package/dist/esm/lib/v3/types/public/api.js +5 -3
- package/dist/esm/lib/v3/types/public/api.js.map +1 -1
- package/dist/esm/lib/v3/types/public/index.d.ts +1 -0
- package/dist/esm/lib/v3/types/public/index.js.map +1 -1
- package/dist/esm/lib/v3/types/public/sdkErrors.d.ts +3 -0
- package/dist/esm/lib/v3/types/public/sdkErrors.js +12 -6
- package/dist/esm/lib/v3/types/public/sdkErrors.js.map +1 -1
- package/dist/esm/tests/api-multiregion.test.js +73 -0
- package/dist/esm/tests/api-multiregion.test.js.map +7 -0
- package/dist/esm/tests/public-api/public-error-types.test.js +2 -1
- package/dist/esm/tests/public-api/public-error-types.test.js.map +2 -2
- package/dist/esm/tests/understudy-command-exception.test.js +55 -0
- package/dist/esm/tests/understudy-command-exception.test.js.map +7 -0
- package/package.json +1 -1
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_config = require("./v3.config.js");
|
|
4
|
+
import_test.test.describe("Coordinate-based clicking", () => {
|
|
5
|
+
let v3;
|
|
6
|
+
import_test.test.beforeEach(async () => {
|
|
7
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
8
|
+
await v3.init();
|
|
9
|
+
});
|
|
10
|
+
import_test.test.afterEach(async () => {
|
|
11
|
+
await v3?.close?.().catch(() => {
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
(0, import_test.test)("clicking by coordinates toggles a button state", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html," + encodeURIComponent(
|
|
18
|
+
`<!doctype html><html><body>
|
|
19
|
+
<button id="btn" onclick="this.dataset.clicked = (this.dataset.clicked==='1'?'0':'1')">Click</button>
|
|
20
|
+
<div id="out"></div>
|
|
21
|
+
<script>
|
|
22
|
+
const btn = document.getElementById('btn');
|
|
23
|
+
const out = document.getElementById('out');
|
|
24
|
+
const update = () => { out.textContent = btn.dataset.clicked === '1' ? 'clicked' : 'idle'; };
|
|
25
|
+
update();
|
|
26
|
+
btn.addEventListener('click', update);
|
|
27
|
+
</script>
|
|
28
|
+
</body></html>`
|
|
29
|
+
)
|
|
30
|
+
);
|
|
31
|
+
let state = await page.mainFrame().evaluate(() => {
|
|
32
|
+
const out = document.getElementById("out");
|
|
33
|
+
return out?.textContent || "";
|
|
34
|
+
});
|
|
35
|
+
(0, import_test.expect)(state).toBe("idle");
|
|
36
|
+
const { x, y, width, height } = await page.mainFrame().getLocationForSelector("#btn");
|
|
37
|
+
const cx = Math.round(x + width / 2);
|
|
38
|
+
const cy = Math.round(y + height / 2);
|
|
39
|
+
await page.click(cx, cy);
|
|
40
|
+
state = await page.mainFrame().evaluate(() => {
|
|
41
|
+
const out = document.getElementById("out");
|
|
42
|
+
return out?.textContent || "";
|
|
43
|
+
});
|
|
44
|
+
(0, import_test.expect)(state).toBe("clicked");
|
|
45
|
+
await page.click(cx, cy);
|
|
46
|
+
state = await page.mainFrame().evaluate(() => {
|
|
47
|
+
const out = document.getElementById("out");
|
|
48
|
+
return out?.textContent || "";
|
|
49
|
+
});
|
|
50
|
+
(0, import_test.expect)(state).toBe("idle");
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=frame-get-location-and-click.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/frame-get-location-and-click.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Coordinate-based clicking\", () => {\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(\"clicking by coordinates toggles a button state\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <button id=\"btn\" onclick=\"this.dataset.clicked = (this.dataset.clicked==='1'?'0':'1')\">Click</button>\n <div id=\"out\"></div>\n <script>\n const btn = document.getElementById('btn');\n const out = document.getElementById('out');\n const update = () => { out.textContent = btn.dataset.clicked === '1' ? 'clicked' : 'idle'; };\n update();\n btn.addEventListener('click', update);\n </script>\n </body></html>`,\n ),\n );\n\n // Initial state should be idle\n let state = await page.mainFrame().evaluate(() => {\n const out = document.getElementById(\"out\");\n return out?.textContent || \"\";\n });\n expect(state).toBe(\"idle\");\n\n // Compute button location via Frame.getLocationForSelector\n const { x, y, width, height } = await page\n .mainFrame()\n .getLocationForSelector(\"#btn\");\n\n // Click near the center of the button using Page.click coordinates\n const cx = Math.round(x + width / 2);\n const cy = Math.round(y + height / 2);\n await page.click(cx, cy);\n\n state = await page.mainFrame().evaluate(() => {\n const out = document.getElementById(\"out\");\n return out?.textContent || \"\";\n });\n expect(state).toBe(\"clicked\");\n\n // Click again to toggle back to idle\n await page.click(cx, cy);\n state = await page.mainFrame().evaluate(() => {\n const out = document.getElementById(\"out\");\n return out?.textContent || \"\";\n });\n expect(state).toBe(\"idle\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,uBAA6B;AAE7B,iBAAK,SAAS,6BAA6B,MAAM;AAC/C,MAAI;AAEJ,mBAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,aAAG,6BAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,mBAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC,CAAC;AAED,wBAAK,kDAAkD,YAAY;AACjE,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT,oBACE;AAAA,QACE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWF;AAAA,IACJ;AAGA,QAAI,QAAQ,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM;AAChD,YAAM,MAAM,SAAS,eAAe,KAAK;AACzC,aAAO,KAAK,eAAe;AAAA,IAC7B,CAAC;AACD,4BAAO,KAAK,EAAE,KAAK,MAAM;AAGzB,UAAM,EAAE,GAAG,GAAG,OAAO,OAAO,IAAI,MAAM,KACnC,UAAU,EACV,uBAAuB,MAAM;AAGhC,UAAM,KAAK,KAAK,MAAM,IAAI,QAAQ,CAAC;AACnC,UAAM,KAAK,KAAK,MAAM,IAAI,SAAS,CAAC;AACpC,UAAM,KAAK,MAAM,IAAI,EAAE;AAEvB,YAAQ,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM;AAC5C,YAAM,MAAM,SAAS,eAAe,KAAK;AACzC,aAAO,KAAK,eAAe;AAAA,IAC7B,CAAC;AACD,4BAAO,KAAK,EAAE,KAAK,SAAS;AAG5B,UAAM,KAAK,MAAM,IAAI,EAAE;AACvB,YAAQ,MAAM,KAAK,UAAU,EAAE,SAAS,MAAM;AAC5C,YAAM,MAAM,SAAS,eAAe,KAAK;AACzC,aAAO,KAAK,eAAe;AAAA,IAC7B,CAAC;AACD,4BAAO,KAAK,EAAE,KAAK,MAAM;AAAA,EAC3B,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_config = require("./v3.config.js");
|
|
4
|
+
const isBrowserbase = (process.env.STAGEHAND_BROWSER_TARGET ?? "local").toLowerCase() === "browserbase";
|
|
5
|
+
const MIN_TIMEOUT_MS = 3e3;
|
|
6
|
+
const MAX_TIMEOUT_MS = 12e4;
|
|
7
|
+
const parseBoundedTimeoutMs = (value, fallbackMs) => {
|
|
8
|
+
const parsed = Number(value ?? fallbackMs);
|
|
9
|
+
if (!Number.isFinite(parsed)) return fallbackMs;
|
|
10
|
+
return Math.max(MIN_TIMEOUT_MS, Math.min(MAX_TIMEOUT_MS, parsed));
|
|
11
|
+
};
|
|
12
|
+
const CHILD_FRAME_TIMEOUT_MS = parseBoundedTimeoutMs(
|
|
13
|
+
process.env.IFRAME_CHILD_FRAME_TIMEOUT_MS,
|
|
14
|
+
isBrowserbase ? 8e4 : 4e4
|
|
15
|
+
);
|
|
16
|
+
const POPUP_TIMEOUT_MS = parseBoundedTimeoutMs(
|
|
17
|
+
process.env.IFRAME_POPUP_TIMEOUT_MS,
|
|
18
|
+
isBrowserbase ? 6e4 : 4e4
|
|
19
|
+
);
|
|
20
|
+
const POPUP_URL_TIMEOUT_MS = parseBoundedTimeoutMs(
|
|
21
|
+
process.env.IFRAME_POPUP_URL_TIMEOUT_MS,
|
|
22
|
+
isBrowserbase ? 8e4 : 4e4
|
|
23
|
+
);
|
|
24
|
+
const DEBUG_INTERVAL_MS = 5e3;
|
|
25
|
+
const iframeDebugEnabled = isBrowserbase || process.env.IFRAME_DEBUG === "1";
|
|
26
|
+
const TEST_VIEWPORT = { width: 1288, height: 711 };
|
|
27
|
+
const formatError = (error) => {
|
|
28
|
+
if (error instanceof Error) return error.message;
|
|
29
|
+
return String(error);
|
|
30
|
+
};
|
|
31
|
+
const flattenFrameTree = (node, out = []) => {
|
|
32
|
+
out.push({
|
|
33
|
+
id: node.frame.id,
|
|
34
|
+
parentId: node.frame.parentId ?? null,
|
|
35
|
+
url: node.frame.url ?? ""
|
|
36
|
+
});
|
|
37
|
+
for (const child of node.childFrames ?? []) {
|
|
38
|
+
flattenFrameTree(child, out);
|
|
39
|
+
}
|
|
40
|
+
return out;
|
|
41
|
+
};
|
|
42
|
+
function debugLog(step, payload) {
|
|
43
|
+
if (!iframeDebugEnabled) return;
|
|
44
|
+
if (payload === void 0) {
|
|
45
|
+
console.log(`[iframe-debug] ${step}`);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
if (typeof payload === "string") {
|
|
49
|
+
console.log(`[iframe-debug] ${step}: ${payload}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
console.log(`[iframe-debug] ${step}: ${JSON.stringify(payload)}`);
|
|
54
|
+
} catch {
|
|
55
|
+
console.log(`[iframe-debug] ${step}: <unserializable payload>`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async function collectFrameSnapshot(page) {
|
|
59
|
+
const known = /* @__PURE__ */ new Map();
|
|
60
|
+
known.set(page.mainFrame().frameId, page.mainFrame());
|
|
61
|
+
for (const frame of page.frames()) known.set(frame.frameId, frame);
|
|
62
|
+
return Promise.all(
|
|
63
|
+
[...known.values()].map(async (frame) => {
|
|
64
|
+
try {
|
|
65
|
+
const state = await frame.evaluate(() => {
|
|
66
|
+
return {
|
|
67
|
+
href: location.href,
|
|
68
|
+
readyState: document.readyState,
|
|
69
|
+
visibilityState: document.visibilityState,
|
|
70
|
+
iframeCount: document.querySelectorAll("iframe").length,
|
|
71
|
+
hasShadowHost: Boolean(document.querySelector("shadow-host"))
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
return {
|
|
75
|
+
frameId: frame.frameId,
|
|
76
|
+
sessionId: frame.sessionId ?? "root",
|
|
77
|
+
...state
|
|
78
|
+
};
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return {
|
|
81
|
+
frameId: frame.frameId,
|
|
82
|
+
sessionId: frame.sessionId ?? "root",
|
|
83
|
+
error: formatError(error)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
async function logPageDiagnostics(page, reason, markerSelector) {
|
|
90
|
+
if (!iframeDebugEnabled) return;
|
|
91
|
+
const diagnostics = {
|
|
92
|
+
reason,
|
|
93
|
+
pageUrl: page.url(),
|
|
94
|
+
mainFrameId: page.mainFrame().frameId,
|
|
95
|
+
knownFrameCount: page.frames().length
|
|
96
|
+
};
|
|
97
|
+
try {
|
|
98
|
+
const domState = await page.mainFrame().evaluate((marker) => {
|
|
99
|
+
const el = marker ? document.querySelector(marker) : null;
|
|
100
|
+
const rect = el instanceof Element ? el.getBoundingClientRect().toJSON() : null;
|
|
101
|
+
return {
|
|
102
|
+
href: location.href,
|
|
103
|
+
readyState: document.readyState,
|
|
104
|
+
visibilityState: document.visibilityState,
|
|
105
|
+
hidden: document.hidden,
|
|
106
|
+
hasFocus: document.hasFocus(),
|
|
107
|
+
innerWidth: window.innerWidth,
|
|
108
|
+
innerHeight: window.innerHeight,
|
|
109
|
+
devicePixelRatio: window.devicePixelRatio,
|
|
110
|
+
markerSelector: marker,
|
|
111
|
+
markerPresent: Boolean(el),
|
|
112
|
+
markerRect: rect,
|
|
113
|
+
iframeCount: document.querySelectorAll("iframe").length
|
|
114
|
+
};
|
|
115
|
+
}, markerSelector);
|
|
116
|
+
diagnostics.domState = domState;
|
|
117
|
+
} catch (error) {
|
|
118
|
+
diagnostics.domStateError = formatError(error);
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
const frameTreeResponse = await page.sendCDP("Page.getFrameTree");
|
|
122
|
+
if (frameTreeResponse.frameTree) {
|
|
123
|
+
diagnostics.cdpFrameTree = flattenFrameTree(frameTreeResponse.frameTree);
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
diagnostics.cdpFrameTreeError = formatError(error);
|
|
127
|
+
}
|
|
128
|
+
diagnostics.frameSnapshot = await collectFrameSnapshot(page);
|
|
129
|
+
debugLog("page-diagnostics", diagnostics);
|
|
130
|
+
}
|
|
131
|
+
async function closeAllPages(ctx) {
|
|
132
|
+
const pages = ctx.pages();
|
|
133
|
+
await Promise.allSettled(pages.map((page) => page.close()));
|
|
134
|
+
}
|
|
135
|
+
async function waitForChildFrame(page, expectedChildUrl, timeoutMs = CHILD_FRAME_TIMEOUT_MS) {
|
|
136
|
+
const mainFrameId = page.mainFrame().frameId;
|
|
137
|
+
const deadline = Date.now() + timeoutMs;
|
|
138
|
+
let observedFrameCount = 0;
|
|
139
|
+
const observedChildFrameIds = /* @__PURE__ */ new Set();
|
|
140
|
+
let lastUrl = "";
|
|
141
|
+
let lastLogAt = Date.now();
|
|
142
|
+
while (Date.now() < deadline) {
|
|
143
|
+
const frames = page.frames();
|
|
144
|
+
observedFrameCount = Math.max(observedFrameCount, frames.length);
|
|
145
|
+
lastUrl = page.url();
|
|
146
|
+
const childIds = frames.filter((f) => f.frameId !== mainFrameId).map((f) => f.frameId);
|
|
147
|
+
if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {
|
|
148
|
+
debugLog("waitForChildFrame:progress", {
|
|
149
|
+
url: lastUrl,
|
|
150
|
+
mainFrameId,
|
|
151
|
+
observedFrameCount,
|
|
152
|
+
childIds,
|
|
153
|
+
expectedChildUrl
|
|
154
|
+
});
|
|
155
|
+
lastLogAt = Date.now();
|
|
156
|
+
}
|
|
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();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
213
|
+
}
|
|
214
|
+
await logPageDiagnostics(page, "waitForChildFrame timeout");
|
|
215
|
+
throw new Error(
|
|
216
|
+
`Timed out waiting for child frame to load (timeout=${timeoutMs}ms, mainFrameId=${mainFrameId}, expectedChildUrl=${expectedChildUrl}, maxObservedFrames=${observedFrameCount}, observedChildFrameIds=[${[...observedChildFrameIds].join(",")}], url=${lastUrl || "<unknown>"})`
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
async function waitForPageUrl(page, expectedUrlSubstring, timeoutMs = POPUP_URL_TIMEOUT_MS) {
|
|
220
|
+
const deadline = Date.now() + timeoutMs;
|
|
221
|
+
let lastUrl = "";
|
|
222
|
+
let lastLogAt = Date.now();
|
|
223
|
+
while (Date.now() < deadline) {
|
|
224
|
+
lastUrl = page.url();
|
|
225
|
+
if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {
|
|
226
|
+
debugLog("waitForPageUrl:progress", {
|
|
227
|
+
expectedUrlSubstring,
|
|
228
|
+
lastUrl
|
|
229
|
+
});
|
|
230
|
+
lastLogAt = Date.now();
|
|
231
|
+
}
|
|
232
|
+
if (lastUrl.includes(expectedUrlSubstring)) {
|
|
233
|
+
debugLog("waitForPageUrl:ready", {
|
|
234
|
+
expectedUrlSubstring,
|
|
235
|
+
lastUrl
|
|
236
|
+
});
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
240
|
+
}
|
|
241
|
+
await logPageDiagnostics(
|
|
242
|
+
page,
|
|
243
|
+
`waitForPageUrl timeout for ${expectedUrlSubstring}`
|
|
244
|
+
);
|
|
245
|
+
throw new Error(
|
|
246
|
+
`Timed out waiting for popup URL to include "${expectedUrlSubstring}" (timeout=${timeoutMs}ms, lastUrl=${lastUrl || "<unknown>"})`
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
async function preparePopupForFrameAttach(page, markerSelector, timeoutMs = CHILD_FRAME_TIMEOUT_MS) {
|
|
250
|
+
debugLog("preparePopupForFrameAttach:start", {
|
|
251
|
+
markerSelector,
|
|
252
|
+
timeoutMs,
|
|
253
|
+
url: page.url()
|
|
254
|
+
});
|
|
255
|
+
await page.waitForLoadState("domcontentloaded", timeoutMs);
|
|
256
|
+
await page.waitForSelector(markerSelector, {
|
|
257
|
+
state: "attached",
|
|
258
|
+
timeout: timeoutMs
|
|
259
|
+
});
|
|
260
|
+
await page.mainFrame().evaluate(() => {
|
|
261
|
+
const host = document.querySelector("shadow-host");
|
|
262
|
+
if (host instanceof HTMLElement) {
|
|
263
|
+
host.scrollIntoView({ block: "center", inline: "center" });
|
|
264
|
+
} else {
|
|
265
|
+
window.scrollTo(0, document.body.scrollHeight);
|
|
266
|
+
window.scrollTo(0, 0);
|
|
267
|
+
}
|
|
268
|
+
window.dispatchEvent(new Event("scroll"));
|
|
269
|
+
});
|
|
270
|
+
await logPageDiagnostics(
|
|
271
|
+
page,
|
|
272
|
+
"preparePopupForFrameAttach:ready",
|
|
273
|
+
markerSelector
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
async function ensurePopupViewport(page) {
|
|
277
|
+
await page.setViewportSize(TEST_VIEWPORT.width, TEST_VIEWPORT.height);
|
|
278
|
+
await logPageDiagnostics(page, "ensurePopupViewport");
|
|
279
|
+
}
|
|
280
|
+
async function waitForPopupPage(ctx, opener, timeoutMs = POPUP_TIMEOUT_MS) {
|
|
281
|
+
const openerMainFrameId = opener.mainFrame().frameId;
|
|
282
|
+
const deadline = Date.now() + timeoutMs;
|
|
283
|
+
let lastLogAt = Date.now();
|
|
284
|
+
while (Date.now() < deadline) {
|
|
285
|
+
const pages = ctx.pages();
|
|
286
|
+
const popup = pages.find((candidate) => {
|
|
287
|
+
return candidate.mainFrame().frameId !== openerMainFrameId;
|
|
288
|
+
});
|
|
289
|
+
if (popup) {
|
|
290
|
+
debugLog("waitForPopupPage:found", {
|
|
291
|
+
openerMainFrameId,
|
|
292
|
+
popupMainFrameId: popup.mainFrame().frameId,
|
|
293
|
+
popupUrl: popup.url()
|
|
294
|
+
});
|
|
295
|
+
return popup;
|
|
296
|
+
}
|
|
297
|
+
if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {
|
|
298
|
+
debugLog("waitForPopupPage:progress", {
|
|
299
|
+
openerMainFrameId,
|
|
300
|
+
observedPageIds: pages.map((p) => p.mainFrame().frameId)
|
|
301
|
+
});
|
|
302
|
+
lastLogAt = Date.now();
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
const active = await ctx.awaitActivePage(500);
|
|
306
|
+
if (active.mainFrame().frameId !== openerMainFrameId) {
|
|
307
|
+
debugLog("waitForPopupPage:active-non-opener", {
|
|
308
|
+
openerMainFrameId,
|
|
309
|
+
activeMainFrameId: active.mainFrame().frameId,
|
|
310
|
+
activeUrl: active.url()
|
|
311
|
+
});
|
|
312
|
+
return active;
|
|
313
|
+
}
|
|
314
|
+
} catch {
|
|
315
|
+
}
|
|
316
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
317
|
+
}
|
|
318
|
+
const pageIds = ctx.pages().map((p) => p.mainFrame().frameId).join(", ");
|
|
319
|
+
throw new Error(
|
|
320
|
+
`Timed out waiting for popup page (timeout=${timeoutMs}ms, openerMainFrameId=${openerMainFrameId}, observedPages=[${pageIds}])`
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
import_test.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";
|
|
327
|
+
if (isBrowserbase) {
|
|
328
|
+
import_test.test.describe.configure({ mode: "serial" });
|
|
329
|
+
}
|
|
330
|
+
let v3;
|
|
331
|
+
let ctx;
|
|
332
|
+
import_test.test.beforeAll(async () => {
|
|
333
|
+
debugLog("beforeAll:config", {
|
|
334
|
+
browserTarget: process.env.STAGEHAND_BROWSER_TARGET ?? "local",
|
|
335
|
+
childFrameTimeoutMs: CHILD_FRAME_TIMEOUT_MS,
|
|
336
|
+
popupTimeoutMs: POPUP_TIMEOUT_MS,
|
|
337
|
+
popupUrlTimeoutMs: POPUP_URL_TIMEOUT_MS
|
|
338
|
+
});
|
|
339
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
340
|
+
await v3.init();
|
|
341
|
+
ctx = v3.context;
|
|
342
|
+
await ctx.addInitScript(`
|
|
343
|
+
(() => {
|
|
344
|
+
document.addEventListener('DOMContentLoaded', () => {
|
|
345
|
+
document.documentElement.style.backgroundColor = 'red';
|
|
346
|
+
});
|
|
347
|
+
})();
|
|
348
|
+
`);
|
|
349
|
+
});
|
|
350
|
+
import_test.test.beforeEach(async () => {
|
|
351
|
+
await closeAllPages(ctx);
|
|
352
|
+
});
|
|
353
|
+
import_test.test.afterEach(async () => {
|
|
354
|
+
await closeAllPages(ctx);
|
|
355
|
+
});
|
|
356
|
+
import_test.test.afterAll(async () => {
|
|
357
|
+
await v3?.close?.().catch(() => {
|
|
358
|
+
});
|
|
359
|
+
});
|
|
360
|
+
import_test.test.describe("direct navigation", () => {
|
|
361
|
+
(0, import_test.test)("with OOPIF - sets background red in main page and iframe", async () => {
|
|
362
|
+
const page = await ctx.newPage();
|
|
363
|
+
await page.goto(
|
|
364
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/",
|
|
365
|
+
{ waitUntil: "networkidle" }
|
|
366
|
+
);
|
|
367
|
+
const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);
|
|
368
|
+
const mainBgColor = await page.mainFrame().evaluate(() => {
|
|
369
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
370
|
+
});
|
|
371
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
372
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
373
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
374
|
+
});
|
|
375
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
376
|
+
});
|
|
377
|
+
(0, import_test.test)("with SPIF - sets background red in main page and iframe", async () => {
|
|
378
|
+
const page = await ctx.newPage();
|
|
379
|
+
await page.goto(
|
|
380
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/",
|
|
381
|
+
{ waitUntil: "networkidle" }
|
|
382
|
+
);
|
|
383
|
+
const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);
|
|
384
|
+
const mainBgColor = await page.mainFrame().evaluate(() => {
|
|
385
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
386
|
+
});
|
|
387
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
388
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
389
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
390
|
+
});
|
|
391
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
import_test.test.describe("via newPage", () => {
|
|
395
|
+
(0, import_test.test)("with OOPIF - sets background red in main page and iframe", async () => {
|
|
396
|
+
const page = await ctx.newPage();
|
|
397
|
+
await page.goto(
|
|
398
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/",
|
|
399
|
+
{ waitUntil: "networkidle" }
|
|
400
|
+
);
|
|
401
|
+
const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);
|
|
402
|
+
const mainBgColor = await page.mainFrame().evaluate(() => {
|
|
403
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
404
|
+
});
|
|
405
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
406
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
407
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
408
|
+
});
|
|
409
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
410
|
+
});
|
|
411
|
+
(0, import_test.test)("with SPIF - sets background red in main page and iframe", async () => {
|
|
412
|
+
const page = await ctx.newPage();
|
|
413
|
+
await page.goto(
|
|
414
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/",
|
|
415
|
+
{ waitUntil: "networkidle" }
|
|
416
|
+
);
|
|
417
|
+
const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);
|
|
418
|
+
const mainBgColor = await page.mainFrame().evaluate(() => {
|
|
419
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
420
|
+
});
|
|
421
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
422
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
423
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
424
|
+
});
|
|
425
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
426
|
+
});
|
|
427
|
+
});
|
|
428
|
+
import_test.test.describe("via popup", () => {
|
|
429
|
+
(0, import_test.test)("with OOPIF - sets background red in main page and iframe", async () => {
|
|
430
|
+
const page = await ctx.newPage();
|
|
431
|
+
await page.goto(
|
|
432
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/ctx-add-init-script-oopif/",
|
|
433
|
+
{ waitUntil: "networkidle" }
|
|
434
|
+
);
|
|
435
|
+
await page.locator("a").click();
|
|
436
|
+
debugLog("popup-oopif:clicked-link", { openerUrl: page.url() });
|
|
437
|
+
const popup = await waitForPopupPage(ctx, page);
|
|
438
|
+
ctx.setActivePage(popup);
|
|
439
|
+
await ensurePopupViewport(popup);
|
|
440
|
+
await waitForPageUrl(
|
|
441
|
+
popup,
|
|
442
|
+
"/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/"
|
|
443
|
+
);
|
|
444
|
+
debugLog("popup-oopif:refresh-navigation", { url: popup.url() });
|
|
445
|
+
await popup.goto(
|
|
446
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/",
|
|
447
|
+
{ waitUntil: "networkidle" }
|
|
448
|
+
);
|
|
449
|
+
await logPageDiagnostics(
|
|
450
|
+
popup,
|
|
451
|
+
"popup-oopif:after-refresh",
|
|
452
|
+
"shadow-host"
|
|
453
|
+
);
|
|
454
|
+
await preparePopupForFrameAttach(popup, "shadow-host");
|
|
455
|
+
const iframe = await waitForChildFrame(popup, OOPIF_CHILD_URL);
|
|
456
|
+
const mainBgColor = await popup.mainFrame().evaluate(() => {
|
|
457
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
458
|
+
});
|
|
459
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
460
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
461
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
462
|
+
});
|
|
463
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
464
|
+
});
|
|
465
|
+
(0, import_test.test)("with SPIF - sets background red in main page and iframe", async () => {
|
|
466
|
+
const page = await ctx.newPage();
|
|
467
|
+
await page.goto(
|
|
468
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/ctx-add-init-script-spif/",
|
|
469
|
+
{ waitUntil: "networkidle" }
|
|
470
|
+
);
|
|
471
|
+
await page.locator("a").click();
|
|
472
|
+
debugLog("popup-spif:clicked-link", { openerUrl: page.url() });
|
|
473
|
+
const popup = await waitForPopupPage(ctx, page);
|
|
474
|
+
ctx.setActivePage(popup);
|
|
475
|
+
await ensurePopupViewport(popup);
|
|
476
|
+
await waitForPageUrl(
|
|
477
|
+
popup,
|
|
478
|
+
"/stagehand-eval-sites/sites/closed-shadow-dom-in-spif/"
|
|
479
|
+
);
|
|
480
|
+
await preparePopupForFrameAttach(popup, "iframe");
|
|
481
|
+
const iframe = await waitForChildFrame(popup, POPUP_SPIF_CHILD_URL);
|
|
482
|
+
const mainBgColor = await popup.mainFrame().evaluate(() => {
|
|
483
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
484
|
+
});
|
|
485
|
+
(0, import_test.expect)(mainBgColor).toBe("rgb(255, 0, 0)");
|
|
486
|
+
const iframeBgColor = await iframe.evaluate(() => {
|
|
487
|
+
return getComputedStyle(document.documentElement).backgroundColor;
|
|
488
|
+
});
|
|
489
|
+
(0, import_test.expect)(iframeBgColor).toBe("rgb(255, 0, 0)");
|
|
490
|
+
});
|
|
491
|
+
});
|
|
492
|
+
});
|
|
493
|
+
//# sourceMappingURL=iframe-ctx-addInitScript.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/iframe-ctx-addInitScript.spec.ts"],
|
|
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\";\nimport type { Page } from \"../understudy/page.js\";\n\nconst isBrowserbase =\n (process.env.STAGEHAND_BROWSER_TARGET ?? \"local\").toLowerCase() ===\n \"browserbase\";\nconst MIN_TIMEOUT_MS = 3_000;\nconst MAX_TIMEOUT_MS = 120_000;\n\nconst parseBoundedTimeoutMs = (\n value: string | undefined,\n fallbackMs: number,\n): number => {\n const parsed = Number(value ?? fallbackMs);\n if (!Number.isFinite(parsed)) return fallbackMs;\n return Math.max(MIN_TIMEOUT_MS, Math.min(MAX_TIMEOUT_MS, parsed));\n};\n\nconst CHILD_FRAME_TIMEOUT_MS = parseBoundedTimeoutMs(\n process.env.IFRAME_CHILD_FRAME_TIMEOUT_MS,\n isBrowserbase ? 80_000 : 40_000,\n);\nconst POPUP_TIMEOUT_MS = parseBoundedTimeoutMs(\n process.env.IFRAME_POPUP_TIMEOUT_MS,\n isBrowserbase ? 60_000 : 40_000,\n);\nconst POPUP_URL_TIMEOUT_MS = parseBoundedTimeoutMs(\n process.env.IFRAME_POPUP_URL_TIMEOUT_MS,\n isBrowserbase ? 80_000 : 40_000,\n);\nconst DEBUG_INTERVAL_MS = 5_000;\nconst iframeDebugEnabled = isBrowserbase || process.env.IFRAME_DEBUG === \"1\";\nconst TEST_VIEWPORT = { width: 1288, height: 711 };\n\ntype FrameTreeNode = {\n frame: { id: string; parentId?: string; url?: string };\n childFrames?: FrameTreeNode[];\n};\n\nconst formatError = (error: unknown): string => {\n if (error instanceof Error) return error.message;\n return String(error);\n};\n\nconst flattenFrameTree = (\n node: FrameTreeNode,\n out: Array<{ id: string; parentId: string | null; url: string }> = [],\n): Array<{ id: string; parentId: string | null; url: string }> => {\n out.push({\n id: node.frame.id,\n parentId: node.frame.parentId ?? null,\n url: node.frame.url ?? \"\",\n });\n for (const child of node.childFrames ?? []) {\n flattenFrameTree(child, out);\n }\n return out;\n};\n\nfunction debugLog(\n step: string,\n payload?: Record<string, unknown> | string,\n): void {\n if (!iframeDebugEnabled) return;\n if (payload === undefined) {\n console.log(`[iframe-debug] ${step}`);\n return;\n }\n if (typeof payload === \"string\") {\n console.log(`[iframe-debug] ${step}: ${payload}`);\n return;\n }\n try {\n console.log(`[iframe-debug] ${step}: ${JSON.stringify(payload)}`);\n } catch {\n console.log(`[iframe-debug] ${step}: <unserializable payload>`);\n }\n}\n\nasync function collectFrameSnapshot(\n page: Page,\n): Promise<Array<Record<string, unknown>>> {\n const known = new Map<string, ReturnType<Page[\"frames\"]>[number]>();\n known.set(page.mainFrame().frameId, page.mainFrame());\n for (const frame of page.frames()) known.set(frame.frameId, frame);\n\n return Promise.all(\n [...known.values()].map(async (frame) => {\n try {\n const state = await frame.evaluate(() => {\n return {\n href: location.href,\n readyState: document.readyState,\n visibilityState: document.visibilityState,\n iframeCount: document.querySelectorAll(\"iframe\").length,\n hasShadowHost: Boolean(document.querySelector(\"shadow-host\")),\n };\n });\n return {\n frameId: frame.frameId,\n sessionId: frame.sessionId ?? \"root\",\n ...state,\n };\n } catch (error) {\n return {\n frameId: frame.frameId,\n sessionId: frame.sessionId ?? \"root\",\n error: formatError(error),\n };\n }\n }),\n );\n}\n\nasync function logPageDiagnostics(\n page: Page,\n reason: string,\n markerSelector?: string,\n): Promise<void> {\n if (!iframeDebugEnabled) return;\n const diagnostics: Record<string, unknown> = {\n reason,\n pageUrl: page.url(),\n mainFrameId: page.mainFrame().frameId,\n knownFrameCount: page.frames().length,\n };\n\n try {\n const domState = await page.mainFrame().evaluate((marker) => {\n const el = marker ? document.querySelector(marker) : null;\n const rect =\n el instanceof Element ? el.getBoundingClientRect().toJSON() : null;\n return {\n href: location.href,\n readyState: document.readyState,\n visibilityState: document.visibilityState,\n hidden: document.hidden,\n hasFocus: document.hasFocus(),\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n devicePixelRatio: window.devicePixelRatio,\n markerSelector: marker,\n markerPresent: Boolean(el),\n markerRect: rect,\n iframeCount: document.querySelectorAll(\"iframe\").length,\n };\n }, markerSelector);\n diagnostics.domState = domState;\n } catch (error) {\n diagnostics.domStateError = formatError(error);\n }\n\n try {\n const frameTreeResponse = (await page.sendCDP(\"Page.getFrameTree\")) as {\n frameTree?: FrameTreeNode;\n };\n if (frameTreeResponse.frameTree) {\n diagnostics.cdpFrameTree = flattenFrameTree(frameTreeResponse.frameTree);\n }\n } catch (error) {\n diagnostics.cdpFrameTreeError = formatError(error);\n }\n\n diagnostics.frameSnapshot = await collectFrameSnapshot(page);\n debugLog(\"page-diagnostics\", diagnostics);\n}\n\nasync function closeAllPages(ctx: V3Context): Promise<void> {\n const pages = ctx.pages();\n await Promise.allSettled(pages.map((page) => page.close()));\n}\n\n/**\n * Poll until a child frame (non-main) appears on `page` and its document\n * has finished loading. Returns the child frame.\n */\nasync function waitForChildFrame(\n page: Page,\n expectedChildUrl: string,\n timeoutMs = CHILD_FRAME_TIMEOUT_MS,\n): Promise<ReturnType<Page[\"frames\"]>[number]> {\n const mainFrameId = page.mainFrame().frameId;\n const deadline = Date.now() + timeoutMs;\n let observedFrameCount = 0;\n const observedChildFrameIds = new Set<string>();\n let lastUrl = \"\";\n let lastLogAt = Date.now();\n\n while (Date.now() < deadline) {\n const frames = page.frames();\n observedFrameCount = Math.max(observedFrameCount, frames.length);\n lastUrl = page.url();\n const childIds = frames\n .filter((f) => f.frameId !== mainFrameId)\n .map((f) => f.frameId);\n if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {\n debugLog(\"waitForChildFrame:progress\", {\n url: lastUrl,\n mainFrameId,\n observedFrameCount,\n childIds,\n expectedChildUrl,\n });\n lastLogAt = Date.now();\n }\n for (const childId of childIds) observedChildFrameIds.add(childId);\n\n const childFrames = frames\n .filter((f) => f.frameId !== mainFrameId)\n // Prefer recently-discovered frames first; stale swapped frame ids\n // can remain visible in the registry while the live OOPIF is ready.\n .reverse();\n\n if (childFrames.length) {\n const probes = await Promise.all(\n childFrames.map(async (child) => {\n try {\n const state = await child.evaluate(() => ({\n href: location.href,\n readyState: document.readyState,\n }));\n return {\n child,\n href: state.href,\n readyState: state.readyState,\n error: undefined,\n };\n } catch (error) {\n return {\n child,\n href: undefined,\n readyState: undefined,\n error: formatError(error),\n };\n }\n }),\n );\n\n const ready = probes.find(\n (probe) =>\n probe.readyState === \"complete\" && probe.href === expectedChildUrl,\n );\n if (ready) {\n debugLog(\"waitForChildFrame:ready\", {\n childFrameId: ready.child.frameId,\n childSessionId: ready.child.sessionId ?? \"root\",\n childUrl: ready.href ?? \"<unknown>\",\n expectedChildUrl,\n url: lastUrl,\n });\n return ready.child;\n }\n\n if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {\n debugLog(\"waitForChildFrame:not-ready\", {\n url: lastUrl,\n mainFrameId,\n expectedChildUrl,\n probes: probes.map((probe) => ({\n frameId: probe.child.frameId,\n sessionId: probe.child.sessionId ?? \"root\",\n readyState: probe.readyState ?? \"<unknown>\",\n href: probe.href ?? \"<unknown>\",\n error: probe.error ?? \"<none>\",\n })),\n });\n lastLogAt = Date.now();\n }\n }\n await new Promise((r) => setTimeout(r, 100));\n }\n await logPageDiagnostics(page, \"waitForChildFrame timeout\");\n throw new Error(\n `Timed out waiting for child frame to load (timeout=${timeoutMs}ms, mainFrameId=${mainFrameId}, expectedChildUrl=${expectedChildUrl}, maxObservedFrames=${observedFrameCount}, observedChildFrameIds=[${[...observedChildFrameIds].join(\",\")}], url=${lastUrl || \"<unknown>\"})`,\n );\n}\n\nasync function waitForPageUrl(\n page: Page,\n expectedUrlSubstring: string,\n timeoutMs = POPUP_URL_TIMEOUT_MS,\n): Promise<void> {\n const deadline = Date.now() + timeoutMs;\n let lastUrl = \"\";\n let lastLogAt = Date.now();\n while (Date.now() < deadline) {\n lastUrl = page.url();\n if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {\n debugLog(\"waitForPageUrl:progress\", {\n expectedUrlSubstring,\n lastUrl,\n });\n lastLogAt = Date.now();\n }\n if (lastUrl.includes(expectedUrlSubstring)) {\n debugLog(\"waitForPageUrl:ready\", {\n expectedUrlSubstring,\n lastUrl,\n });\n return;\n }\n await new Promise((r) => setTimeout(r, 100));\n }\n await logPageDiagnostics(\n page,\n `waitForPageUrl timeout for ${expectedUrlSubstring}`,\n );\n throw new Error(\n `Timed out waiting for popup URL to include \"${expectedUrlSubstring}\" (timeout=${timeoutMs}ms, lastUrl=${lastUrl || \"<unknown>\"})`,\n );\n}\n\nasync function preparePopupForFrameAttach(\n page: Page,\n markerSelector: string,\n timeoutMs = CHILD_FRAME_TIMEOUT_MS,\n): Promise<void> {\n debugLog(\"preparePopupForFrameAttach:start\", {\n markerSelector,\n timeoutMs,\n url: page.url(),\n });\n await page.waitForLoadState(\"domcontentloaded\", timeoutMs);\n await page.waitForSelector(markerSelector, {\n state: \"attached\",\n timeout: timeoutMs,\n });\n await page.mainFrame().evaluate(() => {\n const host = document.querySelector(\"shadow-host\");\n if (host instanceof HTMLElement) {\n host.scrollIntoView({ block: \"center\", inline: \"center\" });\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n window.scrollTo(0, 0);\n }\n window.dispatchEvent(new Event(\"scroll\"));\n });\n await logPageDiagnostics(\n page,\n \"preparePopupForFrameAttach:ready\",\n markerSelector,\n );\n}\n\nasync function ensurePopupViewport(page: Page): Promise<void> {\n await page.setViewportSize(TEST_VIEWPORT.width, TEST_VIEWPORT.height);\n await logPageDiagnostics(page, \"ensurePopupViewport\");\n}\n\nasync function waitForPopupPage(\n ctx: V3Context,\n opener: Page,\n timeoutMs = POPUP_TIMEOUT_MS,\n): Promise<Page> {\n const openerMainFrameId = opener.mainFrame().frameId;\n const deadline = Date.now() + timeoutMs;\n let lastLogAt = Date.now();\n\n while (Date.now() < deadline) {\n const pages = ctx.pages();\n const popup = pages.find((candidate) => {\n return candidate.mainFrame().frameId !== openerMainFrameId;\n });\n if (popup) {\n debugLog(\"waitForPopupPage:found\", {\n openerMainFrameId,\n popupMainFrameId: popup.mainFrame().frameId,\n popupUrl: popup.url(),\n });\n return popup;\n }\n\n if (iframeDebugEnabled && Date.now() - lastLogAt >= DEBUG_INTERVAL_MS) {\n debugLog(\"waitForPopupPage:progress\", {\n openerMainFrameId,\n observedPageIds: pages.map((p) => p.mainFrame().frameId),\n });\n lastLogAt = Date.now();\n }\n\n try {\n const active = await ctx.awaitActivePage(500);\n if (active.mainFrame().frameId !== openerMainFrameId) {\n debugLog(\"waitForPopupPage:active-non-opener\", {\n openerMainFrameId,\n activeMainFrameId: active.mainFrame().frameId,\n activeUrl: active.url(),\n });\n return active;\n }\n } catch {\n // keep polling until timeout\n }\n\n await new Promise((r) => setTimeout(r, 100));\n }\n\n const pageIds = ctx\n .pages()\n .map((p) => p.mainFrame().frameId)\n .join(\", \");\n throw new Error(\n `Timed out waiting for popup page (timeout=${timeoutMs}ms, openerMainFrameId=${openerMainFrameId}, observedPages=[${pageIds}])`,\n );\n}\n\ntest.describe(\"context.addInitScript with iframes\", () => {\n const OOPIF_CHILD_URL =\n \"https://seanmcguire12.github.io/stagehand-oopif-sites/sites/form-filling/\";\n const SPIF_CHILD_URL =\n \"https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/iframe.html\";\n const POPUP_SPIF_CHILD_URL =\n \"https://browserbase.github.io/stagehand-eval-sites/sites/closed-shadow-dom-in-spif/embedded.html\";\n\n if (isBrowserbase) {\n test.describe.configure({ mode: \"serial\" });\n }\n\n let v3: V3;\n let ctx: V3Context;\n\n test.beforeAll(async () => {\n debugLog(\"beforeAll:config\", {\n browserTarget: process.env.STAGEHAND_BROWSER_TARGET ?? \"local\",\n childFrameTimeoutMs: CHILD_FRAME_TIMEOUT_MS,\n popupTimeoutMs: POPUP_TIMEOUT_MS,\n popupUrlTimeoutMs: POPUP_URL_TIMEOUT_MS,\n });\n v3 = new V3(v3TestConfig);\n await v3.init();\n ctx = v3.context;\n\n // Add init script that sets background to red\n await ctx.addInitScript(`\n (() => {\n document.addEventListener('DOMContentLoaded', () => {\n document.documentElement.style.backgroundColor = 'red';\n });\n })();\n `);\n });\n\n test.beforeEach(async () => {\n await closeAllPages(ctx);\n });\n\n test.afterEach(async () => {\n await closeAllPages(ctx);\n });\n\n test.afterAll(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test.describe(\"direct navigation\", () => {\n test(\"with OOPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/\",\n { waitUntil: \"networkidle\" },\n );\n\n const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);\n\n // Check main page background\n const mainBgColor = await page.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n\n test(\"with SPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/\",\n { waitUntil: \"networkidle\" },\n );\n\n const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);\n\n // Check main page background\n const mainBgColor = await page.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n });\n\n test.describe(\"via newPage\", () => {\n test(\"with OOPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/\",\n { waitUntil: \"networkidle\" },\n );\n\n const iframe = await waitForChildFrame(page, OOPIF_CHILD_URL);\n\n // Check main page background\n const mainBgColor = await page.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n\n test(\"with SPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/spif-in-closed-shadow-dom/\",\n { waitUntil: \"networkidle\" },\n );\n\n const iframe = await waitForChildFrame(page, SPIF_CHILD_URL);\n\n // Check main page background\n const mainBgColor = await page.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n });\n\n test.describe(\"via popup\", () => {\n test(\"with OOPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/ctx-add-init-script-oopif/\",\n { waitUntil: \"networkidle\" },\n );\n\n // Click link to open popup\n await page.locator(\"a\").click();\n debugLog(\"popup-oopif:clicked-link\", { openerUrl: page.url() });\n\n // Wait for popup to open and become active\n const popup = await waitForPopupPage(ctx, page);\n ctx.setActivePage(popup);\n await ensurePopupViewport(popup);\n await waitForPageUrl(\n popup,\n \"/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/\",\n );\n debugLog(\"popup-oopif:refresh-navigation\", { url: popup.url() });\n await popup.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/oopif-in-closed-shadow-dom/\",\n { waitUntil: \"networkidle\" },\n );\n await logPageDiagnostics(\n popup,\n \"popup-oopif:after-refresh\",\n \"shadow-host\",\n );\n await preparePopupForFrameAttach(popup, \"shadow-host\");\n const iframe = await waitForChildFrame(popup, OOPIF_CHILD_URL);\n\n // Check popup main page background\n const mainBgColor = await popup.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n\n test(\"with SPIF - sets background red in main page and iframe\", async () => {\n const page = await ctx.newPage();\n\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/ctx-add-init-script-spif/\",\n { waitUntil: \"networkidle\" },\n );\n\n // Click link to open popup\n await page.locator(\"a\").click();\n debugLog(\"popup-spif:clicked-link\", { openerUrl: page.url() });\n\n // Wait for popup to open and become active\n const popup = await waitForPopupPage(ctx, page);\n ctx.setActivePage(popup);\n await ensurePopupViewport(popup);\n await waitForPageUrl(\n popup,\n \"/stagehand-eval-sites/sites/closed-shadow-dom-in-spif/\",\n );\n await preparePopupForFrameAttach(popup, \"iframe\");\n const iframe = await waitForChildFrame(popup, POPUP_SPIF_CHILD_URL);\n\n // Check popup main page background\n const mainBgColor = await popup.mainFrame().evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(mainBgColor).toBe(\"rgb(255, 0, 0)\");\n\n const iframeBgColor = await iframe.evaluate(() => {\n return getComputedStyle(document.documentElement).backgroundColor;\n });\n expect(iframeBgColor).toBe(\"rgb(255, 0, 0)\");\n });\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|