@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.
- 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/lib/modelUtils.d.ts +0 -3
- package/dist/esm/lib/modelUtils.js +2 -7
- package/dist/esm/lib/modelUtils.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/cli.d.ts +2 -0
- package/dist/esm/lib/v3/cli.js +10 -0
- package/dist/esm/lib/v3/cli.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +1 -0
- package/dist/esm/lib/v3/index.js +1 -0
- package/dist/esm/lib/v3/index.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.d.ts +7 -5
- package/dist/esm/lib/v3/shutdown/supervisor.js +62 -52
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js +48 -52
- package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
- package/dist/esm/lib/v3/tests/click-count.spec.js +47 -12
- package/dist/esm/lib/v3/tests/click-count.spec.js.map +2 -2
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +67 -21
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +2 -2
- package/dist/esm/lib/v3/tests/v3.playwright.config.js +3 -60
- package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +2 -2
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -13
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.js +10 -1
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/locator.js +2 -2
- package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +2 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +10 -13
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/public-api/export-surface.test.js +1 -0
- package/dist/esm/tests/public-api/export-surface.test.js.map +2 -2
- package/package.json +13 -9
- package/dist/esm/lib/v3/tests/envReporter.js +0 -57
- package/dist/esm/lib/v3/tests/envReporter.js.map +0 -7
- package/dist/esm/tests/agent-execution-model.test.js +0 -139
- package/dist/esm/tests/agent-execution-model.test.js.map +0 -7
- package/dist/esm/tests/model-utils.test.js +0 -43
- package/dist/esm/tests/model-utils.test.js.map +0 -7
|
@@ -0,0 +1,147 @@
|
|
|
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 doubleClickFixtureUrl = `data:text/html,${encodeURIComponent(`<!DOCTYPE html>
|
|
5
|
+
<html>
|
|
6
|
+
<body>
|
|
7
|
+
<div id="target" style="width: 240px; height: 120px; border: 1px solid #000;">target</div>
|
|
8
|
+
<input id="clickCount" value="0" readonly />
|
|
9
|
+
<input id="dblClickCount" value="0" readonly />
|
|
10
|
+
<input id="lastClickDetail" value="0" readonly />
|
|
11
|
+
<input id="lastDblClickDetail" value="0" readonly />
|
|
12
|
+
<script>
|
|
13
|
+
const target = document.getElementById("target");
|
|
14
|
+
const clickCount = document.getElementById("clickCount");
|
|
15
|
+
const dblClickCount = document.getElementById("dblClickCount");
|
|
16
|
+
const lastClickDetail = document.getElementById("lastClickDetail");
|
|
17
|
+
const lastDblClickDetail = document.getElementById("lastDblClickDetail");
|
|
18
|
+
let clicks = 0;
|
|
19
|
+
let dblClicks = 0;
|
|
20
|
+
|
|
21
|
+
target.addEventListener("click", (event) => {
|
|
22
|
+
clicks += 1;
|
|
23
|
+
clickCount.value = String(clicks);
|
|
24
|
+
lastClickDetail.value = String(event.detail);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
target.addEventListener("dblclick", (event) => {
|
|
28
|
+
dblClicks += 1;
|
|
29
|
+
dblClickCount.value = String(dblClicks);
|
|
30
|
+
lastDblClickDetail.value = String(event.detail);
|
|
31
|
+
});
|
|
32
|
+
</script>
|
|
33
|
+
</body>
|
|
34
|
+
</html>`)}`;
|
|
35
|
+
import_test.test.describe("Locator and Page click methods", () => {
|
|
36
|
+
let v3;
|
|
37
|
+
import_test.test.beforeEach(async () => {
|
|
38
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
39
|
+
await v3.init();
|
|
40
|
+
});
|
|
41
|
+
import_test.test.afterEach(async () => {
|
|
42
|
+
await v3?.close?.().catch(() => {
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
(0, import_test.test)("locator.click() performs single click by default", async () => {
|
|
46
|
+
const page = v3.context.pages()[0];
|
|
47
|
+
await page.goto(
|
|
48
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
|
|
49
|
+
);
|
|
50
|
+
await page.waitForLoadState("domcontentloaded");
|
|
51
|
+
const countDisplay = page.locator("#count");
|
|
52
|
+
const initialCount = await countDisplay.inputValue();
|
|
53
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
54
|
+
const clickArea = page.locator("#textarea");
|
|
55
|
+
await clickArea.click();
|
|
56
|
+
const newCount = await countDisplay.inputValue();
|
|
57
|
+
(0, import_test.expect)(newCount).toBe("1");
|
|
58
|
+
});
|
|
59
|
+
(0, import_test.test)("locator.click() with clickCount: 2 performs double-click", async () => {
|
|
60
|
+
const page = v3.context.pages()[0];
|
|
61
|
+
await page.goto(doubleClickFixtureUrl);
|
|
62
|
+
await page.waitForLoadState("domcontentloaded");
|
|
63
|
+
const countDisplay = page.locator("#clickCount");
|
|
64
|
+
const dcCountDisplay = page.locator("#dblClickCount");
|
|
65
|
+
const clickDetailDisplay = page.locator("#lastClickDetail");
|
|
66
|
+
const dblClickDetailDisplay = page.locator("#lastDblClickDetail");
|
|
67
|
+
const initialCount = await countDisplay.inputValue();
|
|
68
|
+
const initialDcCount = await dcCountDisplay.inputValue();
|
|
69
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
70
|
+
(0, import_test.expect)(initialDcCount).toBe("0");
|
|
71
|
+
const clickArea = page.locator("#target");
|
|
72
|
+
await clickArea.click({ clickCount: 2 });
|
|
73
|
+
const newCount = await countDisplay.inputValue();
|
|
74
|
+
(0, import_test.expect)(newCount).toBe("2");
|
|
75
|
+
const newDcCount = await dcCountDisplay.inputValue();
|
|
76
|
+
(0, import_test.expect)(newDcCount).toBe("1");
|
|
77
|
+
(0, import_test.expect)(await clickDetailDisplay.inputValue()).toBe("2");
|
|
78
|
+
(0, import_test.expect)(await dblClickDetailDisplay.inputValue()).toBe("2");
|
|
79
|
+
});
|
|
80
|
+
(0, import_test.test)("locator.click() with clickCount: 3 performs triple-click", async () => {
|
|
81
|
+
const page = v3.context.pages()[0];
|
|
82
|
+
await page.goto(
|
|
83
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
|
|
84
|
+
);
|
|
85
|
+
await page.waitForLoadState("domcontentloaded");
|
|
86
|
+
const countDisplay = page.locator("#count");
|
|
87
|
+
const initialCount = await countDisplay.inputValue();
|
|
88
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
89
|
+
const clickArea = page.locator("#textarea");
|
|
90
|
+
await clickArea.click({ clickCount: 3 });
|
|
91
|
+
const newCount = await countDisplay.inputValue();
|
|
92
|
+
(0, import_test.expect)(newCount).toBe("3");
|
|
93
|
+
});
|
|
94
|
+
(0, import_test.test)("page.click() performs single click with coordinates", async () => {
|
|
95
|
+
const page = v3.context.pages()[0];
|
|
96
|
+
await page.goto(
|
|
97
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
|
|
98
|
+
);
|
|
99
|
+
await page.waitForLoadState("domcontentloaded");
|
|
100
|
+
const countDisplay = page.locator("#count");
|
|
101
|
+
const initialCount = await countDisplay.inputValue();
|
|
102
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
103
|
+
const clickArea = page.locator("#textarea");
|
|
104
|
+
const { x, y } = await clickArea.centroid();
|
|
105
|
+
await page.click(x, y);
|
|
106
|
+
const newCount = await countDisplay.inputValue();
|
|
107
|
+
(0, import_test.expect)(newCount).toBe("1");
|
|
108
|
+
});
|
|
109
|
+
(0, import_test.test)("page.click() with clickCount: 2 performs double-click", async () => {
|
|
110
|
+
const page = v3.context.pages()[0];
|
|
111
|
+
await page.goto(doubleClickFixtureUrl);
|
|
112
|
+
await page.waitForLoadState("domcontentloaded");
|
|
113
|
+
const countDisplay = page.locator("#clickCount");
|
|
114
|
+
const dcCountDisplay = page.locator("#dblClickCount");
|
|
115
|
+
const clickDetailDisplay = page.locator("#lastClickDetail");
|
|
116
|
+
const dblClickDetailDisplay = page.locator("#lastDblClickDetail");
|
|
117
|
+
const initialCount = await countDisplay.inputValue();
|
|
118
|
+
const initialDcCount = await dcCountDisplay.inputValue();
|
|
119
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
120
|
+
(0, import_test.expect)(initialDcCount).toBe("0");
|
|
121
|
+
const clickArea = page.locator("#target");
|
|
122
|
+
const { x, y } = await clickArea.centroid();
|
|
123
|
+
await page.click(x, y, { clickCount: 2 });
|
|
124
|
+
const newCount = await countDisplay.inputValue();
|
|
125
|
+
(0, import_test.expect)(newCount).toBe("2");
|
|
126
|
+
const newDcCount = await dcCountDisplay.inputValue();
|
|
127
|
+
(0, import_test.expect)(newDcCount).toBe("1");
|
|
128
|
+
(0, import_test.expect)(await clickDetailDisplay.inputValue()).toBe("2");
|
|
129
|
+
(0, import_test.expect)(await dblClickDetailDisplay.inputValue()).toBe("2");
|
|
130
|
+
});
|
|
131
|
+
(0, import_test.test)("page.click() with clickCount: 3 performs triple-click", async () => {
|
|
132
|
+
const page = v3.context.pages()[0];
|
|
133
|
+
await page.goto(
|
|
134
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/"
|
|
135
|
+
);
|
|
136
|
+
await page.waitForLoadState("domcontentloaded");
|
|
137
|
+
const countDisplay = page.locator("#count");
|
|
138
|
+
const initialCount = await countDisplay.inputValue();
|
|
139
|
+
(0, import_test.expect)(initialCount).toBe("0");
|
|
140
|
+
const clickArea = page.locator("#textarea");
|
|
141
|
+
const { x, y } = await clickArea.centroid();
|
|
142
|
+
await page.click(x, y, { clickCount: 3 });
|
|
143
|
+
const newCount = await countDisplay.inputValue();
|
|
144
|
+
(0, import_test.expect)(newCount).toBe("3");
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=click-count.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/click-count.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\n// Keep double-click verification event-based and deterministic.\n// Time-delta counters (Date.now() between mousedowns) are flaky at ms boundaries\n// and can miss valid double-clicks when synthetic input lands in the same millisecond.\nconst doubleClickFixtureUrl = `data:text/html,${encodeURIComponent(`<!DOCTYPE html>\n<html>\n <body>\n <div id=\"target\" style=\"width: 240px; height: 120px; border: 1px solid #000;\">target</div>\n <input id=\"clickCount\" value=\"0\" readonly />\n <input id=\"dblClickCount\" value=\"0\" readonly />\n <input id=\"lastClickDetail\" value=\"0\" readonly />\n <input id=\"lastDblClickDetail\" value=\"0\" readonly />\n <script>\n const target = document.getElementById(\"target\");\n const clickCount = document.getElementById(\"clickCount\");\n const dblClickCount = document.getElementById(\"dblClickCount\");\n const lastClickDetail = document.getElementById(\"lastClickDetail\");\n const lastDblClickDetail = document.getElementById(\"lastDblClickDetail\");\n let clicks = 0;\n let dblClicks = 0;\n\n target.addEventListener(\"click\", (event) => {\n clicks += 1;\n clickCount.value = String(clicks);\n lastClickDetail.value = String(event.detail);\n });\n\n target.addEventListener(\"dblclick\", (event) => {\n dblClicks += 1;\n dblClickCount.value = String(dblClicks);\n lastDblClickDetail.value = String(event.detail);\n });\n </script>\n </body>\n</html>`)}`;\n\ntest.describe(\"Locator and Page click methods\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"locator.click() performs single click by default\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform single click on the textarea (the clickable area)\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click();\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"locator.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(doubleClickFixtureUrl);\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#clickCount\");\n const dcCountDisplay = page.locator(\"#dblClickCount\");\n const clickDetailDisplay = page.locator(\"#lastClickDetail\");\n const dblClickDetailDisplay = page.locator(\"#lastDblClickDetail\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n const clickArea = page.locator(\"#target\");\n await clickArea.click({ clickCount: 2 });\n\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n // `dblclick` is the browser-level contract for double-click behavior.\n // Verifying `detail=2` ensures the click sequence is recognized as a true multi-click.\n expect(await clickDetailDisplay.inputValue()).toBe(\"2\");\n expect(await dblClickDetailDisplay.inputValue()).toBe(\"2\");\n });\n\n test(\"locator.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Perform triple-click on the textarea\n const clickArea = page.locator(\"#textarea\");\n await clickArea.click({ clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n\n test(\"page.click() performs single click with coordinates\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n // Get initial count\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform single click using page.click() with coordinates\n await page.click(x, y);\n\n // Verify count incremented by 1\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"1\");\n });\n\n test(\"page.click() with clickCount: 2 performs double-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(doubleClickFixtureUrl);\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#clickCount\");\n const dcCountDisplay = page.locator(\"#dblClickCount\");\n const clickDetailDisplay = page.locator(\"#lastClickDetail\");\n const dblClickDetailDisplay = page.locator(\"#lastDblClickDetail\");\n\n const initialCount = await countDisplay.inputValue();\n const initialDcCount = await dcCountDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n expect(initialDcCount).toBe(\"0\");\n\n const clickArea = page.locator(\"#target\");\n const { x, y } = await clickArea.centroid();\n\n await page.click(x, y, { clickCount: 2 });\n\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"2\");\n\n const newDcCount = await dcCountDisplay.inputValue();\n expect(newDcCount).toBe(\"1\");\n // `dblclick` is the browser-level contract for double-click behavior.\n // Verifying `detail=2` ensures the click sequence is recognized as a true multi-click.\n expect(await clickDetailDisplay.inputValue()).toBe(\"2\");\n expect(await dblClickDetailDisplay.inputValue()).toBe(\"2\");\n });\n\n test(\"page.click() with clickCount: 3 performs triple-click\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/click-test/\",\n );\n\n // Wait for page to be fully loaded\n await page.waitForLoadState(\"domcontentloaded\");\n\n const countDisplay = page.locator(\"#count\");\n const initialCount = await countDisplay.inputValue();\n expect(initialCount).toBe(\"0\");\n\n // Get the centroid of the textarea to click\n const clickArea = page.locator(\"#textarea\");\n const { x, y } = await clickArea.centroid();\n\n // Perform triple-click using page.click() with coordinates\n await page.click(x, y, { clickCount: 3 });\n\n // Verify count incremented by 3\n const newCount = await countDisplay.inputValue();\n expect(newCount).toBe(\"3\");\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
const PAGE_TARGET_COUNT = 5;
|
|
6
|
+
import_test.test.describe("connect to existing Browserbase session", () => {
|
|
7
|
+
(0, import_test.test)("new Stagehand instance reuses an existing Browserbase session", async () => {
|
|
8
|
+
const browserTarget = (process.env.STAGEHAND_BROWSER_TARGET ?? "local").toLowerCase();
|
|
9
|
+
const isBrowserbase = browserTarget === "browserbase";
|
|
10
|
+
import_test.test.skip(!isBrowserbase, "Requires STAGEHAND_BROWSER_TARGET=browserbase");
|
|
11
|
+
import_test.test.skip(
|
|
12
|
+
!process.env.BROWSERBASE_API_KEY || !process.env.BROWSERBASE_PROJECT_ID,
|
|
13
|
+
"BROWSERBASE credentials are required"
|
|
14
|
+
);
|
|
15
|
+
const initialStagehand = new import_v3.V3({
|
|
16
|
+
...import_v3_dynamic_config.v3DynamicTestConfig,
|
|
17
|
+
disableAPI: true
|
|
18
|
+
});
|
|
19
|
+
await initialStagehand.init();
|
|
20
|
+
let resumedStagehand = null;
|
|
21
|
+
try {
|
|
22
|
+
const ctx = initialStagehand.context;
|
|
23
|
+
const initialPage = ctx.pages()[0];
|
|
24
|
+
(0, import_test.expect)(initialPage).toBeDefined();
|
|
25
|
+
for (let i = 0; i < PAGE_TARGET_COUNT; i++) {
|
|
26
|
+
await ctx.newPage(`https://example.com/?tab=${i}`);
|
|
27
|
+
}
|
|
28
|
+
await initialPage?.close();
|
|
29
|
+
await import_test.expect.poll(() => ctx.pages().length, { timeout: 15e3 }).toBe(PAGE_TARGET_COUNT);
|
|
30
|
+
const sessionUrl = initialStagehand.connectURL();
|
|
31
|
+
(0, import_test.expect)(sessionUrl).toBeTruthy();
|
|
32
|
+
resumedStagehand = new import_v3.V3({
|
|
33
|
+
env: "LOCAL",
|
|
34
|
+
verbose: 0,
|
|
35
|
+
disablePino: true,
|
|
36
|
+
disableAPI: true,
|
|
37
|
+
logger: import_v3_dynamic_config.v3DynamicTestConfig.logger,
|
|
38
|
+
localBrowserLaunchOptions: {
|
|
39
|
+
cdpUrl: sessionUrl
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
await resumedStagehand.init();
|
|
43
|
+
await import_test.expect.poll(() => resumedStagehand.context.pages().length, {
|
|
44
|
+
timeout: 15e3
|
|
45
|
+
}).toBe(PAGE_TARGET_COUNT);
|
|
46
|
+
const resumedPagesCount = resumedStagehand.context.pages().length;
|
|
47
|
+
(0, import_test.expect)(resumedPagesCount).toBe(PAGE_TARGET_COUNT);
|
|
48
|
+
} finally {
|
|
49
|
+
await (0, import_testUtils.closeV3)(resumedStagehand);
|
|
50
|
+
await (0, import_testUtils.closeV3)(initialStagehand);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=connect-to-existing-browser.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/connect-to-existing-browser.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\nconst PAGE_TARGET_COUNT = 5;\n\ntest.describe(\"connect to existing Browserbase session\", () => {\n test(\"new Stagehand instance reuses an existing Browserbase session\", async () => {\n const browserTarget = (\n process.env.STAGEHAND_BROWSER_TARGET ?? \"local\"\n ).toLowerCase();\n const isBrowserbase = browserTarget === \"browserbase\";\n test.skip(!isBrowserbase, \"Requires STAGEHAND_BROWSER_TARGET=browserbase\");\n test.skip(\n !process.env.BROWSERBASE_API_KEY || !process.env.BROWSERBASE_PROJECT_ID,\n \"BROWSERBASE credentials are required\",\n );\n\n const initialStagehand = new V3({\n ...v3DynamicTestConfig,\n disableAPI: true,\n });\n await initialStagehand.init();\n\n let resumedStagehand: V3 | null = null;\n\n try {\n const ctx = initialStagehand.context;\n const initialPage = ctx.pages()[0];\n expect(initialPage).toBeDefined();\n\n for (let i = 0; i < PAGE_TARGET_COUNT; i++) {\n await ctx.newPage(`https://example.com/?tab=${i}`);\n }\n\n await initialPage?.close();\n await expect\n .poll(() => ctx.pages().length, { timeout: 15_000 })\n .toBe(PAGE_TARGET_COUNT);\n\n const sessionUrl = initialStagehand.connectURL();\n expect(sessionUrl).toBeTruthy();\n\n resumedStagehand = new V3({\n env: \"LOCAL\",\n verbose: 0,\n disablePino: true,\n disableAPI: true,\n logger: v3DynamicTestConfig.logger,\n localBrowserLaunchOptions: {\n cdpUrl: sessionUrl,\n },\n });\n await resumedStagehand.init();\n\n await expect\n .poll(() => resumedStagehand!.context.pages().length, {\n timeout: 15_000,\n })\n .toBe(PAGE_TARGET_COUNT);\n\n const resumedPagesCount = resumedStagehand.context.pages().length;\n expect(resumedPagesCount).toBe(PAGE_TARGET_COUNT);\n } finally {\n await closeV3(resumedStagehand);\n await closeV3(initialStagehand);\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,+BAAoC;AACpC,uBAAwB;AAExB,MAAM,oBAAoB;AAE1B,iBAAK,SAAS,2CAA2C,MAAM;AAC7D,wBAAK,iEAAiE,YAAY;AAChF,UAAM,iBACJ,QAAQ,IAAI,4BAA4B,SACxC,YAAY;AACd,UAAM,gBAAgB,kBAAkB;AACxC,qBAAK,KAAK,CAAC,eAAe,+CAA+C;AACzE,qBAAK;AAAA,MACH,CAAC,QAAQ,IAAI,uBAAuB,CAAC,QAAQ,IAAI;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,mBAAmB,IAAI,aAAG;AAAA,MAC9B,GAAG;AAAA,MACH,YAAY;AAAA,IACd,CAAC;AACD,UAAM,iBAAiB,KAAK;AAE5B,QAAI,mBAA8B;AAElC,QAAI;AACF,YAAM,MAAM,iBAAiB;AAC7B,YAAM,cAAc,IAAI,MAAM,EAAE,CAAC;AACjC,8BAAO,WAAW,EAAE,YAAY;AAEhC,eAAS,IAAI,GAAG,IAAI,mBAAmB,KAAK;AAC1C,cAAM,IAAI,QAAQ,4BAA4B,CAAC,EAAE;AAAA,MACnD;AAEA,YAAM,aAAa,MAAM;AACzB,YAAM,mBACH,KAAK,MAAM,IAAI,MAAM,EAAE,QAAQ,EAAE,SAAS,KAAO,CAAC,EAClD,KAAK,iBAAiB;AAEzB,YAAM,aAAa,iBAAiB,WAAW;AAC/C,8BAAO,UAAU,EAAE,WAAW;AAE9B,yBAAmB,IAAI,aAAG;AAAA,QACxB,KAAK;AAAA,QACL,SAAS;AAAA,QACT,aAAa;AAAA,QACb,YAAY;AAAA,QACZ,QAAQ,6CAAoB;AAAA,QAC5B,2BAA2B;AAAA,UACzB,QAAQ;AAAA,QACV;AAAA,MACF,CAAC;AACD,YAAM,iBAAiB,KAAK;AAE5B,YAAM,mBACH,KAAK,MAAM,iBAAkB,QAAQ,MAAM,EAAE,QAAQ;AAAA,QACpD,SAAS;AAAA,MACX,CAAC,EACA,KAAK,iBAAiB;AAEzB,YAAM,oBAAoB,iBAAiB,QAAQ,MAAM,EAAE;AAC3D,8BAAO,iBAAiB,EAAE,KAAK,iBAAiB;AAAA,IAClD,UAAE;AACA,gBAAM,0BAAQ,gBAAgB;AAC9B,gBAAM,0BAAQ,gBAAgB;AAAA,IAChC;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
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 toDataUrl = (html) => `data:text/html,${encodeURIComponent(html)}`;
|
|
5
|
+
import_test.test.describe("context.addInitScript", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
let ctx;
|
|
8
|
+
import_test.test.beforeEach(async () => {
|
|
9
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
10
|
+
await v3.init();
|
|
11
|
+
ctx = v3.context;
|
|
12
|
+
});
|
|
13
|
+
import_test.test.afterEach(async () => {
|
|
14
|
+
await v3?.close?.().catch(() => {
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
(0, import_test.test)("runs before inline document scripts on navigation", async () => {
|
|
18
|
+
const page = await ctx.awaitActivePage();
|
|
19
|
+
await ctx.addInitScript(() => {
|
|
20
|
+
window.__fromContextInit = "injected-value";
|
|
21
|
+
});
|
|
22
|
+
const html = `<!DOCTYPE html>
|
|
23
|
+
<html>
|
|
24
|
+
<body>
|
|
25
|
+
<script>
|
|
26
|
+
var value = (window && window.__fromContextInit) || 'missing';
|
|
27
|
+
document.body.dataset.initWitness = value;
|
|
28
|
+
</script>
|
|
29
|
+
</body>
|
|
30
|
+
</html>`;
|
|
31
|
+
await page.goto(toDataUrl(html), { waitUntil: "load" });
|
|
32
|
+
const observed = await page.evaluate(() => {
|
|
33
|
+
return document.body.dataset.initWitness;
|
|
34
|
+
});
|
|
35
|
+
(0, import_test.expect)(observed).toBe("injected-value");
|
|
36
|
+
});
|
|
37
|
+
(0, import_test.test)("re-applies the script on every navigation for the same page", async () => {
|
|
38
|
+
const page = await ctx.awaitActivePage();
|
|
39
|
+
await ctx.addInitScript(`
|
|
40
|
+
(function () {
|
|
41
|
+
function markVisit() {
|
|
42
|
+
var root = document.documentElement;
|
|
43
|
+
if (!root) return;
|
|
44
|
+
var current = Number(window.name || "0");
|
|
45
|
+
var next = current + 1;
|
|
46
|
+
window.name = String(next);
|
|
47
|
+
root.dataset.visitCount = String(next);
|
|
48
|
+
}
|
|
49
|
+
if (document.readyState === "loading") {
|
|
50
|
+
document.addEventListener("DOMContentLoaded", markVisit, {
|
|
51
|
+
once: true,
|
|
52
|
+
});
|
|
53
|
+
} else {
|
|
54
|
+
markVisit();
|
|
55
|
+
}
|
|
56
|
+
})();
|
|
57
|
+
`);
|
|
58
|
+
await page.goto(toDataUrl("<html><body>first</body></html>"), {
|
|
59
|
+
waitUntil: "load"
|
|
60
|
+
});
|
|
61
|
+
const first = await page.evaluate(() => {
|
|
62
|
+
return Number(document.documentElement.dataset.visitCount ?? "0");
|
|
63
|
+
});
|
|
64
|
+
(0, import_test.expect)(first).toBe(1);
|
|
65
|
+
await page.goto(toDataUrl("<html><body>second</body></html>"), {
|
|
66
|
+
waitUntil: "load"
|
|
67
|
+
});
|
|
68
|
+
const second = await page.evaluate(() => {
|
|
69
|
+
return Number(document.documentElement.dataset.visitCount ?? "0");
|
|
70
|
+
});
|
|
71
|
+
(0, import_test.expect)(second).toBe(2);
|
|
72
|
+
});
|
|
73
|
+
(0, import_test.test)("applies script (with args) to newly created pages", async () => {
|
|
74
|
+
const payload = { greeting: "hi", nested: { count: 2 } };
|
|
75
|
+
const initPayload = (arg) => {
|
|
76
|
+
function setPayload() {
|
|
77
|
+
const root = document.documentElement;
|
|
78
|
+
if (!root) return;
|
|
79
|
+
root.dataset.initPayload = JSON.stringify(arg);
|
|
80
|
+
}
|
|
81
|
+
if (document.readyState === "loading") {
|
|
82
|
+
document.addEventListener("DOMContentLoaded", setPayload, {
|
|
83
|
+
once: true
|
|
84
|
+
});
|
|
85
|
+
} else {
|
|
86
|
+
setPayload();
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
await ctx.addInitScript(initPayload, payload);
|
|
90
|
+
const newPage = await ctx.newPage();
|
|
91
|
+
await newPage.goto(toDataUrl("<html><body>child</body></html>"), {
|
|
92
|
+
waitUntil: "load"
|
|
93
|
+
});
|
|
94
|
+
const observed = await newPage.evaluate(() => {
|
|
95
|
+
const raw = document.documentElement.dataset.initPayload;
|
|
96
|
+
return raw ? JSON.parse(raw) : void 0;
|
|
97
|
+
});
|
|
98
|
+
(0, import_test.expect)(observed).toEqual(payload);
|
|
99
|
+
});
|
|
100
|
+
(0, import_test.test)("applies script to newPage(url) on initial document", async () => {
|
|
101
|
+
const payload = { marker: "newPageUrl" };
|
|
102
|
+
await ctx.addInitScript((arg) => {
|
|
103
|
+
function setPayload() {
|
|
104
|
+
const root = document.documentElement;
|
|
105
|
+
if (!root) return;
|
|
106
|
+
root.dataset.initPayload = JSON.stringify(arg);
|
|
107
|
+
}
|
|
108
|
+
if (document.readyState === "loading") {
|
|
109
|
+
document.addEventListener("DOMContentLoaded", setPayload, {
|
|
110
|
+
once: true
|
|
111
|
+
});
|
|
112
|
+
} else {
|
|
113
|
+
setPayload();
|
|
114
|
+
}
|
|
115
|
+
}, payload);
|
|
116
|
+
const newPage = await ctx.newPage(
|
|
117
|
+
toDataUrl("<html><body>new page</body></html>")
|
|
118
|
+
);
|
|
119
|
+
await newPage.waitForLoadState("load");
|
|
120
|
+
const observed = await newPage.evaluate(() => {
|
|
121
|
+
const raw = document.documentElement.dataset.initPayload;
|
|
122
|
+
return raw ? JSON.parse(raw) : void 0;
|
|
123
|
+
});
|
|
124
|
+
(0, import_test.expect)(observed).toEqual(payload);
|
|
125
|
+
});
|
|
126
|
+
(0, import_test.test)("applies script to pages opened via link clicks", async () => {
|
|
127
|
+
const payload = { marker: "linkClick" };
|
|
128
|
+
await ctx.addInitScript((arg) => {
|
|
129
|
+
function setPayload() {
|
|
130
|
+
const root = document.documentElement;
|
|
131
|
+
if (!root) return;
|
|
132
|
+
root.dataset.initPayload = JSON.stringify(arg);
|
|
133
|
+
}
|
|
134
|
+
if (document.readyState === "loading") {
|
|
135
|
+
document.addEventListener("DOMContentLoaded", setPayload, {
|
|
136
|
+
once: true
|
|
137
|
+
});
|
|
138
|
+
} else {
|
|
139
|
+
setPayload();
|
|
140
|
+
}
|
|
141
|
+
}, payload);
|
|
142
|
+
const popupUrl = toDataUrl("<html><body>popup</body></html>");
|
|
143
|
+
const openerHtml = '<!DOCTYPE html><html><body><a id="open" target="_blank" href="' + popupUrl + '">open</a></body></html>';
|
|
144
|
+
const opener = await ctx.awaitActivePage();
|
|
145
|
+
await opener.goto(toDataUrl(openerHtml), { waitUntil: "load" });
|
|
146
|
+
await opener.locator("#open").click();
|
|
147
|
+
const openerId = opener.targetId();
|
|
148
|
+
const deadline = Date.now() + 2e3;
|
|
149
|
+
let popup = ctx.pages().find((p) => p.targetId() !== openerId);
|
|
150
|
+
while (!popup && Date.now() < deadline) {
|
|
151
|
+
await opener.waitForTimeout(25);
|
|
152
|
+
popup = ctx.pages().find((p) => p.targetId() !== openerId);
|
|
153
|
+
}
|
|
154
|
+
if (!popup) {
|
|
155
|
+
throw new Error("Popup page was not created");
|
|
156
|
+
}
|
|
157
|
+
await popup.waitForLoadState("load");
|
|
158
|
+
const observed = await popup.evaluate(() => {
|
|
159
|
+
const raw = document.documentElement.dataset.initPayload;
|
|
160
|
+
return raw ? JSON.parse(raw) : void 0;
|
|
161
|
+
});
|
|
162
|
+
(0, import_test.expect)(observed).toEqual(payload);
|
|
163
|
+
});
|
|
164
|
+
(0, import_test.test)("context.addInitScript installs a function callable from page.evaluate", async () => {
|
|
165
|
+
const page = await ctx.awaitActivePage();
|
|
166
|
+
await ctx.addInitScript(() => {
|
|
167
|
+
window.sayHelloFromStagehand = () => "hello from stagehand";
|
|
168
|
+
});
|
|
169
|
+
await page.goto("https://example.com", { waitUntil: "domcontentloaded" });
|
|
170
|
+
const result = await page.evaluate(() => {
|
|
171
|
+
return window.sayHelloFromStagehand();
|
|
172
|
+
});
|
|
173
|
+
(0, import_test.expect)(result).toBe("hello from stagehand");
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
//# sourceMappingURL=context-addInitScript.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/context-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\";\n\nconst toDataUrl = (html: string): string =>\n `data:text/html,${encodeURIComponent(html)}`;\n\ntest.describe(\"context.addInitScript\", () => {\n let v3: V3;\n let ctx: V3Context;\n\n test.beforeEach(async () => {\n v3 = new V3(v3TestConfig);\n await v3.init();\n ctx = v3.context;\n });\n\n test.afterEach(async () => {\n await v3?.close?.().catch(() => {});\n });\n\n test(\"runs before inline document scripts on navigation\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(() => {\n (window as unknown as { __fromContextInit?: string }).__fromContextInit =\n \"injected-value\";\n });\n\n const html = `<!DOCTYPE html>\n <html>\n <body>\n <script>\n var value = (window && window.__fromContextInit) || 'missing';\n document.body.dataset.initWitness = value;\n </script>\n </body>\n </html>`;\n\n await page.goto(toDataUrl(html), { waitUntil: \"load\" });\n\n const observed = await page.evaluate(() => {\n return document.body.dataset.initWitness;\n });\n expect(observed).toBe(\"injected-value\");\n });\n\n test(\"re-applies the script on every navigation for the same page\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(`\n (function () {\n function markVisit() {\n var root = document.documentElement;\n if (!root) return;\n var current = Number(window.name || \"0\");\n var next = current + 1;\n window.name = String(next);\n root.dataset.visitCount = String(next);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", markVisit, {\n once: true,\n });\n } else {\n markVisit();\n }\n })();\n `);\n\n await page.goto(toDataUrl(\"<html><body>first</body></html>\"), {\n waitUntil: \"load\",\n });\n const first = await page.evaluate(() => {\n return Number(document.documentElement.dataset.visitCount ?? \"0\");\n });\n expect(first).toBe(1);\n\n await page.goto(toDataUrl(\"<html><body>second</body></html>\"), {\n waitUntil: \"load\",\n });\n const second = await page.evaluate(() => {\n return Number(document.documentElement.dataset.visitCount ?? \"0\");\n });\n expect(second).toBe(2);\n });\n\n test(\"applies script (with args) to newly created pages\", async () => {\n const payload = { greeting: \"hi\", nested: { count: 2 } };\n\n const initPayload = ((arg) => {\n function setPayload() {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }) as (arg: typeof payload) => void;\n await ctx.addInitScript(initPayload, payload);\n\n const newPage = await ctx.newPage();\n await newPage.goto(toDataUrl(\"<html><body>child</body></html>\"), {\n waitUntil: \"load\",\n });\n\n const observed = await newPage.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"applies script to newPage(url) on initial document\", async () => {\n const payload = { marker: \"newPageUrl\" };\n\n await ctx.addInitScript((arg) => {\n function setPayload(): void {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }, payload);\n\n const newPage = await ctx.newPage(\n toDataUrl(\"<html><body>new page</body></html>\"),\n );\n await newPage.waitForLoadState(\"load\");\n\n const observed = await newPage.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"applies script to pages opened via link clicks\", async () => {\n const payload = { marker: \"linkClick\" };\n\n await ctx.addInitScript((arg) => {\n function setPayload(): void {\n const root = document.documentElement;\n if (!root) return;\n root.dataset.initPayload = JSON.stringify(arg);\n }\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", setPayload, {\n once: true,\n });\n } else {\n setPayload();\n }\n }, payload);\n\n const popupUrl = toDataUrl(\"<html><body>popup</body></html>\");\n const openerHtml =\n \"<!DOCTYPE html>\" +\n \"<html><body>\" +\n '<a id=\"open\" target=\"_blank\" href=\"' +\n popupUrl +\n '\">open</a>' +\n \"</body></html>\";\n\n const opener = await ctx.awaitActivePage();\n await opener.goto(toDataUrl(openerHtml), { waitUntil: \"load\" });\n await opener.locator(\"#open\").click();\n\n const openerId = opener.targetId();\n const deadline = Date.now() + 2000;\n let popup = ctx.pages().find((p) => p.targetId() !== openerId);\n while (!popup && Date.now() < deadline) {\n await opener.waitForTimeout(25);\n popup = ctx.pages().find((p) => p.targetId() !== openerId);\n }\n if (!popup) {\n throw new Error(\"Popup page was not created\");\n }\n\n await popup.waitForLoadState(\"load\");\n\n const observed = await popup.evaluate(() => {\n const raw = document.documentElement.dataset.initPayload;\n return raw ? JSON.parse(raw) : undefined;\n });\n expect(observed).toEqual(payload);\n });\n\n test(\"context.addInitScript installs a function callable from page.evaluate\", async () => {\n const page = await ctx.awaitActivePage();\n\n await ctx.addInitScript(() => {\n // installed before any navigation\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n window.sayHelloFromStagehand = () => \"hello from stagehand\";\n });\n\n await page.goto(\"https://example.com\", { waitUntil: \"domcontentloaded\" });\n\n const result = await page.evaluate(() => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n return window.sayHelloFromStagehand();\n });\n\n expect(result).toBe(\"hello from stagehand\");\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
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: "parallel" });
|
|
6
|
+
import_test.test.describe("V3 default page tracking", () => {
|
|
7
|
+
let v3;
|
|
8
|
+
import_test.test.beforeEach(async () => {
|
|
9
|
+
v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
|
|
10
|
+
await v3.init();
|
|
11
|
+
});
|
|
12
|
+
import_test.test.afterEach(async () => {
|
|
13
|
+
await (0, import_testUtils.closeV3)(v3);
|
|
14
|
+
});
|
|
15
|
+
(0, import_test.test)("activePage points to initial page", async () => {
|
|
16
|
+
const ctx = v3.context;
|
|
17
|
+
const pages = ctx.pages();
|
|
18
|
+
(0, import_test.expect)(pages.length).toBeGreaterThanOrEqual(1);
|
|
19
|
+
const active = ctx.activePage();
|
|
20
|
+
(0, import_test.expect)(active).toBeTruthy();
|
|
21
|
+
(0, import_test.expect)(active.mainFrameId().length).toBeGreaterThan(0);
|
|
22
|
+
});
|
|
23
|
+
(0, import_test.test)("activePage switches to most recent top-level page and reverts on close", async () => {
|
|
24
|
+
const ctx = v3.context;
|
|
25
|
+
const newPage = await ctx.newPage("https://example.com/");
|
|
26
|
+
const activeAfterCreate = await ctx.awaitActivePage();
|
|
27
|
+
(0, import_test.expect)(activeAfterCreate.url()).toContain(newPage.url());
|
|
28
|
+
});
|
|
29
|
+
(0, import_test.test)("popup default-page flow via five-tab site", async () => {
|
|
30
|
+
const ctx = v3.context;
|
|
31
|
+
const root = await ctx.awaitActivePage();
|
|
32
|
+
await root.goto(
|
|
33
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/",
|
|
34
|
+
{ waitUntil: "load", timeoutMs: 15e3 }
|
|
35
|
+
);
|
|
36
|
+
await root.locator("xpath=/html/body/button").click();
|
|
37
|
+
const page2 = await ctx.awaitActivePage();
|
|
38
|
+
(0, import_test.expect)(page2.url()).toBe(
|
|
39
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page2.html"
|
|
40
|
+
);
|
|
41
|
+
await page2.locator("xpath=/html/body/button").click();
|
|
42
|
+
const page3 = await ctx.awaitActivePage();
|
|
43
|
+
(0, import_test.expect)(page3.url()).toBe(
|
|
44
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page3.html"
|
|
45
|
+
);
|
|
46
|
+
await page3.close();
|
|
47
|
+
const backToPage2 = await ctx.awaitActivePage();
|
|
48
|
+
(0, import_test.expect)(backToPage2.url()).toBe(
|
|
49
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page2.html"
|
|
50
|
+
);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
//# sourceMappingURL=default-page-tracking.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/default-page-tracking.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe.configure({ mode: \"parallel\" });\ntest.describe(\"V3 default page tracking\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"activePage points to initial page\", async () => {\n const ctx = v3.context;\n // Should have at least one top-level page\n const pages = ctx.pages();\n expect(pages.length).toBeGreaterThanOrEqual(1);\n const active = ctx.activePage();\n expect(active).toBeTruthy();\n // mainFrameId should be a non-empty string\n expect(active!.mainFrameId().length).toBeGreaterThan(0);\n });\n\n test(\"activePage switches to most recent top-level page and reverts on close\", async () => {\n const ctx = v3.context;\n const newPage = await ctx.newPage(\"https://example.com/\");\n\n const activeAfterCreate = await ctx.awaitActivePage();\n expect(activeAfterCreate.url()).toContain(newPage.url());\n });\n\n test(\"popup default-page flow via five-tab site\", async () => {\n const ctx = v3.context;\n\n // 1) Navigate the default page to the site\n const root = await ctx.awaitActivePage();\n await root!.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/\",\n { waitUntil: \"load\", timeoutMs: 15000 },\n );\n // 2) Click button on the page to open a new tab \u2192 page2.html\n await root.locator(\"xpath=/html/body/button\").click();\n const page2 = await ctx.awaitActivePage();\n expect(page2!.url()).toBe(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page2.html\",\n );\n\n // 3) On the default page (now page2), click its button \u2192 open page3 popup\n\n await page2.locator(\"xpath=/html/body/button\").click();\n const page3 = await ctx.awaitActivePage();\n expect(page3!.url()).toBe(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page3.html\",\n );\n\n // 4) Close the current page (page3) and ensure the default page reverts to page2\n await page3!.close();\n const backToPage2 = await ctx.awaitActivePage();\n expect(backToPage2!.url()).toBe(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/five-tab/page2.html\",\n );\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,+BAAoC;AACpC,uBAAwB;AAExB,iBAAK,SAAS,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,iBAAK,SAAS,4BAA4B,MAAM;AAC9C,MAAI;AAEJ,mBAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,aAAG,4CAAmB;AAC/B,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,mBAAK,UAAU,YAAY;AACzB,cAAM,0BAAQ,EAAE;AAAA,EAClB,CAAC;AAED,wBAAK,qCAAqC,YAAY;AACpD,UAAM,MAAM,GAAG;AAEf,UAAM,QAAQ,IAAI,MAAM;AACxB,4BAAO,MAAM,MAAM,EAAE,uBAAuB,CAAC;AAC7C,UAAM,SAAS,IAAI,WAAW;AAC9B,4BAAO,MAAM,EAAE,WAAW;AAE1B,4BAAO,OAAQ,YAAY,EAAE,MAAM,EAAE,gBAAgB,CAAC;AAAA,EACxD,CAAC;AAED,wBAAK,0EAA0E,YAAY;AACzF,UAAM,MAAM,GAAG;AACf,UAAM,UAAU,MAAM,IAAI,QAAQ,sBAAsB;AAExD,UAAM,oBAAoB,MAAM,IAAI,gBAAgB;AACpD,4BAAO,kBAAkB,IAAI,CAAC,EAAE,UAAU,QAAQ,IAAI,CAAC;AAAA,EACzD,CAAC;AAED,wBAAK,6CAA6C,YAAY;AAC5D,UAAM,MAAM,GAAG;AAGf,UAAM,OAAO,MAAM,IAAI,gBAAgB;AACvC,UAAM,KAAM;AAAA,MACV;AAAA,MACA,EAAE,WAAW,QAAQ,WAAW,KAAM;AAAA,IACxC;AAEA,UAAM,KAAK,QAAQ,yBAAyB,EAAE,MAAM;AACpD,UAAM,QAAQ,MAAM,IAAI,gBAAgB;AACxC,4BAAO,MAAO,IAAI,CAAC,EAAE;AAAA,MACnB;AAAA,IACF;AAIA,UAAM,MAAM,QAAQ,yBAAyB,EAAE,MAAM;AACrD,UAAM,QAAQ,MAAM,IAAI,gBAAgB;AACxC,4BAAO,MAAO,IAAI,CAAC,EAAE;AAAA,MACnB;AAAA,IACF;AAGA,UAAM,MAAO,MAAM;AACnB,UAAM,cAAc,MAAM,IAAI,gBAAgB;AAC9C,4BAAO,YAAa,IAAI,CAAC,EAAE;AAAA,MACzB;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __copyProps = (to, from, except, desc) => {
|
|
8
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
9
|
+
for (let key of __getOwnPropNames(from))
|
|
10
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
11
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
12
|
+
}
|
|
13
|
+
return to;
|
|
14
|
+
};
|
|
15
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
16
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
17
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
18
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
19
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
|
+
mod
|
|
22
|
+
));
|
|
23
|
+
var import_test = require("@playwright/test");
|
|
24
|
+
var import_v3 = require("../v3.js");
|
|
25
|
+
var import_sdk = __toESM(require("@browserbasehq/sdk"), 1);
|
|
26
|
+
var import_adm_zip = __toESM(require("adm-zip"), 1);
|
|
27
|
+
var import_v3_dynamic_config = require("./v3.dynamic.config.js");
|
|
28
|
+
var import_testUtils = require("./testUtils.js");
|
|
29
|
+
const pdfRe = /sample-(\d{13})+\.pdf/;
|
|
30
|
+
import_test.test.describe("downloads on browserbase", () => {
|
|
31
|
+
let v3;
|
|
32
|
+
import_test.test.beforeEach(async () => {
|
|
33
|
+
v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
|
|
34
|
+
await v3.init();
|
|
35
|
+
});
|
|
36
|
+
import_test.test.afterEach(async () => {
|
|
37
|
+
await (0, import_testUtils.closeV3)(v3);
|
|
38
|
+
});
|
|
39
|
+
(0, import_test.test)("downloaded pdf is available via downloads api", async () => {
|
|
40
|
+
const browserTarget = (process.env.STAGEHAND_BROWSER_TARGET ?? "local").toLowerCase();
|
|
41
|
+
const isBrowserbase = browserTarget === "browserbase";
|
|
42
|
+
import_test.test.skip(
|
|
43
|
+
!isBrowserbase,
|
|
44
|
+
"Skipping Browserbase-only downloads test in LOCAL mode"
|
|
45
|
+
);
|
|
46
|
+
import_test.test.skip(
|
|
47
|
+
!process.env.BROWSERBASE_API_KEY,
|
|
48
|
+
"Skipping test: BROWSERBASE_API_KEY not set"
|
|
49
|
+
);
|
|
50
|
+
const page = v3.context.pages()[0];
|
|
51
|
+
await page.goto(
|
|
52
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/download-on-click/"
|
|
53
|
+
);
|
|
54
|
+
await page.locator("/html/body/button").click();
|
|
55
|
+
await (0, import_test.expect)(async () => {
|
|
56
|
+
const bb = new import_sdk.default();
|
|
57
|
+
const zipBuffer = await bb.sessions.downloads.list(
|
|
58
|
+
v3.browserbaseSessionId
|
|
59
|
+
);
|
|
60
|
+
if (!zipBuffer) {
|
|
61
|
+
throw new Error(
|
|
62
|
+
`Download buffer is empty for session ${v3.browserbaseSessionId}`
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
const zip = new import_adm_zip.default(Buffer.from(await zipBuffer.arrayBuffer()));
|
|
66
|
+
const zipEntries = zip.getEntries();
|
|
67
|
+
const pdfEntry = zipEntries.find((entry) => pdfRe.test(entry.entryName));
|
|
68
|
+
if (!pdfEntry) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Session ${v3.browserbaseSessionId} is missing a file matching "${pdfRe.toString()}" in its zip entries: ${JSON.stringify(zipEntries.map((entry) => entry.entryName))}`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
const expectedFileSize = 13264;
|
|
74
|
+
(0, import_test.expect)(pdfEntry.header.size).toBe(expectedFileSize);
|
|
75
|
+
}).toPass({
|
|
76
|
+
timeout: 3e4
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=downloads.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/downloads.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport Browserbase from \"@browserbasehq/sdk\";\nimport AdmZip from \"adm-zip\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\nconst pdfRe = /sample-(\\d{13})+\\.pdf/;\ntest.describe(\"downloads on browserbase\", () => {\n let v3: V3;\n\n test.beforeEach(async () => {\n v3 = new V3(v3DynamicTestConfig);\n await v3.init();\n });\n\n test.afterEach(async () => {\n await closeV3(v3);\n });\n\n test(\"downloaded pdf is available via downloads api\", async () => {\n const browserTarget = (\n process.env.STAGEHAND_BROWSER_TARGET ?? \"local\"\n ).toLowerCase();\n const isBrowserbase = browserTarget === \"browserbase\";\n // Skip this test in LOCAL mode as it requires Browserbase session\n test.skip(\n !isBrowserbase,\n \"Skipping Browserbase-only downloads test in LOCAL mode\",\n );\n\n // Skip if BROWSERBASE_API_KEY is not set\n test.skip(\n !process.env.BROWSERBASE_API_KEY,\n \"Skipping test: BROWSERBASE_API_KEY not set\",\n );\n\n // Tiny timeout to force the race to hit the timeout branch\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/download-on-click/\",\n );\n await page.locator(\"/html/body/button\").click();\n\n await expect(async () => {\n const bb = new Browserbase();\n const zipBuffer = await bb.sessions.downloads.list(\n v3.browserbaseSessionId,\n );\n if (!zipBuffer) {\n throw new Error(\n `Download buffer is empty for session ${v3.browserbaseSessionId}`,\n );\n }\n\n const zip = new AdmZip(Buffer.from(await zipBuffer.arrayBuffer()));\n const zipEntries = zip.getEntries();\n const pdfEntry = zipEntries.find((entry) => pdfRe.test(entry.entryName));\n\n if (!pdfEntry) {\n throw new Error(\n `Session ${v3.browserbaseSessionId} is missing a file matching \"${pdfRe.toString()}\" in its zip entries: ${JSON.stringify(zipEntries.map((entry) => entry.entryName))}`,\n );\n }\n\n const expectedFileSize = 13264;\n expect(pdfEntry.header.size).toBe(expectedFileSize);\n }).toPass({\n timeout: 30_000,\n });\n });\n});\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,iBAAwB;AACxB,qBAAmB;AACnB,+BAAoC;AACpC,uBAAwB;AAExB,MAAM,QAAQ;AACd,iBAAK,SAAS,4BAA4B,MAAM;AAC9C,MAAI;AAEJ,mBAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,aAAG,4CAAmB;AAC/B,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,mBAAK,UAAU,YAAY;AACzB,cAAM,0BAAQ,EAAE;AAAA,EAClB,CAAC;AAED,wBAAK,iDAAiD,YAAY;AAChE,UAAM,iBACJ,QAAQ,IAAI,4BAA4B,SACxC,YAAY;AACd,UAAM,gBAAgB,kBAAkB;AAExC,qBAAK;AAAA,MACH,CAAC;AAAA,MACD;AAAA,IACF;AAGA,qBAAK;AAAA,MACH,CAAC,QAAQ,IAAI;AAAA,MACb;AAAA,IACF;AAGA,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AACA,UAAM,KAAK,QAAQ,mBAAmB,EAAE,MAAM;AAE9C,cAAM,oBAAO,YAAY;AACvB,YAAM,KAAK,IAAI,WAAAA,QAAY;AAC3B,YAAM,YAAY,MAAM,GAAG,SAAS,UAAU;AAAA,QAC5C,GAAG;AAAA,MACL;AACA,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR,wCAAwC,GAAG,oBAAoB;AAAA,QACjE;AAAA,MACF;AAEA,YAAM,MAAM,IAAI,eAAAC,QAAO,OAAO,KAAK,MAAM,UAAU,YAAY,CAAC,CAAC;AACjE,YAAM,aAAa,IAAI,WAAW;AAClC,YAAM,WAAW,WAAW,KAAK,CAAC,UAAU,MAAM,KAAK,MAAM,SAAS,CAAC;AAEvE,UAAI,CAAC,UAAU;AACb,cAAM,IAAI;AAAA,UACR,WAAW,GAAG,oBAAoB,gCAAgC,MAAM,SAAS,CAAC,yBAAyB,KAAK,UAAU,WAAW,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,CAAC;AAAA,QACvK;AAAA,MACF;AAEA,YAAM,mBAAmB;AACzB,8BAAO,SAAS,OAAO,IAAI,EAAE,KAAK,gBAAgB;AAAA,IACpD,CAAC,EAAE,OAAO;AAAA,MACR,SAAS;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": ["Browserbase", "AdmZip"]
|
|
7
|
+
}
|