@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,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/keep-alive.helpers.ts"],
|
|
4
|
+
"sourcesContent": ["import { spawn } from \"node:child_process\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport Browserbase from \"@browserbasehq/sdk\";\nimport WebSocket from \"ws\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\n\nexport type EnvKind = \"LOCAL\" | \"BROWSERBASE\";\nexport type ScenarioKind = \"unhandled\" | \"close\" | \"sigterm\" | \"sigint\";\n\nexport type KeepAliveCase = {\n title: string;\n env: EnvKind;\n envLabel: string;\n keepAlive: boolean;\n disableAPI: boolean;\n kind: ScenarioKind;\n requiresBrowserbase: boolean;\n};\n\ntype ScenarioConfig = {\n env: EnvKind;\n keepAlive: boolean;\n disableAPI: boolean;\n kind: ScenarioKind;\n debug: boolean;\n viewMs: number;\n apiKey?: string;\n projectId?: string;\n};\n\ntype ChildInfo = {\n connectURL: string;\n sessionId: string | null;\n};\n\ntype ChildLogs = {\n stdout: string[];\n stderr: string[];\n};\n\ntype CheckResult = {\n alive: boolean;\n status?: string;\n};\n\ntype Outcome = {\n expected: \"open\" | \"closed\";\n actual: \"open\" | \"closed\";\n durationMs: number;\n lastStatus?: string;\n};\n\nconst testsDir = path.dirname(fileURLToPath(import.meta.url));\nconst findCoreDir = (startDir: string): string => {\n let current = path.resolve(startDir);\n while (true) {\n const packageJsonPath = path.join(current, \"package.json\");\n if (fs.existsSync(packageJsonPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, \"utf8\")) as {\n name?: string;\n };\n if (pkg.name === \"@browserbasehq/stagehand\") {\n return current;\n }\n } catch {\n // keep climbing until we find the core package root\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n return path.resolve(startDir, \"../../..\");\n }\n current = parent;\n }\n};\n\nconst coreDir = findCoreDir(testsDir);\n\nconst resolveChildRunner = (): { command: string; args: string[] } | null => {\n const distJsPath = path.join(\n coreDir,\n \"dist\",\n \"esm\",\n \"lib\",\n \"v3\",\n \"tests\",\n \"keep-alive.child.js\",\n );\n if (fs.existsSync(distJsPath)) {\n return { command: process.execPath, args: [distJsPath] };\n }\n\n return null;\n};\n\nconst childRunner = resolveChildRunner();\n\nconst DEBUG = process.env.KEEP_ALIVE_DEBUG === \"1\";\nconst VIEW_MS = Number(process.env.KEEP_ALIVE_VIEW_MS ?? \"0\");\nconst LOCAL_TIMEOUT_MS = Number(\n process.env.KEEP_ALIVE_LOCAL_TIMEOUT_MS ?? \"8000\",\n);\nconst BB_TIMEOUT_MS = Number(process.env.KEEP_ALIVE_BB_TIMEOUT_MS ?? \"30000\");\nconst STAY_OPEN_MS = Number(process.env.KEEP_ALIVE_STAY_OPEN_MS ?? \"6000\");\nconst ACTION_EXIT_TIMEOUT_MS = Number(\n process.env.KEEP_ALIVE_ACTION_EXIT_TIMEOUT_MS ?? \"3000\",\n);\nconst LOCAL_INFO_TIMEOUT_MS = Number(\n process.env.KEEP_ALIVE_LOCAL_INFO_TIMEOUT_MS ?? \"15000\",\n);\nconst BB_INFO_TIMEOUT_MS = Number(\n process.env.KEEP_ALIVE_BB_INFO_TIMEOUT_MS ??\n (process.env.CI ? \"45000\" : \"30000\"),\n);\n\nconst getInfoTimeoutMs = (env: EnvKind): number =>\n env === \"BROWSERBASE\" ? BB_INFO_TIMEOUT_MS : LOCAL_INFO_TIMEOUT_MS;\n\nfunction debugLog(message: string): void {\n if (DEBUG) {\n console.log(message);\n }\n}\n\nfunction parseChildInfo(line: string): ChildInfo | null {\n const prefix = \"__KEEPALIVE__\";\n if (!line.startsWith(prefix)) return null;\n try {\n return JSON.parse(line.slice(prefix.length)) as ChildInfo;\n } catch {\n return null;\n }\n}\n\nasync function runScenario(config: ScenarioConfig): Promise<{\n info: ChildInfo;\n child: ReturnType<typeof spawn>;\n logs: ChildLogs;\n}> {\n const payload = {\n env: config.env,\n keepAlive: config.keepAlive,\n disableAPI: config.disableAPI,\n scenario: config.kind,\n apiKey: config.apiKey,\n projectId: config.projectId,\n debug: config.debug,\n viewMs: config.viewMs,\n };\n const encoded = `cfg:${Buffer.from(JSON.stringify(payload)).toString(\"base64\")}`;\n\n if (!childRunner) {\n throw new Error(\n \"keep-alive child script not found at dist/esm/lib/v3/tests/keep-alive.child.js\",\n );\n }\n\n const child = spawn(childRunner.command, [...childRunner.args, encoded], {\n cwd: coreDir,\n env: { ...process.env },\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n\n const logs: ChildLogs = { stdout: [], stderr: [] };\n let buffer = \"\";\n let stderr = \"\";\n let resolved = false;\n const infoTimeoutMs = getInfoTimeoutMs(config.env);\n\n const infoPromise = new Promise<ChildInfo>((resolve, reject) => {\n const timeout = setTimeout(() => {\n child.kill(\"SIGKILL\");\n const stdoutDetails =\n logs.stdout.length > 0\n ? `\\nChild stdout:\\n${logs.stdout.join(\"\\n\")}`\n : \"\";\n const details = stderr.trim();\n const suffix = details\n ? `\\nChild stderr:\\n${details}`\n : \"\\nChild did not emit keepAlive info.\";\n reject(\n new Error(\n `Child timed out waiting for info after ${infoTimeoutMs}ms (env=${config.env}, keepAlive=${config.keepAlive}, disableAPI=${config.disableAPI}, scenario=${config.kind}).${suffix}${stdoutDetails}`,\n ),\n );\n }, infoTimeoutMs);\n\n child.stdout.on(\"data\", (chunk) => {\n buffer += chunk.toString();\n let idx = buffer.indexOf(\"\\n\");\n while (idx !== -1) {\n const line = buffer.slice(0, idx).trim();\n buffer = buffer.slice(idx + 1);\n const parsed = parseChildInfo(line);\n if (parsed && !resolved) {\n resolved = true;\n clearTimeout(timeout);\n resolve(parsed);\n } else if (line.length > 0) {\n logs.stdout.push(line);\n debugLog(`[keep-alive-child] ${line}`);\n }\n idx = buffer.indexOf(\"\\n\");\n }\n });\n\n child.on(\"exit\", (code, signal) => {\n if (resolved) return;\n clearTimeout(timeout);\n const stdoutDetails =\n logs.stdout.length > 0\n ? `\\nChild stdout:\\n${logs.stdout.join(\"\\n\")}`\n : \"\";\n const details = stderr.trim();\n const suffix = details\n ? `\\nChild stderr:\\n${details}`\n : \"\\nChild exited without emitting keepAlive info.\";\n reject(\n new Error(\n `Child exited (code=${code ?? \"null\"}, signal=${signal ?? \"null\"}) before emitting keepAlive info (env=${config.env}, keepAlive=${config.keepAlive}, disableAPI=${config.disableAPI}, scenario=${config.kind}).${suffix}${stdoutDetails}`,\n ),\n );\n });\n\n child.on(\"error\", (error) => {\n if (resolved) return;\n clearTimeout(timeout);\n reject(error);\n });\n });\n\n child.stderr.on(\"data\", (chunk) => {\n const text = chunk.toString();\n stderr += text;\n const trimmed = text.trim();\n if (trimmed.length > 0) {\n logs.stderr.push(trimmed);\n debugLog(`[keep-alive-child] ${trimmed}`);\n }\n });\n\n const info = await infoPromise;\n return { info, child, logs };\n}\n\nasync function stopChild(child: ReturnType<typeof spawn>): Promise<void> {\n if (child.exitCode !== null) return;\n try {\n child.kill(\"SIGKILL\");\n } catch {\n return;\n }\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => resolve(), 2000);\n child.once(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n}\n\nasync function waitForChildExit(\n child: ReturnType<typeof spawn>,\n timeoutMs: number,\n): Promise<void> {\n if (child.exitCode !== null) return;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => resolve(), timeoutMs);\n child.once(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n}\n\nasync function checkLocalAlive(connectURL: string): Promise<CheckResult> {\n let port = \"\";\n try {\n port = new URL(connectURL).port;\n } catch {\n return { alive: false, status: \"INVALID_URL\" };\n }\n if (!port) return { alive: false, status: \"MISSING_PORT\" };\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 1500);\n try {\n const resp = await fetch(`http://127.0.0.1:${port}/json/version`, {\n signal: controller.signal,\n });\n if (!resp.ok) {\n return { alive: false, status: `HTTP_${resp.status}` };\n }\n const json = (await resp.json()) as { webSocketDebuggerUrl?: string };\n const ws = json?.webSocketDebuggerUrl;\n if (!ws) {\n return { alive: false, status: \"MISSING_WS\" };\n }\n if (ws !== connectURL) {\n return { alive: false, status: \"WS_MISMATCH\" };\n }\n return { alive: true, status: \"MATCH\" };\n } catch {\n return { alive: false, status: \"FETCH_ERROR\" };\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function closeLocalBrowser(connectURL: string): Promise<void> {\n await new Promise<void>((resolve) => {\n const ws = new WebSocket(connectURL);\n const timer = setTimeout(() => {\n ws.terminate();\n resolve();\n }, 2000);\n ws.on(\"open\", () => {\n ws.send(JSON.stringify({ id: 1, method: \"Browser.close\" }));\n });\n ws.on(\"error\", () => {\n clearTimeout(timer);\n resolve();\n });\n ws.on(\"close\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n}\n\nasync function checkBrowserbaseAlive(\n sessionId: string,\n apiKey?: string,\n): Promise<CheckResult> {\n if (!apiKey) return { alive: false, status: \"NO_API_KEY\" };\n\n const bb = new Browserbase({ apiKey });\n try {\n const snapshot = (await bb.sessions.retrieve(sessionId)) as {\n status?: string;\n };\n if (DEBUG) {\n const status = snapshot?.status ?? \"<missing>\";\n debugLog(`[keep-alive] session ${sessionId} status=${status}`);\n }\n const status = snapshot?.status;\n return { alive: status === \"RUNNING\", status };\n } catch (error) {\n debugLog(\n `[keep-alive] session ${sessionId} retrieve failed: ${String(error)}`,\n );\n return { alive: false, status: \"RETRIEVE_FAILED\" };\n }\n}\n\nasync function endBrowserbaseSession(\n sessionId: string,\n apiKey?: string,\n projectId?: string,\n): Promise<void> {\n if (!apiKey || !projectId) return;\n const bb = new Browserbase({ apiKey });\n try {\n await bb.sessions.update(sessionId, {\n status: \"REQUEST_RELEASE\",\n projectId,\n });\n } catch {\n // best-effort cleanup\n }\n}\n\nasync function assertStaysOpen(\n check: () => Promise<CheckResult>,\n durationMs: number,\n intervalMs = 500,\n): Promise<{ durationMs: number; lastStatus?: string }> {\n const start = Date.now();\n const deadline = start + durationMs;\n let lastStatus: string | undefined;\n while (Date.now() < deadline) {\n const result = await check();\n lastStatus = result.status ?? lastStatus;\n if (!result.alive) {\n const elapsed = Date.now() - start;\n const status = lastStatus ? ` (last status ${lastStatus})` : \"\";\n throw new Error(\n `Browser closed after ${elapsed}ms (expected ${durationMs}ms)${status}.`,\n );\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n return { durationMs: Date.now() - start, lastStatus };\n}\n\nasync function waitForClosed(\n check: () => Promise<CheckResult>,\n timeoutMs: number,\n intervalMs = 500,\n): Promise<{ durationMs: number; lastStatus?: string }> {\n const start = Date.now();\n let lastStatus: string | undefined;\n while (Date.now() - start < timeoutMs) {\n const result = await check();\n lastStatus = result.status ?? lastStatus;\n if (!result.alive) {\n return { durationMs: Date.now() - start, lastStatus };\n }\n await new Promise((r) => setTimeout(r, intervalMs));\n }\n const status = lastStatus ? ` (last status ${lastStatus})` : \"\";\n throw new Error(`Browser still alive after ${timeoutMs}ms${status}.`);\n}\n\nasync function assertBrowserState(\n env: EnvKind,\n info: ChildInfo,\n shouldStayOpen: boolean,\n apiKey?: string,\n projectId?: string,\n): Promise<Outcome> {\n const expected: Outcome[\"expected\"] = shouldStayOpen ? \"open\" : \"closed\";\n if (env === \"LOCAL\") {\n if (shouldStayOpen) {\n const result = await assertStaysOpen(\n () => checkLocalAlive(info.connectURL),\n STAY_OPEN_MS,\n );\n const outcome: Outcome = {\n expected,\n actual: \"open\",\n durationMs: result.durationMs,\n lastStatus: result.lastStatus,\n };\n await closeLocalBrowser(info.connectURL);\n return outcome;\n }\n\n const result = await waitForClosed(\n () => checkLocalAlive(info.connectURL),\n LOCAL_TIMEOUT_MS,\n );\n return {\n expected,\n actual: \"closed\",\n durationMs: result.durationMs,\n lastStatus: result.lastStatus,\n };\n }\n\n if (!info.sessionId) {\n throw new Error(\"Browserbase sessionId missing\");\n }\n\n if (shouldStayOpen) {\n const result = await assertStaysOpen(\n () => checkBrowserbaseAlive(info.sessionId!, apiKey),\n STAY_OPEN_MS,\n 1000,\n );\n const outcome: Outcome = {\n expected,\n actual: \"open\",\n durationMs: result.durationMs,\n lastStatus: result.lastStatus,\n };\n await endBrowserbaseSession(info.sessionId, apiKey, projectId);\n return outcome;\n }\n\n const result = await waitForClosed(\n () => checkBrowserbaseAlive(info.sessionId!, apiKey),\n BB_TIMEOUT_MS,\n 1000,\n );\n return {\n expected,\n actual: \"closed\",\n durationMs: result.durationMs,\n lastStatus: result.lastStatus,\n };\n}\n\nfunction dumpLogs(logs: ChildLogs): void {\n if (logs.stdout.length > 0) {\n console.log(\"[keep-alive] child stdout:\");\n for (const line of logs.stdout) {\n console.log(` ${line}`);\n }\n }\n if (logs.stderr.length > 0) {\n console.log(\"[keep-alive] child stderr:\");\n for (const line of logs.stderr) {\n console.log(` ${line}`);\n }\n }\n}\n\nfunction logCaseResult(\n label: string,\n envLabel: string,\n keepAlive: boolean,\n outcome?: Outcome,\n error?: Error,\n): void {\n const prefix = `[keep-alive] ${envLabel} keepAlive=${keepAlive} ${label}`;\n if (error) {\n console.log(`${prefix} FAIL: ${error.message}`);\n return;\n }\n if (!outcome) {\n console.log(`${prefix} FAIL: missing outcome`);\n return;\n }\n const status =\n outcome.lastStatus !== undefined\n ? ` (last status ${outcome.lastStatus})`\n : \"\";\n if (outcome.actual === \"open\") {\n console.log(\n `${prefix} PASS: stayed open for ${outcome.durationMs}ms${status}`,\n );\n } else {\n console.log(\n `${prefix} PASS: closed after ${outcome.durationMs}ms${status}`,\n );\n }\n}\n\nexport function getKeepAliveEnvConfig(): {\n testEnv: EnvKind;\n apiKey?: string;\n projectId?: string;\n hasBrowserbaseCreds: boolean;\n} {\n const testEnv = v3DynamicTestConfig.env;\n const apiKey =\n testEnv === \"BROWSERBASE\"\n ? (v3DynamicTestConfig.apiKey as string | undefined)\n : undefined;\n const projectId =\n testEnv === \"BROWSERBASE\"\n ? (v3DynamicTestConfig.projectId as string | undefined)\n : undefined;\n const hasBrowserbaseCreds = Boolean(apiKey && projectId);\n return { testEnv, apiKey, projectId, hasBrowserbaseCreds };\n}\n\nexport function buildKeepAliveCases(testEnv: EnvKind): KeepAliveCase[] {\n const scenarios: Array<{ kind: ScenarioKind; label: string }> = [\n { kind: \"unhandled\", label: \"unhandled rejection\" },\n { kind: \"close\", label: \"stagehand.close()\" },\n { kind: \"sigterm\", label: \"SIGTERM\" },\n { kind: \"sigint\", label: \"SIGINT\" },\n ];\n\n const environments: Array<{\n env: EnvKind;\n label: string;\n disableAPI: boolean;\n requiresBrowserbase: boolean;\n }> =\n testEnv === \"BROWSERBASE\"\n ? [\n {\n env: \"BROWSERBASE\",\n label: \"bb direct ws\",\n disableAPI: true,\n requiresBrowserbase: true,\n },\n {\n env: \"BROWSERBASE\",\n label: \"bb via api\",\n disableAPI: false,\n requiresBrowserbase: true,\n },\n ]\n : [\n {\n env: \"LOCAL\",\n label: \"local\",\n disableAPI: false,\n requiresBrowserbase: false,\n },\n ];\n\n const cases: KeepAliveCase[] = [];\n for (const keepAlive of [true, false]) {\n for (const envConfig of environments) {\n for (const scenario of scenarios) {\n const expectation = keepAlive ? \"expect open\" : \"expect closed\";\n cases.push({\n title: `${envConfig.label} keepAlive=${keepAlive} ${scenario.label} (${expectation})`,\n env: envConfig.env,\n envLabel: envConfig.label,\n keepAlive,\n disableAPI: envConfig.disableAPI,\n kind: scenario.kind,\n requiresBrowserbase: envConfig.requiresBrowserbase,\n });\n }\n }\n }\n return cases;\n}\n\nexport async function runKeepAliveCase(\n testCase: KeepAliveCase,\n envConfig: {\n apiKey?: string;\n projectId?: string;\n },\n): Promise<void> {\n let info: ChildInfo | undefined;\n let child: ReturnType<typeof spawn> | undefined;\n let logs: ChildLogs | undefined;\n try {\n ({ info, child, logs } = await runScenario({\n env: testCase.env,\n keepAlive: testCase.keepAlive,\n disableAPI: testCase.disableAPI,\n kind: testCase.kind,\n debug: DEBUG,\n viewMs: VIEW_MS,\n apiKey: envConfig.apiKey,\n projectId: envConfig.projectId,\n }));\n } catch (error) {\n logCaseResult(\n testCase.title,\n testCase.envLabel,\n testCase.keepAlive,\n undefined,\n error as Error,\n );\n throw error;\n }\n\n if (testCase.kind === \"sigterm\") {\n child.kill(\"SIGTERM\");\n } else if (testCase.kind === \"sigint\") {\n child.kill(\"SIGINT\");\n }\n\n let outcome: Outcome | undefined;\n let failure: Error | undefined;\n try {\n if (\n testCase.kind === \"close\" ||\n testCase.kind === \"unhandled\" ||\n testCase.kind === \"sigterm\" ||\n testCase.kind === \"sigint\"\n ) {\n await waitForChildExit(child, ACTION_EXIT_TIMEOUT_MS);\n }\n outcome = await assertBrowserState(\n testCase.env,\n info,\n testCase.keepAlive,\n envConfig.apiKey,\n envConfig.projectId,\n );\n } catch (error) {\n failure = error as Error;\n if (logs) {\n dumpLogs(logs);\n }\n throw error;\n } finally {\n logCaseResult(\n testCase.title,\n testCase.envLabel,\n testCase.keepAlive,\n outcome,\n failure,\n );\n await stopChild(child);\n if (testCase.env === \"LOCAL\" && info.connectURL) {\n await closeLocalBrowser(info.connectURL);\n }\n if (testCase.env === \"BROWSERBASE\" && info.sessionId) {\n await endBrowserbaseSession(\n info.sessionId,\n envConfig.apiKey,\n envConfig.projectId,\n );\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["path", "fs", "WebSocket", "Browserbase", "status", "result"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_keep_alive_helpers = require("./keep-alive.helpers.js");
|
|
3
|
+
import_test.test.describe.parallel("keepAlive behavior", () => {
|
|
4
|
+
const { testEnv, apiKey, projectId, hasBrowserbaseCreds } = (0, import_keep_alive_helpers.getKeepAliveEnvConfig)();
|
|
5
|
+
const cases = (0, import_keep_alive_helpers.buildKeepAliveCases)(testEnv);
|
|
6
|
+
for (const testCase of cases) {
|
|
7
|
+
(0, import_test.test)(testCase.title, async () => {
|
|
8
|
+
if (testCase.requiresBrowserbase) {
|
|
9
|
+
import_test.test.skip(!hasBrowserbaseCreds, "Browserbase credentials required");
|
|
10
|
+
}
|
|
11
|
+
await (0, import_keep_alive_helpers.runKeepAliveCase)(testCase, { apiKey, projectId });
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=keep-alive.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/keep-alive.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test } from \"@playwright/test\";\nimport {\n buildKeepAliveCases,\n getKeepAliveEnvConfig,\n runKeepAliveCase,\n} from \"./keep-alive.helpers.js\";\n\ntest.describe.parallel(\"keepAlive behavior\", () => {\n const { testEnv, apiKey, projectId, hasBrowserbaseCreds } =\n getKeepAliveEnvConfig();\n const cases = buildKeepAliveCases(testEnv);\n\n for (const testCase of cases) {\n test(testCase.title, async () => {\n if (testCase.requiresBrowserbase) {\n test.skip(!hasBrowserbaseCreds, \"Browserbase credentials required\");\n }\n\n await runKeepAliveCase(testCase, { apiKey, projectId });\n });\n }\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAAqB;AACrB,gCAIO;AAEP,iBAAK,SAAS,SAAS,sBAAsB,MAAM;AACjD,QAAM,EAAE,SAAS,QAAQ,WAAW,oBAAoB,QACtD,iDAAsB;AACxB,QAAM,YAAQ,+CAAoB,OAAO;AAEzC,aAAW,YAAY,OAAO;AAC5B,0BAAK,SAAS,OAAO,YAAY;AAC/B,UAAI,SAAS,qBAAqB;AAChC,yBAAK,KAAK,CAAC,qBAAqB,kCAAkC;AAAA,MACpE;AAEA,gBAAM,4CAAiB,UAAU,EAAE,QAAQ,UAAU,CAAC;AAAA,IACxD,CAAC;AAAA,EACH;AACF,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,296 @@
|
|
|
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
|
+
function dataUrl(html) {
|
|
6
|
+
return "data:text/html;charset=utf-8," + encodeURIComponent(html);
|
|
7
|
+
}
|
|
8
|
+
import_test.test.describe("V3 keyboard shortcuts and typing", () => {
|
|
9
|
+
let v3;
|
|
10
|
+
import_test.test.beforeEach(async () => {
|
|
11
|
+
v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
|
|
12
|
+
await v3.init();
|
|
13
|
+
});
|
|
14
|
+
import_test.test.afterEach(async () => {
|
|
15
|
+
await (0, import_testUtils.closeV3)(v3);
|
|
16
|
+
});
|
|
17
|
+
(0, import_test.test)("typing, select-all + delete clears input (Cmd maps cross-OS)", async () => {
|
|
18
|
+
const html = `<!doctype html>
|
|
19
|
+
<input id="i1" autofocus />`;
|
|
20
|
+
const page = await v3.context.awaitActivePage();
|
|
21
|
+
await page.goto(dataUrl(html), {
|
|
22
|
+
waitUntil: "domcontentloaded",
|
|
23
|
+
timeoutMs: 15e3
|
|
24
|
+
});
|
|
25
|
+
await page.locator("#i1").click();
|
|
26
|
+
await page.type("Hello World");
|
|
27
|
+
await page.keyPress("Cmd+A");
|
|
28
|
+
await page.keyPress("Delete");
|
|
29
|
+
const value = await page.evaluate(
|
|
30
|
+
(sel) => document.querySelector(sel).value,
|
|
31
|
+
"#i1"
|
|
32
|
+
);
|
|
33
|
+
(0, import_test.expect)(value).toBe("");
|
|
34
|
+
});
|
|
35
|
+
(0, import_test.test)("accelerator does not inject printable text (Cmd+B does not type 'b')", async () => {
|
|
36
|
+
const html = `<!doctype html>
|
|
37
|
+
<input id="i" />`;
|
|
38
|
+
const page = await v3.context.awaitActivePage();
|
|
39
|
+
await page.goto(dataUrl(html), {
|
|
40
|
+
waitUntil: "domcontentloaded",
|
|
41
|
+
timeoutMs: 15e3
|
|
42
|
+
});
|
|
43
|
+
await page.locator("#i").click();
|
|
44
|
+
await page.type("xyz");
|
|
45
|
+
await page.keyPress("Cmd+B");
|
|
46
|
+
const value = await page.evaluate(
|
|
47
|
+
(sel) => document.querySelector(sel).value,
|
|
48
|
+
"#i"
|
|
49
|
+
);
|
|
50
|
+
(0, import_test.expect)(value).toBe("xyz");
|
|
51
|
+
});
|
|
52
|
+
(0, import_test.test)("Tab and Shift+Tab move focus", async () => {
|
|
53
|
+
const html = `<!doctype html>
|
|
54
|
+
<input id="a" />
|
|
55
|
+
<input id="b" />`;
|
|
56
|
+
const page = await v3.context.awaitActivePage();
|
|
57
|
+
await page.goto(dataUrl(html), {
|
|
58
|
+
waitUntil: "domcontentloaded",
|
|
59
|
+
timeoutMs: 15e3
|
|
60
|
+
});
|
|
61
|
+
await page.locator("#a").click();
|
|
62
|
+
await page.keyPress("Tab");
|
|
63
|
+
const active1 = await page.evaluate(
|
|
64
|
+
() => document.activeElement?.id || ""
|
|
65
|
+
);
|
|
66
|
+
(0, import_test.expect)(active1).toBe("b");
|
|
67
|
+
await page.keyPress("Shift+Tab");
|
|
68
|
+
const active2 = await page.evaluate(
|
|
69
|
+
() => document.activeElement?.id || ""
|
|
70
|
+
);
|
|
71
|
+
(0, import_test.expect)(active2).toBe("a");
|
|
72
|
+
});
|
|
73
|
+
(0, import_test.test)("cut clears the field (Cmd+X)", async () => {
|
|
74
|
+
const html = `<!doctype html>
|
|
75
|
+
<input id="t" />`;
|
|
76
|
+
const page = await v3.context.awaitActivePage();
|
|
77
|
+
await page.goto(dataUrl(html), {
|
|
78
|
+
waitUntil: "domcontentloaded",
|
|
79
|
+
timeoutMs: 15e3
|
|
80
|
+
});
|
|
81
|
+
await page.locator("#t").click();
|
|
82
|
+
await page.type("cut-me");
|
|
83
|
+
await page.keyPress("Cmd+A");
|
|
84
|
+
await page.keyPress("Cmd+X");
|
|
85
|
+
const value = await page.evaluate(
|
|
86
|
+
(sel) => document.querySelector(sel).value,
|
|
87
|
+
"#t"
|
|
88
|
+
);
|
|
89
|
+
(0, import_test.expect)(value).toBe("");
|
|
90
|
+
});
|
|
91
|
+
(0, import_test.test)("single printable via keyPress types characters (a, Shift+A, space)", async () => {
|
|
92
|
+
const html = `<!doctype html>
|
|
93
|
+
<input id="t" autofocus />`;
|
|
94
|
+
const page = await v3.context.awaitActivePage();
|
|
95
|
+
await page.goto(dataUrl(html), {
|
|
96
|
+
waitUntil: "domcontentloaded",
|
|
97
|
+
timeoutMs: 15e3
|
|
98
|
+
});
|
|
99
|
+
await page.locator("#t").click();
|
|
100
|
+
await page.keyPress("a");
|
|
101
|
+
await page.keyPress("Shift+A");
|
|
102
|
+
await page.keyPress(" ");
|
|
103
|
+
const value = await page.evaluate(
|
|
104
|
+
(sel) => document.querySelector(sel).value,
|
|
105
|
+
"#t"
|
|
106
|
+
);
|
|
107
|
+
(0, import_test.expect)(value).toBe("aA ");
|
|
108
|
+
});
|
|
109
|
+
(0, import_test.test)("Backspace removes last char", async () => {
|
|
110
|
+
const html = `<!doctype html>
|
|
111
|
+
<input id="t" />`;
|
|
112
|
+
const page = await v3.context.awaitActivePage();
|
|
113
|
+
await page.goto(dataUrl(html), {
|
|
114
|
+
waitUntil: "domcontentloaded",
|
|
115
|
+
timeoutMs: 15e3
|
|
116
|
+
});
|
|
117
|
+
await page.locator("#t").click();
|
|
118
|
+
await page.type("ab");
|
|
119
|
+
await page.keyPress("Backspace");
|
|
120
|
+
const value = await page.evaluate(
|
|
121
|
+
(sel) => document.querySelector(sel).value,
|
|
122
|
+
"#t"
|
|
123
|
+
);
|
|
124
|
+
(0, import_test.expect)(value).toBe("a");
|
|
125
|
+
});
|
|
126
|
+
(0, import_test.test)("Delete removes next char at caret", async () => {
|
|
127
|
+
const html = `<!doctype html>
|
|
128
|
+
<input id="t" />`;
|
|
129
|
+
const page = await v3.context.awaitActivePage();
|
|
130
|
+
await page.goto(dataUrl(html), {
|
|
131
|
+
waitUntil: "domcontentloaded",
|
|
132
|
+
timeoutMs: 15e3
|
|
133
|
+
});
|
|
134
|
+
await page.locator("#t").click();
|
|
135
|
+
await page.type("abc");
|
|
136
|
+
await page.evaluate(() => {
|
|
137
|
+
const el = document.getElementById("t");
|
|
138
|
+
el.focus();
|
|
139
|
+
el.setSelectionRange(1, 1);
|
|
140
|
+
});
|
|
141
|
+
await page.keyPress("Delete");
|
|
142
|
+
const value = await page.evaluate(
|
|
143
|
+
(sel) => document.querySelector(sel).value,
|
|
144
|
+
"#t"
|
|
145
|
+
);
|
|
146
|
+
(0, import_test.expect)(value).toBe("ac");
|
|
147
|
+
});
|
|
148
|
+
(0, import_test.test)("ArrowLeft moves caret and typing inserts in middle", async () => {
|
|
149
|
+
const html = `<!doctype html>
|
|
150
|
+
<input id="t" />`;
|
|
151
|
+
const page = await v3.context.awaitActivePage();
|
|
152
|
+
await page.goto(dataUrl(html), {
|
|
153
|
+
waitUntil: "domcontentloaded",
|
|
154
|
+
timeoutMs: 15e3
|
|
155
|
+
});
|
|
156
|
+
await page.locator("#t").click();
|
|
157
|
+
await page.type("ac");
|
|
158
|
+
await page.keyPress("ArrowLeft");
|
|
159
|
+
await page.keyPress("b");
|
|
160
|
+
const value = await page.evaluate(
|
|
161
|
+
(sel) => document.querySelector(sel).value,
|
|
162
|
+
"#t"
|
|
163
|
+
);
|
|
164
|
+
(0, import_test.expect)(value).toBe("abc");
|
|
165
|
+
});
|
|
166
|
+
(0, import_test.test)("Enter inserts newline in textarea", async () => {
|
|
167
|
+
const html = `<!doctype html>
|
|
168
|
+
<textarea id="ta"></textarea>`;
|
|
169
|
+
const page = await v3.context.awaitActivePage();
|
|
170
|
+
await page.goto(dataUrl(html), {
|
|
171
|
+
waitUntil: "domcontentloaded",
|
|
172
|
+
timeoutMs: 15e3
|
|
173
|
+
});
|
|
174
|
+
await page.locator("#ta").click();
|
|
175
|
+
await page.keyPress("a");
|
|
176
|
+
await page.keyPress("Enter");
|
|
177
|
+
await page.keyPress("b");
|
|
178
|
+
const value = await page.evaluate(
|
|
179
|
+
(sel) => document.querySelector(sel).value,
|
|
180
|
+
"#ta"
|
|
181
|
+
);
|
|
182
|
+
(0, import_test.expect)(value).toBe("a\nb");
|
|
183
|
+
});
|
|
184
|
+
(0, import_test.test)("Insert key (no-op for value)", async () => {
|
|
185
|
+
const html = `<!doctype html>
|
|
186
|
+
<input id="t" />`;
|
|
187
|
+
const page = await v3.context.awaitActivePage();
|
|
188
|
+
await page.goto(dataUrl(html), {
|
|
189
|
+
waitUntil: "domcontentloaded",
|
|
190
|
+
timeoutMs: 15e3
|
|
191
|
+
});
|
|
192
|
+
await page.locator("#t").click();
|
|
193
|
+
await page.type("abc");
|
|
194
|
+
await page.keyPress("Insert");
|
|
195
|
+
const value = await page.evaluate(
|
|
196
|
+
(sel) => document.querySelector(sel).value,
|
|
197
|
+
"#t"
|
|
198
|
+
);
|
|
199
|
+
(0, import_test.expect)(value).toBe("abc");
|
|
200
|
+
});
|
|
201
|
+
(0, import_test.test)("Enter submits form from text input", async () => {
|
|
202
|
+
const html = `<!doctype html>
|
|
203
|
+
<form id="f">
|
|
204
|
+
<input id="name" />
|
|
205
|
+
<button id="submit">Go</button>
|
|
206
|
+
<input id="submitted" />
|
|
207
|
+
</form>
|
|
208
|
+
<script>
|
|
209
|
+
document.getElementById('f').addEventListener('submit', (e) => {
|
|
210
|
+
e.preventDefault();
|
|
211
|
+
document.getElementById('submitted').value = 'yes';
|
|
212
|
+
});
|
|
213
|
+
</script>`;
|
|
214
|
+
const page = await v3.context.awaitActivePage();
|
|
215
|
+
await page.goto(dataUrl(html), {
|
|
216
|
+
waitUntil: "domcontentloaded",
|
|
217
|
+
timeoutMs: 15e3
|
|
218
|
+
});
|
|
219
|
+
await page.locator("#name").click();
|
|
220
|
+
await page.type("foo");
|
|
221
|
+
await page.keyPress("Enter");
|
|
222
|
+
const submitted = await page.evaluate(
|
|
223
|
+
() => document.getElementById("submitted")?.value || ""
|
|
224
|
+
);
|
|
225
|
+
(0, import_test.expect)(submitted).toBe("yes");
|
|
226
|
+
});
|
|
227
|
+
(0, import_test.test)("Enter in textarea does not submit form (inserts newline)", async () => {
|
|
228
|
+
const html = `<!doctype html>
|
|
229
|
+
<form id="f">
|
|
230
|
+
<textarea id="ta"></textarea>
|
|
231
|
+
<button id="submit">Go</button>
|
|
232
|
+
<input id="submitted" />
|
|
233
|
+
</form>
|
|
234
|
+
<script>
|
|
235
|
+
document.getElementById('f').addEventListener('submit', (e) => {
|
|
236
|
+
e.preventDefault();
|
|
237
|
+
document.getElementById('submitted').value = 'yes';
|
|
238
|
+
});
|
|
239
|
+
</script>`;
|
|
240
|
+
const page = await v3.context.awaitActivePage();
|
|
241
|
+
await page.goto(dataUrl(html), {
|
|
242
|
+
waitUntil: "domcontentloaded",
|
|
243
|
+
timeoutMs: 15e3
|
|
244
|
+
});
|
|
245
|
+
await page.locator("#ta").click();
|
|
246
|
+
await page.keyPress("a");
|
|
247
|
+
await page.keyPress("Enter");
|
|
248
|
+
await page.keyPress("b");
|
|
249
|
+
const submitted = await page.evaluate(
|
|
250
|
+
() => document.getElementById("submitted")?.value || ""
|
|
251
|
+
);
|
|
252
|
+
const value = await page.evaluate(
|
|
253
|
+
(sel) => document.querySelector(sel).value,
|
|
254
|
+
"#ta"
|
|
255
|
+
);
|
|
256
|
+
(0, import_test.expect)(submitted).toBe("");
|
|
257
|
+
(0, import_test.expect)(value).toBe("a\nb");
|
|
258
|
+
});
|
|
259
|
+
(0, import_test.test)('pressing "+" key types plus sign', async () => {
|
|
260
|
+
const html = `<!doctype html>
|
|
261
|
+
<input id="t" />`;
|
|
262
|
+
const page = await v3.context.awaitActivePage();
|
|
263
|
+
await page.goto(dataUrl(html), {
|
|
264
|
+
waitUntil: "domcontentloaded",
|
|
265
|
+
timeoutMs: 15e3
|
|
266
|
+
});
|
|
267
|
+
await page.locator("#t").click();
|
|
268
|
+
await page.keyPress("+");
|
|
269
|
+
const value = await page.evaluate(
|
|
270
|
+
(sel) => document.querySelector(sel).value,
|
|
271
|
+
"#t"
|
|
272
|
+
);
|
|
273
|
+
(0, import_test.expect)(value).toBe("+");
|
|
274
|
+
});
|
|
275
|
+
(0, import_test.test)("modifier state clears on keyPress error", async () => {
|
|
276
|
+
const html = `<!doctype html>
|
|
277
|
+
<input id="t" />`;
|
|
278
|
+
const page = await v3.context.awaitActivePage();
|
|
279
|
+
await page.goto(dataUrl(html), {
|
|
280
|
+
waitUntil: "domcontentloaded",
|
|
281
|
+
timeoutMs: 15e3
|
|
282
|
+
});
|
|
283
|
+
await page.locator("#t").click();
|
|
284
|
+
try {
|
|
285
|
+
await page.keyPress("Cmd+InvalidKey123");
|
|
286
|
+
} catch {
|
|
287
|
+
}
|
|
288
|
+
await page.type("ok");
|
|
289
|
+
const value = await page.evaluate(
|
|
290
|
+
(sel) => document.querySelector(sel).value,
|
|
291
|
+
"#t"
|
|
292
|
+
);
|
|
293
|
+
(0, import_test.expect)(value).toBe("ok");
|
|
294
|
+
});
|
|
295
|
+
});
|
|
296
|
+
//# sourceMappingURL=keyboard.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/keyboard.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\nfunction dataUrl(html: string): string {\n return \"data:text/html;charset=utf-8,\" + encodeURIComponent(html);\n}\n\ntest.describe(\"V3 keyboard shortcuts and typing\", () => {\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(\"typing, select-all + delete clears input (Cmd maps cross-OS)\", async () => {\n const html = `<!doctype html>\n <input id=\"i1\" autofocus />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#i1\").click();\n await page.type(\"Hello World\");\n\n await page.keyPress(\"Cmd+A\");\n await page.keyPress(\"Delete\");\n\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#i1\",\n );\n expect(value).toBe(\"\");\n });\n\n test(\"accelerator does not inject printable text (Cmd+B does not type 'b')\", async () => {\n const html = `<!doctype html>\n <input id=\"i\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#i\").click();\n await page.type(\"xyz\");\n\n await page.keyPress(\"Cmd+B\");\n\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#i\",\n );\n expect(value).toBe(\"xyz\");\n });\n\n test(\"Tab and Shift+Tab move focus\", async () => {\n const html = `<!doctype html>\n <input id=\"a\" />\n <input id=\"b\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#a\").click();\n await page.keyPress(\"Tab\");\n const active1 = await page.evaluate(\n () => (document.activeElement as HTMLElement)?.id || \"\",\n );\n expect(active1).toBe(\"b\");\n\n await page.keyPress(\"Shift+Tab\");\n const active2 = await page.evaluate(\n () => (document.activeElement as HTMLElement)?.id || \"\",\n );\n expect(active2).toBe(\"a\");\n });\n\n test(\"cut clears the field (Cmd+X)\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.type(\"cut-me\");\n await page.keyPress(\"Cmd+A\");\n await page.keyPress(\"Cmd+X\");\n\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"\");\n });\n\n test(\"single printable via keyPress types characters (a, Shift+A, space)\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" autofocus />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.keyPress(\"a\");\n await page.keyPress(\"Shift+A\");\n await page.keyPress(\" \");\n\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"aA \");\n });\n\n test(\"Backspace removes last char\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.type(\"ab\");\n await page.keyPress(\"Backspace\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"a\");\n });\n\n test(\"Delete removes next char at caret\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.type(\"abc\");\n // place caret between a|bc\n await page.evaluate(() => {\n const el = document.getElementById(\"t\") as HTMLInputElement;\n el.focus();\n el.setSelectionRange(1, 1);\n });\n await page.keyPress(\"Delete\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"ac\");\n });\n\n test(\"ArrowLeft moves caret and typing inserts in middle\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.type(\"ac\");\n await page.keyPress(\"ArrowLeft\");\n await page.keyPress(\"b\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"abc\");\n });\n\n test(\"Enter inserts newline in textarea\", async () => {\n const html = `<!doctype html>\n <textarea id=\"ta\"></textarea>`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#ta\").click();\n await page.keyPress(\"a\");\n await page.keyPress(\"Enter\");\n await page.keyPress(\"b\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLTextAreaElement)!.value,\n \"#ta\",\n );\n expect(value).toBe(\"a\\nb\");\n });\n\n test(\"Insert key (no-op for value)\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.type(\"abc\");\n await page.keyPress(\"Insert\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"abc\");\n });\n\n test(\"Enter submits form from text input\", async () => {\n const html = `<!doctype html>\n <form id=\"f\">\n <input id=\"name\" />\n <button id=\"submit\">Go</button>\n <input id=\"submitted\" />\n </form>\n <script>\n document.getElementById('f').addEventListener('submit', (e) => {\n e.preventDefault();\n document.getElementById('submitted').value = 'yes';\n });\n </script>`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#name\").click();\n await page.type(\"foo\");\n await page.keyPress(\"Enter\");\n\n const submitted = await page.evaluate(\n () =>\n (document.getElementById(\"submitted\") as HTMLInputElement)?.value || \"\",\n );\n expect(submitted).toBe(\"yes\");\n });\n\n test(\"Enter in textarea does not submit form (inserts newline)\", async () => {\n const html = `<!doctype html>\n <form id=\"f\">\n <textarea id=\"ta\"></textarea>\n <button id=\"submit\">Go</button>\n <input id=\"submitted\" />\n </form>\n <script>\n document.getElementById('f').addEventListener('submit', (e) => {\n e.preventDefault();\n document.getElementById('submitted').value = 'yes';\n });\n </script>`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#ta\").click();\n await page.keyPress(\"a\");\n await page.keyPress(\"Enter\");\n await page.keyPress(\"b\");\n\n const submitted = await page.evaluate(\n () =>\n (document.getElementById(\"submitted\") as HTMLInputElement)?.value || \"\",\n );\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLTextAreaElement)!.value,\n \"#ta\",\n );\n expect(submitted).toBe(\"\");\n expect(value).toBe(\"a\\nb\");\n });\n\n test('pressing \"+\" key types plus sign', async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n await page.keyPress(\"+\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"+\");\n });\n\n test(\"modifier state clears on keyPress error\", async () => {\n const html = `<!doctype html>\n <input id=\"t\" />`;\n const page = await v3.context.awaitActivePage();\n await page.goto(dataUrl(html), {\n waitUntil: \"domcontentloaded\",\n timeoutMs: 15000,\n });\n\n await page.locator(\"#t\").click();\n // Try invalid key that might throw\n try {\n await page.keyPress(\"Cmd+InvalidKey123\");\n } catch {\n // Expected to fail\n }\n\n // Now try normal typing - should work if modifiers were cleared\n await page.type(\"ok\");\n const value = await page.evaluate(\n (sel) => (document.querySelector(sel) as HTMLInputElement)!.value,\n \"#t\",\n );\n expect(value).toBe(\"ok\");\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
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("Locator.backendNodeId() - CDP DOM node ID", () => {
|
|
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)("returns a valid backend node ID for an element", 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">Click me</button>
|
|
20
|
+
</body></html>`
|
|
21
|
+
)
|
|
22
|
+
);
|
|
23
|
+
const locator = page.locator("button#btn");
|
|
24
|
+
const nodeId = await locator.backendNodeId();
|
|
25
|
+
(0, import_test.expect)(typeof nodeId).toBe("number");
|
|
26
|
+
(0, import_test.expect)(nodeId).toBeGreaterThan(0);
|
|
27
|
+
});
|
|
28
|
+
(0, import_test.test)("returns different node IDs for different elements", async () => {
|
|
29
|
+
const page = v3.context.pages()[0];
|
|
30
|
+
await page.goto(
|
|
31
|
+
"data:text/html," + encodeURIComponent(
|
|
32
|
+
`<!doctype html><html><body>
|
|
33
|
+
<div id="div1">First</div>
|
|
34
|
+
<div id="div2">Second</div>
|
|
35
|
+
<p id="p1">Third</p>
|
|
36
|
+
</body></html>`
|
|
37
|
+
)
|
|
38
|
+
);
|
|
39
|
+
const nodeId1 = await page.locator("div#div1").backendNodeId();
|
|
40
|
+
const nodeId2 = await page.locator("div#div2").backendNodeId();
|
|
41
|
+
const nodeId3 = await page.locator("p#p1").backendNodeId();
|
|
42
|
+
(0, import_test.expect)(nodeId1).not.toBe(nodeId2);
|
|
43
|
+
(0, import_test.expect)(nodeId2).not.toBe(nodeId3);
|
|
44
|
+
(0, import_test.expect)(nodeId1).not.toBe(nodeId3);
|
|
45
|
+
});
|
|
46
|
+
(0, import_test.test)("returns consistent node ID for the same element", async () => {
|
|
47
|
+
const page = v3.context.pages()[0];
|
|
48
|
+
await page.goto(
|
|
49
|
+
"data:text/html," + encodeURIComponent(
|
|
50
|
+
`<!doctype html><html><body>
|
|
51
|
+
<input type="text" id="input" />
|
|
52
|
+
</body></html>`
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
const locator = page.locator("input#input");
|
|
56
|
+
const nodeId1 = await locator.backendNodeId();
|
|
57
|
+
const nodeId2 = await locator.backendNodeId();
|
|
58
|
+
(0, import_test.expect)(nodeId1).toBe(nodeId2);
|
|
59
|
+
});
|
|
60
|
+
(0, import_test.test)("returns node ID for nested elements", async () => {
|
|
61
|
+
const page = v3.context.pages()[0];
|
|
62
|
+
await page.goto(
|
|
63
|
+
"data:text/html," + encodeURIComponent(
|
|
64
|
+
`<!doctype html><html><body>
|
|
65
|
+
<div id="outer">
|
|
66
|
+
<div id="middle">
|
|
67
|
+
<span id="inner">Deep</span>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</body></html>`
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
const outerNodeId = await page.locator("div#outer").backendNodeId();
|
|
74
|
+
const middleNodeId = await page.locator("div#middle").backendNodeId();
|
|
75
|
+
const innerNodeId = await page.locator("span#inner").backendNodeId();
|
|
76
|
+
(0, import_test.expect)(outerNodeId).toBeGreaterThan(0);
|
|
77
|
+
(0, import_test.expect)(middleNodeId).toBeGreaterThan(0);
|
|
78
|
+
(0, import_test.expect)(innerNodeId).toBeGreaterThan(0);
|
|
79
|
+
(0, import_test.expect)((/* @__PURE__ */ new Set([outerNodeId, middleNodeId, innerNodeId])).size).toBe(3);
|
|
80
|
+
});
|
|
81
|
+
(0, import_test.test)("returns node ID for elements with various attributes", async () => {
|
|
82
|
+
const page = v3.context.pages()[0];
|
|
83
|
+
await page.goto(
|
|
84
|
+
"data:text/html," + encodeURIComponent(
|
|
85
|
+
`<!doctype html><html><body>
|
|
86
|
+
<button class="btn primary" data-test="submit" aria-label="Submit form">Save</button>
|
|
87
|
+
</body></html>`
|
|
88
|
+
)
|
|
89
|
+
);
|
|
90
|
+
const locator = page.locator("button");
|
|
91
|
+
const nodeId = await locator.backendNodeId();
|
|
92
|
+
(0, import_test.expect)(typeof nodeId).toBe("number");
|
|
93
|
+
(0, import_test.expect)(nodeId).toBeGreaterThan(0);
|
|
94
|
+
});
|
|
95
|
+
(0, import_test.test)("returns node ID for form elements", async () => {
|
|
96
|
+
const page = v3.context.pages()[0];
|
|
97
|
+
await page.goto(
|
|
98
|
+
"data:text/html," + encodeURIComponent(
|
|
99
|
+
`<!doctype html><html><body>
|
|
100
|
+
<form>
|
|
101
|
+
<input type="email" id="email" placeholder="Email" />
|
|
102
|
+
<textarea id="message"></textarea>
|
|
103
|
+
<select id="country">
|
|
104
|
+
<option value="us">USA</option>
|
|
105
|
+
<option value="ca">Canada</option>
|
|
106
|
+
</select>
|
|
107
|
+
<button type="submit">Submit</button>
|
|
108
|
+
</form>
|
|
109
|
+
</body></html>`
|
|
110
|
+
)
|
|
111
|
+
);
|
|
112
|
+
const emailNodeId = await page.locator("input#email").backendNodeId();
|
|
113
|
+
const textareaNodeId = await page.locator("textarea#message").backendNodeId();
|
|
114
|
+
const selectNodeId = await page.locator("select#country").backendNodeId();
|
|
115
|
+
const submitNodeId = await page.locator("button[type='submit']").backendNodeId();
|
|
116
|
+
(0, import_test.expect)(emailNodeId).toBeGreaterThan(0);
|
|
117
|
+
(0, import_test.expect)(textareaNodeId).toBeGreaterThan(0);
|
|
118
|
+
(0, import_test.expect)(selectNodeId).toBeGreaterThan(0);
|
|
119
|
+
(0, import_test.expect)(submitNodeId).toBeGreaterThan(0);
|
|
120
|
+
const nodeIds = [emailNodeId, textareaNodeId, selectNodeId, submitNodeId];
|
|
121
|
+
(0, import_test.expect)(new Set(nodeIds).size).toBe(4);
|
|
122
|
+
});
|
|
123
|
+
(0, import_test.test)("returns node ID for dynamically created elements", async () => {
|
|
124
|
+
const page = v3.context.pages()[0];
|
|
125
|
+
await page.goto(
|
|
126
|
+
"data:text/html," + encodeURIComponent(
|
|
127
|
+
`<!doctype html><html><body>
|
|
128
|
+
<div id="container"></div>
|
|
129
|
+
<script>
|
|
130
|
+
const container = document.getElementById('container');
|
|
131
|
+
const newBtn = document.createElement('button');
|
|
132
|
+
newBtn.id = 'dynamic-btn';
|
|
133
|
+
newBtn.textContent = 'Dynamically created';
|
|
134
|
+
container.appendChild(newBtn);
|
|
135
|
+
</script>
|
|
136
|
+
</body></html>`
|
|
137
|
+
)
|
|
138
|
+
);
|
|
139
|
+
const locator = page.locator("button#dynamic-btn");
|
|
140
|
+
const nodeId = await locator.backendNodeId();
|
|
141
|
+
(0, import_test.expect)(typeof nodeId).toBe("number");
|
|
142
|
+
(0, import_test.expect)(nodeId).toBeGreaterThan(0);
|
|
143
|
+
});
|
|
144
|
+
(0, import_test.test)("returns node ID for elements with text selectors", async () => {
|
|
145
|
+
const page = v3.context.pages()[0];
|
|
146
|
+
await page.goto(
|
|
147
|
+
"data:text/html," + encodeURIComponent(
|
|
148
|
+
`<!doctype html><html><body>
|
|
149
|
+
<button>Submit Form</button>
|
|
150
|
+
</body></html>`
|
|
151
|
+
)
|
|
152
|
+
);
|
|
153
|
+
const locator = page.locator("text=Submit Form");
|
|
154
|
+
const nodeId = await locator.backendNodeId();
|
|
155
|
+
(0, import_test.expect)(typeof nodeId).toBe("number");
|
|
156
|
+
(0, import_test.expect)(nodeId).toBeGreaterThan(0);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
//# sourceMappingURL=locator-backend-node-id.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/locator-backend-node-id.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator.backendNodeId() - CDP DOM node ID\", () => {\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(\"returns a valid backend node ID for an element\", 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\">Click me</button>\n </body></html>`,\n ),\n );\n\n const locator = page.locator(\"button#btn\");\n const nodeId = await locator.backendNodeId();\n\n // Backend node ID should be a valid number\n expect(typeof nodeId).toBe(\"number\");\n expect(nodeId).toBeGreaterThan(0);\n });\n\n test(\"returns different node IDs for different elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"div1\">First</div>\n <div id=\"div2\">Second</div>\n <p id=\"p1\">Third</p>\n </body></html>`,\n ),\n );\n\n const nodeId1 = await page.locator(\"div#div1\").backendNodeId();\n const nodeId2 = await page.locator(\"div#div2\").backendNodeId();\n const nodeId3 = await page.locator(\"p#p1\").backendNodeId();\n\n // All node IDs should be unique\n expect(nodeId1).not.toBe(nodeId2);\n expect(nodeId2).not.toBe(nodeId3);\n expect(nodeId1).not.toBe(nodeId3);\n });\n\n test(\"returns consistent node ID for the same element\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input type=\"text\" id=\"input\" />\n </body></html>`,\n ),\n );\n\n const locator = page.locator(\"input#input\");\n\n // Call multiple times on the same element\n const nodeId1 = await locator.backendNodeId();\n const nodeId2 = await locator.backendNodeId();\n\n // Should return the same ID (same element)\n expect(nodeId1).toBe(nodeId2);\n });\n\n test(\"returns node ID for nested elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"outer\">\n <div id=\"middle\">\n <span id=\"inner\">Deep</span>\n </div>\n </div>\n </body></html>`,\n ),\n );\n\n const outerNodeId = await page.locator(\"div#outer\").backendNodeId();\n const middleNodeId = await page.locator(\"div#middle\").backendNodeId();\n const innerNodeId = await page.locator(\"span#inner\").backendNodeId();\n\n // All should be valid and unique\n expect(outerNodeId).toBeGreaterThan(0);\n expect(middleNodeId).toBeGreaterThan(0);\n expect(innerNodeId).toBeGreaterThan(0);\n expect(new Set([outerNodeId, middleNodeId, innerNodeId]).size).toBe(3);\n });\n\n test(\"returns node ID for elements with various attributes\", 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 class=\"btn primary\" data-test=\"submit\" aria-label=\"Submit form\">Save</button>\n </body></html>`,\n ),\n );\n\n const locator = page.locator(\"button\");\n const nodeId = await locator.backendNodeId();\n\n // Should work with complex elements\n expect(typeof nodeId).toBe(\"number\");\n expect(nodeId).toBeGreaterThan(0);\n });\n\n test(\"returns node ID for form elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <form>\n <input type=\"email\" id=\"email\" placeholder=\"Email\" />\n <textarea id=\"message\"></textarea>\n <select id=\"country\">\n <option value=\"us\">USA</option>\n <option value=\"ca\">Canada</option>\n </select>\n <button type=\"submit\">Submit</button>\n </form>\n </body></html>`,\n ),\n );\n\n const emailNodeId = await page.locator(\"input#email\").backendNodeId();\n const textareaNodeId = await page\n .locator(\"textarea#message\")\n .backendNodeId();\n const selectNodeId = await page.locator(\"select#country\").backendNodeId();\n const submitNodeId = await page\n .locator(\"button[type='submit']\")\n .backendNodeId();\n\n // All form elements should have valid node IDs\n expect(emailNodeId).toBeGreaterThan(0);\n expect(textareaNodeId).toBeGreaterThan(0);\n expect(selectNodeId).toBeGreaterThan(0);\n expect(submitNodeId).toBeGreaterThan(0);\n\n // All should be unique\n const nodeIds = [emailNodeId, textareaNodeId, selectNodeId, submitNodeId];\n expect(new Set(nodeIds).size).toBe(4);\n });\n\n test(\"returns node ID for dynamically created elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"container\"></div>\n <script>\n const container = document.getElementById('container');\n const newBtn = document.createElement('button');\n newBtn.id = 'dynamic-btn';\n newBtn.textContent = 'Dynamically created';\n container.appendChild(newBtn);\n </script>\n </body></html>`,\n ),\n );\n\n const locator = page.locator(\"button#dynamic-btn\");\n const nodeId = await locator.backendNodeId();\n\n // Should work with dynamically created elements\n expect(typeof nodeId).toBe(\"number\");\n expect(nodeId).toBeGreaterThan(0);\n });\n\n test(\"returns node ID for elements with text selectors\", 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>Submit Form</button>\n </body></html>`,\n ),\n );\n\n const locator = page.locator(\"text=Submit Form\");\n const nodeId = await locator.backendNodeId();\n\n // Should work with text-based selectors\n expect(typeof nodeId).toBe(\"number\");\n expect(nodeId).toBeGreaterThan(0);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|