@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,182 @@
|
|
|
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("Page.scroll() - mouse wheel scrolling", () => {
|
|
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)("scrolls page vertically with positive deltaY", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html," + encodeURIComponent(
|
|
18
|
+
`<!doctype html><html><body style="height: 2000px;">
|
|
19
|
+
<div style="height: 400px; background: lightblue;">Section 1</div>
|
|
20
|
+
<div style="height: 400px; background: lightgreen;">Section 2</div>
|
|
21
|
+
<div style="height: 400px; background: lightyellow;">Section 3</div>
|
|
22
|
+
<div style="height: 400px; background: lightcoral;">Section 4</div>
|
|
23
|
+
<div style="height: 400px; background: lightgray;">Section 5</div>
|
|
24
|
+
</body></html>`
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
let scrollY = await page.evaluate(() => window.scrollY);
|
|
28
|
+
(0, import_test.expect)(scrollY).toBe(0);
|
|
29
|
+
await page.scroll(640, 400, 0, 300);
|
|
30
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
31
|
+
scrollY = await page.evaluate(() => window.scrollY);
|
|
32
|
+
(0, import_test.expect)(scrollY).toBeGreaterThan(0);
|
|
33
|
+
});
|
|
34
|
+
(0, import_test.test)("scrolls page horizontally with positive deltaX", async () => {
|
|
35
|
+
const page = v3.context.pages()[0];
|
|
36
|
+
await page.goto(
|
|
37
|
+
"data:text/html," + encodeURIComponent(
|
|
38
|
+
`<!doctype html><html><body style="width: 2000px; height: 600px;">
|
|
39
|
+
<div style="display: inline-block; width: 400px; height: 100%; background: lightblue;">Section 1</div>
|
|
40
|
+
<div style="display: inline-block; width: 400px; height: 100%; background: lightgreen;">Section 2</div>
|
|
41
|
+
<div style="display: inline-block; width: 400px; height: 100%; background: lightyellow;">Section 3</div>
|
|
42
|
+
<div style="display: inline-block; width: 400px; height: 100%; background: lightcoral;">Section 4</div>
|
|
43
|
+
<div style="display: inline-block; width: 400px; height: 100%; background: lightgray;">Section 5</div>
|
|
44
|
+
</body></html>`
|
|
45
|
+
)
|
|
46
|
+
);
|
|
47
|
+
let scrollX = await page.evaluate(() => window.scrollX);
|
|
48
|
+
(0, import_test.expect)(scrollX).toBe(0);
|
|
49
|
+
await page.scroll(640, 400, 300, 0);
|
|
50
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
51
|
+
scrollX = await page.evaluate(() => window.scrollX);
|
|
52
|
+
(0, import_test.expect)(scrollX).toBeGreaterThan(0);
|
|
53
|
+
});
|
|
54
|
+
(0, import_test.test)("scrolls in both directions simultaneously", async () => {
|
|
55
|
+
const page = v3.context.pages()[0];
|
|
56
|
+
await page.goto(
|
|
57
|
+
"data:text/html," + encodeURIComponent(
|
|
58
|
+
`<!doctype html><html><body style="width: 2000px; height: 2000px;">
|
|
59
|
+
<div style="width: 100%; height: 100%; background: linear-gradient(135deg, lightblue, lightcoral);">
|
|
60
|
+
Diagonal content
|
|
61
|
+
</div>
|
|
62
|
+
</body></html>`
|
|
63
|
+
)
|
|
64
|
+
);
|
|
65
|
+
await page.scroll(640, 400, 200, 200);
|
|
66
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
67
|
+
const scrollPos = await page.evaluate(() => ({
|
|
68
|
+
x: window.scrollX,
|
|
69
|
+
y: window.scrollY
|
|
70
|
+
}));
|
|
71
|
+
(0, import_test.expect)(scrollPos.x).toBeGreaterThan(0);
|
|
72
|
+
(0, import_test.expect)(scrollPos.y).toBeGreaterThan(0);
|
|
73
|
+
});
|
|
74
|
+
(0, import_test.test)("scrolls at specific coordinate on page", async () => {
|
|
75
|
+
const page = v3.context.pages()[0];
|
|
76
|
+
await page.goto(
|
|
77
|
+
"data:text/html," + encodeURIComponent(
|
|
78
|
+
`<!doctype html><html><body style="height: 2000px;">
|
|
79
|
+
<div id="marker" style="position: fixed; top: 400px; left: 640px; width: 2px; height: 2px; background: red;"></div>
|
|
80
|
+
<div style="height: 500px; background: lightblue;">Top</div>
|
|
81
|
+
<div style="height: 500px; background: lightgreen;">Middle</div>
|
|
82
|
+
<div style="height: 500px; background: lightyellow;">Bottom</div>
|
|
83
|
+
</body></html>`
|
|
84
|
+
)
|
|
85
|
+
);
|
|
86
|
+
await page.scroll(640, 400, 0, 400);
|
|
87
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
88
|
+
const scrollY = await page.evaluate(() => window.scrollY);
|
|
89
|
+
(0, import_test.expect)(scrollY).toBeGreaterThan(0);
|
|
90
|
+
});
|
|
91
|
+
(0, import_test.test)("scrolls with large deltaY values", async () => {
|
|
92
|
+
const page = v3.context.pages()[0];
|
|
93
|
+
await page.goto(
|
|
94
|
+
"data:text/html," + encodeURIComponent(
|
|
95
|
+
`<!doctype html><html><body style="height: 5000px;">
|
|
96
|
+
<div style="height: 1000px; background: lightblue;">Section 1</div>
|
|
97
|
+
<div style="height: 1000px; background: lightgreen;">Section 2</div>
|
|
98
|
+
<div style="height: 1000px; background: lightyellow;">Section 3</div>
|
|
99
|
+
<div style="height: 1000px; background: lightcoral;">Section 4</div>
|
|
100
|
+
<div style="height: 1000px; background: lightgray;">Section 5</div>
|
|
101
|
+
</body></html>`
|
|
102
|
+
)
|
|
103
|
+
);
|
|
104
|
+
await page.scroll(640, 400, 0, 1e3);
|
|
105
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
106
|
+
const scrollY = await page.evaluate(() => window.scrollY);
|
|
107
|
+
(0, import_test.expect)(scrollY).toBeGreaterThan(500);
|
|
108
|
+
});
|
|
109
|
+
(0, import_test.test)("negative deltaY scrolls up", async () => {
|
|
110
|
+
const page = v3.context.pages()[0];
|
|
111
|
+
await page.goto(
|
|
112
|
+
"data:text/html," + encodeURIComponent(
|
|
113
|
+
`<!doctype html><html><body style="height: 2000px;">
|
|
114
|
+
<div style="height: 500px; background: lightblue;">Top</div>
|
|
115
|
+
<div style="height: 500px; background: lightgreen;">Middle 1</div>
|
|
116
|
+
<div style="height: 500px; background: lightyellow;">Middle 2</div>
|
|
117
|
+
<div style="height: 500px; background: lightcoral;">Bottom</div>
|
|
118
|
+
</body></html>`
|
|
119
|
+
)
|
|
120
|
+
);
|
|
121
|
+
await page.scroll(640, 400, 0, 500);
|
|
122
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
123
|
+
let scrollY = await page.evaluate(() => window.scrollY);
|
|
124
|
+
const scrolledDown = scrollY;
|
|
125
|
+
(0, import_test.expect)(scrolledDown).toBeGreaterThan(0);
|
|
126
|
+
await page.scroll(640, 400, 0, -300);
|
|
127
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
128
|
+
scrollY = await page.evaluate(() => window.scrollY);
|
|
129
|
+
(0, import_test.expect)(scrollY).toBeLessThan(scrolledDown);
|
|
130
|
+
});
|
|
131
|
+
(0, import_test.test)("scroll returns xpath when requested", async () => {
|
|
132
|
+
const page = v3.context.pages()[0];
|
|
133
|
+
await page.goto(
|
|
134
|
+
"data:text/html," + encodeURIComponent(
|
|
135
|
+
`<!doctype html><html><body style="height: 2000px; margin: 0; padding: 0;">
|
|
136
|
+
<div id="target" style="position: absolute; top: 0px; left: 400px; width: 300px; height: 100px; background: blue;">
|
|
137
|
+
Target element
|
|
138
|
+
</div>
|
|
139
|
+
<p style="position: absolute; top: 200px; left: 0px;">Content below</p>
|
|
140
|
+
</body></html>`
|
|
141
|
+
)
|
|
142
|
+
);
|
|
143
|
+
const xpath = await page.scroll(550, 50, 0, 200, { returnXpath: true });
|
|
144
|
+
(0, import_test.expect)(typeof xpath).toBe("string");
|
|
145
|
+
(0, import_test.expect)(xpath.length).toBeGreaterThan(0);
|
|
146
|
+
(0, import_test.expect)(xpath.toLowerCase()).toMatch(/div|target/);
|
|
147
|
+
});
|
|
148
|
+
(0, import_test.test)("scroll without returnXpath returns empty string", async () => {
|
|
149
|
+
const page = v3.context.pages()[0];
|
|
150
|
+
await page.goto(
|
|
151
|
+
"data:text/html," + encodeURIComponent(
|
|
152
|
+
`<!doctype html><html><body style="height: 2000px;">
|
|
153
|
+
<div style="height: 500px; background: lightblue;">Content</div>
|
|
154
|
+
</body></html>`
|
|
155
|
+
)
|
|
156
|
+
);
|
|
157
|
+
const result = await page.scroll(640, 400, 0, 200);
|
|
158
|
+
(0, import_test.expect)(result).toBe("");
|
|
159
|
+
});
|
|
160
|
+
(0, import_test.test)("multiple sequential scrolls accumulate", async () => {
|
|
161
|
+
const page = v3.context.pages()[0];
|
|
162
|
+
await page.goto(
|
|
163
|
+
"data:text/html," + encodeURIComponent(
|
|
164
|
+
`<!doctype html><html><body style="height: 3000px;">
|
|
165
|
+
<div style="height: 750px; background: lightblue;">Section 1</div>
|
|
166
|
+
<div style="height: 750px; background: lightgreen;">Section 2</div>
|
|
167
|
+
<div style="height: 750px; background: lightyellow;">Section 3</div>
|
|
168
|
+
<div style="height: 750px; background: lightcoral;">Section 4</div>
|
|
169
|
+
</body></html>`
|
|
170
|
+
)
|
|
171
|
+
);
|
|
172
|
+
await page.scroll(640, 400, 0, 200);
|
|
173
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
174
|
+
const after1 = await page.evaluate(() => window.scrollY);
|
|
175
|
+
(0, import_test.expect)(after1).toBeGreaterThan(0);
|
|
176
|
+
await page.scroll(640, 400, 0, 200);
|
|
177
|
+
await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));
|
|
178
|
+
const after2 = await page.evaluate(() => window.scrollY);
|
|
179
|
+
(0, import_test.expect)(after2).toBeGreaterThan(after1);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
//# sourceMappingURL=page-scroll.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/page-scroll.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Page.scroll() - mouse wheel scrolling\", () => {\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(\"scrolls page vertically with positive deltaY\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 2000px;\">\n <div style=\"height: 400px; background: lightblue;\">Section 1</div>\n <div style=\"height: 400px; background: lightgreen;\">Section 2</div>\n <div style=\"height: 400px; background: lightyellow;\">Section 3</div>\n <div style=\"height: 400px; background: lightcoral;\">Section 4</div>\n <div style=\"height: 400px; background: lightgray;\">Section 5</div>\n </body></html>`,\n ),\n );\n\n // Get initial scroll position\n let scrollY = await page.evaluate(() => window.scrollY);\n expect(scrollY).toBe(0);\n\n // Scroll down (positive deltaY)\n await page.scroll(640, 400, 0, 300);\n\n // Wait for scroll to complete\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n // Check that we've scrolled down\n scrollY = await page.evaluate(() => window.scrollY);\n expect(scrollY).toBeGreaterThan(0);\n });\n\n test(\"scrolls page horizontally with positive deltaX\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"width: 2000px; height: 600px;\">\n <div style=\"display: inline-block; width: 400px; height: 100%; background: lightblue;\">Section 1</div>\n <div style=\"display: inline-block; width: 400px; height: 100%; background: lightgreen;\">Section 2</div>\n <div style=\"display: inline-block; width: 400px; height: 100%; background: lightyellow;\">Section 3</div>\n <div style=\"display: inline-block; width: 400px; height: 100%; background: lightcoral;\">Section 4</div>\n <div style=\"display: inline-block; width: 400px; height: 100%; background: lightgray;\">Section 5</div>\n </body></html>`,\n ),\n );\n\n let scrollX = await page.evaluate(() => window.scrollX);\n expect(scrollX).toBe(0);\n\n // Scroll right (positive deltaX)\n await page.scroll(640, 400, 300, 0);\n\n // Wait for scroll to complete\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n // Check that we've scrolled right\n scrollX = await page.evaluate(() => window.scrollX);\n expect(scrollX).toBeGreaterThan(0);\n });\n\n test(\"scrolls in both directions simultaneously\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"width: 2000px; height: 2000px;\">\n <div style=\"width: 100%; height: 100%; background: linear-gradient(135deg, lightblue, lightcoral);\">\n Diagonal content\n </div>\n </body></html>`,\n ),\n );\n\n // Scroll both horizontally and vertically\n await page.scroll(640, 400, 200, 200);\n\n // Wait for scroll to complete\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n // Check both directions changed\n const scrollPos = await page.evaluate(() => ({\n x: window.scrollX,\n y: window.scrollY,\n }));\n\n expect(scrollPos.x).toBeGreaterThan(0);\n expect(scrollPos.y).toBeGreaterThan(0);\n });\n\n test(\"scrolls at specific coordinate on page\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 2000px;\">\n <div id=\"marker\" style=\"position: fixed; top: 400px; left: 640px; width: 2px; height: 2px; background: red;\"></div>\n <div style=\"height: 500px; background: lightblue;\">Top</div>\n <div style=\"height: 500px; background: lightgreen;\">Middle</div>\n <div style=\"height: 500px; background: lightyellow;\">Bottom</div>\n </body></html>`,\n ),\n );\n\n // Scroll from specific coordinates\n await page.scroll(640, 400, 0, 400);\n\n // Wait for scroll to complete\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n // Verify scroll happened\n const scrollY = await page.evaluate(() => window.scrollY);\n expect(scrollY).toBeGreaterThan(0);\n });\n\n test(\"scrolls with large deltaY values\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 5000px;\">\n <div style=\"height: 1000px; background: lightblue;\">Section 1</div>\n <div style=\"height: 1000px; background: lightgreen;\">Section 2</div>\n <div style=\"height: 1000px; background: lightyellow;\">Section 3</div>\n <div style=\"height: 1000px; background: lightcoral;\">Section 4</div>\n <div style=\"height: 1000px; background: lightgray;\">Section 5</div>\n </body></html>`,\n ),\n );\n\n // Scroll with large delta\n await page.scroll(640, 400, 0, 1000);\n\n // Wait for scroll to complete\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n // Should scroll significantly\n const scrollY = await page.evaluate(() => window.scrollY);\n expect(scrollY).toBeGreaterThan(500);\n });\n\n test(\"negative deltaY scrolls up\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 2000px;\">\n <div style=\"height: 500px; background: lightblue;\">Top</div>\n <div style=\"height: 500px; background: lightgreen;\">Middle 1</div>\n <div style=\"height: 500px; background: lightyellow;\">Middle 2</div>\n <div style=\"height: 500px; background: lightcoral;\">Bottom</div>\n </body></html>`,\n ),\n );\n\n // First scroll down\n await page.scroll(640, 400, 0, 500);\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n let scrollY = await page.evaluate(() => window.scrollY);\n const scrolledDown = scrollY;\n expect(scrolledDown).toBeGreaterThan(0);\n\n // Now scroll up (negative delta)\n await page.scroll(640, 400, 0, -300);\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n scrollY = await page.evaluate(() => window.scrollY);\n expect(scrollY).toBeLessThan(scrolledDown);\n });\n\n test(\"scroll returns xpath when requested\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 2000px; margin: 0; padding: 0;\">\n <div id=\"target\" style=\"position: absolute; top: 0px; left: 400px; width: 300px; height: 100px; background: blue;\">\n Target element\n </div>\n <p style=\"position: absolute; top: 200px; left: 0px;\">Content below</p>\n </body></html>`,\n ),\n );\n\n // Scroll at coordinate (550, 50) which should be directly over the target div\n // div spans: left 400-700px, top 0-100px\n // coordinate 550,50 is within that range\n const xpath = await page.scroll(550, 50, 0, 200, { returnXpath: true });\n\n // Should return a non-empty xpath string for the element at that coordinate\n expect(typeof xpath).toBe(\"string\");\n expect(xpath.length).toBeGreaterThan(0);\n // Xpath should reference the div or contain \"target\"\n expect(xpath.toLowerCase()).toMatch(/div|target/);\n });\n\n test(\"scroll without returnXpath returns empty string\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 2000px;\">\n <div style=\"height: 500px; background: lightblue;\">Content</div>\n </body></html>`,\n ),\n );\n\n // Scroll without returnXpath\n const result = await page.scroll(640, 400, 0, 200);\n\n // Should return empty string\n expect(result).toBe(\"\");\n });\n\n test(\"multiple sequential scrolls accumulate\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body style=\"height: 3000px;\">\n <div style=\"height: 750px; background: lightblue;\">Section 1</div>\n <div style=\"height: 750px; background: lightgreen;\">Section 2</div>\n <div style=\"height: 750px; background: lightyellow;\">Section 3</div>\n <div style=\"height: 750px; background: lightcoral;\">Section 4</div>\n </body></html>`,\n ),\n );\n\n // First scroll\n await page.scroll(640, 400, 0, 200);\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n const after1 = await page.evaluate(() => window.scrollY);\n expect(after1).toBeGreaterThan(0);\n\n // Second scroll\n await page.scroll(640, 400, 0, 200);\n await page.evaluate(() => new Promise((r) => setTimeout(r, 200)));\n\n const after2 = await page.evaluate(() => window.scrollY);\n\n expect(after2).toBeGreaterThan(after1);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
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("Page sendCDP method", () => {
|
|
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)("sends CDP commands and requires domain to be enabled first", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto("https://example.com");
|
|
17
|
+
await (0, import_test.expect)(
|
|
18
|
+
page.sendCDP("WebAuthn.addVirtualAuthenticator", {
|
|
19
|
+
options: {
|
|
20
|
+
protocol: "ctap2",
|
|
21
|
+
transport: "usb",
|
|
22
|
+
hasResidentKey: false,
|
|
23
|
+
hasUserVerification: false,
|
|
24
|
+
isUserVerified: false
|
|
25
|
+
}
|
|
26
|
+
})
|
|
27
|
+
).rejects.toThrow();
|
|
28
|
+
await page.sendCDP("WebAuthn.enable");
|
|
29
|
+
const result = await page.sendCDP(
|
|
30
|
+
"WebAuthn.addVirtualAuthenticator",
|
|
31
|
+
{
|
|
32
|
+
options: {
|
|
33
|
+
protocol: "ctap2",
|
|
34
|
+
transport: "usb",
|
|
35
|
+
hasResidentKey: false,
|
|
36
|
+
hasUserVerification: false,
|
|
37
|
+
isUserVerified: false
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
(0, import_test.expect)(result).toHaveProperty("authenticatorId");
|
|
42
|
+
(0, import_test.expect)(typeof result.authenticatorId).toBe("string");
|
|
43
|
+
(0, import_test.expect)(result.authenticatorId.length).toBeGreaterThan(0);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=page-send-cdp.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/page-send-cdp.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Page sendCDP method\", () => {\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(\"sends CDP commands and requires domain to be enabled first\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\"https://example.com\");\n\n // Try to add a virtual authenticator without enabling WebAuthn first\n // This should fail because the domain needs to be enabled\n await expect(\n page.sendCDP(\"WebAuthn.addVirtualAuthenticator\", {\n options: {\n protocol: \"ctap2\",\n transport: \"usb\",\n hasResidentKey: false,\n hasUserVerification: false,\n isUserVerified: false,\n },\n }),\n ).rejects.toThrow();\n\n // Enable the WebAuthn domain\n await page.sendCDP(\"WebAuthn.enable\");\n\n // Now adding a virtual authenticator should succeed\n const result = await page.sendCDP<{ authenticatorId: string }>(\n \"WebAuthn.addVirtualAuthenticator\",\n {\n options: {\n protocol: \"ctap2\",\n transport: \"usb\",\n hasResidentKey: false,\n hasUserVerification: false,\n isUserVerified: false,\n },\n },\n );\n\n // Verify we got an authenticator ID back\n expect(result).toHaveProperty(\"authenticatorId\");\n expect(typeof result.authenticatorId).toBe(\"string\");\n expect(result.authenticatorId.length).toBeGreaterThan(0);\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,uBAA6B;AAE7B,iBAAK,SAAS,uBAAuB,MAAM;AACzC,MAAI;AAEJ,mBAAK,WAAW,YAAY;AAC1B,SAAK,IAAI,aAAG,6BAAY;AACxB,UAAM,GAAG,KAAK;AAAA,EAChB,CAAC;AAED,mBAAK,UAAU,YAAY;AACzB,UAAM,IAAI,QAAQ,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAAA,EACpC,CAAC;AAED,wBAAK,8DAA8D,YAAY;AAC7E,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK,KAAK,qBAAqB;AAIrC,cAAM;AAAA,MACJ,KAAK,QAAQ,oCAAoC;AAAA,QAC/C,SAAS;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,qBAAqB;AAAA,UACrB,gBAAgB;AAAA,QAClB;AAAA,MACF,CAAC;AAAA,IACH,EAAE,QAAQ,QAAQ;AAGlB,UAAM,KAAK,QAAQ,iBAAiB;AAGpC,UAAM,SAAS,MAAM,KAAK;AAAA,MACxB;AAAA,MACA;AAAA,QACE,SAAS;AAAA,UACP,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,qBAAqB;AAAA,UACrB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAGA,4BAAO,MAAM,EAAE,eAAe,iBAAiB;AAC/C,4BAAO,OAAO,OAAO,eAAe,EAAE,KAAK,QAAQ;AACnD,4BAAO,OAAO,gBAAgB,MAAM,EAAE,gBAAgB,CAAC;AAAA,EACzD,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
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_actHandlerUtils = require("../handlers/handlerUtils/actHandlerUtils.js");
|
|
5
|
+
var import_testUtils = require("./testUtils.js");
|
|
6
|
+
import_test.test.describe("tests performUnderstudyMethod", () => {
|
|
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)("tests that clicking works", async () => {
|
|
16
|
+
const page = v3.context.pages()[0];
|
|
17
|
+
await page.goto(
|
|
18
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/no-js-click/"
|
|
19
|
+
);
|
|
20
|
+
await (0, import_actHandlerUtils.performUnderstudyMethod)(
|
|
21
|
+
page,
|
|
22
|
+
page.mainFrame(),
|
|
23
|
+
"click",
|
|
24
|
+
"/html/body/button",
|
|
25
|
+
[],
|
|
26
|
+
3e4
|
|
27
|
+
);
|
|
28
|
+
const isVisible = await page.locator("#success-msg").isVisible();
|
|
29
|
+
(0, import_test.expect)(isVisible).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
(0, import_test.test)("fill sets input value", async () => {
|
|
32
|
+
const page = v3.context.pages()[0];
|
|
33
|
+
await page.goto(
|
|
34
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/login/"
|
|
35
|
+
);
|
|
36
|
+
await (0, import_actHandlerUtils.performUnderstudyMethod)(
|
|
37
|
+
page,
|
|
38
|
+
page.mainFrame(),
|
|
39
|
+
"fill",
|
|
40
|
+
"/html/body/main/form/div[1]/input",
|
|
41
|
+
["Alice"],
|
|
42
|
+
3e4
|
|
43
|
+
);
|
|
44
|
+
const textContent = await page.locator("/html/body/main/form/div[1]/input").inputValue();
|
|
45
|
+
(0, import_test.expect)(textContent).toBe("Alice");
|
|
46
|
+
});
|
|
47
|
+
(0, import_test.test)("tests that key presses work", async () => {
|
|
48
|
+
const page = v3.context.pages()[0];
|
|
49
|
+
await page.goto(
|
|
50
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/key-press/"
|
|
51
|
+
);
|
|
52
|
+
await (0, import_actHandlerUtils.performUnderstudyMethod)(
|
|
53
|
+
page,
|
|
54
|
+
page.mainFrame(),
|
|
55
|
+
"press",
|
|
56
|
+
"xpath=/html",
|
|
57
|
+
["Enter"],
|
|
58
|
+
3e4
|
|
59
|
+
);
|
|
60
|
+
const textContent = await page.locator("/html/body/div/div/h1").textContent();
|
|
61
|
+
(0, import_test.expect)(textContent).toContain("Enter");
|
|
62
|
+
});
|
|
63
|
+
(0, import_test.test)("tests select option from a dropdown", async () => {
|
|
64
|
+
const page = v3.context.pages()[0];
|
|
65
|
+
await page.goto(
|
|
66
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/nested-dropdown/"
|
|
67
|
+
);
|
|
68
|
+
await (0, import_actHandlerUtils.performUnderstudyMethod)(
|
|
69
|
+
page,
|
|
70
|
+
page.mainFrame(),
|
|
71
|
+
"selectOptionFromDropdown",
|
|
72
|
+
"xpath=//*[@id='licenseType']",
|
|
73
|
+
["Smog Check Technician"],
|
|
74
|
+
3e4
|
|
75
|
+
);
|
|
76
|
+
const inputValue = await page.locator("#licenseType >> option:checked").textContent();
|
|
77
|
+
(0, import_test.expect)(inputValue).toBe("Smog Check Technician");
|
|
78
|
+
});
|
|
79
|
+
(0, import_test.test)("tests drag & drop works (start xpath & end xpath)", async () => {
|
|
80
|
+
const page = v3.context.pages()[0];
|
|
81
|
+
await page.goto(
|
|
82
|
+
"https://browserbase.github.io/stagehand-eval-sites/sites/drag-drop/"
|
|
83
|
+
);
|
|
84
|
+
await (0, import_actHandlerUtils.performUnderstudyMethod)(
|
|
85
|
+
page,
|
|
86
|
+
page.mainFrame(),
|
|
87
|
+
"dragAndDrop",
|
|
88
|
+
"xpath=/html/body/div/section[1]/div[1]/div[1]",
|
|
89
|
+
// start xpath
|
|
90
|
+
["/html/body/div/section[2]/div/div[1]"],
|
|
91
|
+
// end xpath
|
|
92
|
+
3e4
|
|
93
|
+
);
|
|
94
|
+
const droppedContent = await page.locator("/html/body/div/section[2]/div/div[1]/div").textContent();
|
|
95
|
+
(0, import_test.expect)(droppedContent).toBe("TEXT: Hello from text");
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
//# sourceMappingURL=perform-understudy-method.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/perform-understudy-method.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { performUnderstudyMethod } from \"../handlers/handlerUtils/actHandlerUtils.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"tests performUnderstudyMethod\", () => {\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(\"tests that clicking works\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/no-js-click/\",\n );\n\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"click\",\n \"/html/body/button\",\n [],\n 30000,\n );\n\n const isVisible = await page.locator(\"#success-msg\").isVisible();\n expect(isVisible).toBe(true);\n });\n\n test(\"fill sets input value\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/login/\",\n );\n\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"fill\",\n \"/html/body/main/form/div[1]/input\",\n [\"Alice\"],\n 30000,\n );\n\n const textContent = await page\n .locator(\"/html/body/main/form/div[1]/input\")\n .inputValue();\n expect(textContent).toBe(\"Alice\");\n });\n\n test(\"tests that key presses work\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/key-press/\",\n );\n\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"press\",\n \"xpath=/html\",\n [\"Enter\"],\n 30000,\n );\n\n const textContent = await page\n .locator(\"/html/body/div/div/h1\")\n .textContent();\n expect(textContent).toContain(\"Enter\");\n });\n\n test(\"tests select option from a dropdown\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/nested-dropdown/\",\n );\n\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"selectOptionFromDropdown\",\n \"xpath=//*[@id='licenseType']\",\n [\"Smog Check Technician\"],\n 30000,\n );\n\n const inputValue = await page\n .locator(\"#licenseType >> option:checked\")\n .textContent();\n expect(inputValue).toBe(\"Smog Check Technician\");\n });\n\n test(\"tests drag & drop works (start xpath & end xpath)\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\n \"https://browserbase.github.io/stagehand-eval-sites/sites/drag-drop/\",\n );\n\n await performUnderstudyMethod(\n page,\n page.mainFrame(),\n \"dragAndDrop\",\n \"xpath=/html/body/div/section[1]/div[1]/div[1]\", // start xpath\n [\"/html/body/div/section[2]/div/div[1]\"], // end xpath\n 30000,\n );\n\n const droppedContent = await page\n .locator(\"/html/body/div/section[2]/div/div[1]/div\")\n .textContent();\n expect(droppedContent).toBe(\"TEXT: Hello from text\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,+BAAoC;AACpC,6BAAwC;AACxC,uBAAwB;AAExB,iBAAK,SAAS,iCAAiC,MAAM;AACnD,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,6BAA6B,YAAY;AAC5C,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,cAAM;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IACF;AAEA,UAAM,YAAY,MAAM,KAAK,QAAQ,cAAc,EAAE,UAAU;AAC/D,4BAAO,SAAS,EAAE,KAAK,IAAI;AAAA,EAC7B,CAAC;AAED,wBAAK,yBAAyB,YAAY;AACxC,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,cAAM;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,CAAC,OAAO;AAAA,MACR;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,KACvB,QAAQ,mCAAmC,EAC3C,WAAW;AACd,4BAAO,WAAW,EAAE,KAAK,OAAO;AAAA,EAClC,CAAC;AAED,wBAAK,+BAA+B,YAAY;AAC9C,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,cAAM;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,CAAC,OAAO;AAAA,MACR;AAAA,IACF;AAEA,UAAM,cAAc,MAAM,KACvB,QAAQ,uBAAuB,EAC/B,YAAY;AACf,4BAAO,WAAW,EAAE,UAAU,OAAO;AAAA,EACvC,CAAC;AAED,wBAAK,uCAAuC,YAAY;AACtD,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,cAAM;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA,CAAC,uBAAuB;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KACtB,QAAQ,gCAAgC,EACxC,YAAY;AACf,4BAAO,UAAU,EAAE,KAAK,uBAAuB;AAAA,EACjD,CAAC;AAED,wBAAK,qDAAqD,YAAY;AACpE,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AACjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,cAAM;AAAA,MACJ;AAAA,MACA,KAAK,UAAU;AAAA,MACf;AAAA,MACA;AAAA;AAAA,MACA,CAAC,sCAAsC;AAAA;AAAA,MACvC;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM,KAC1B,QAAQ,0CAA0C,EAClD,YAAY;AACf,4BAAO,cAAc,EAAE,KAAK,uBAAuB;AAAA,EACrD,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
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_buffer = require("buffer");
|
|
25
|
+
var import_fs = require("fs");
|
|
26
|
+
var import_path = __toESM(require("path"), 1);
|
|
27
|
+
var import_crypto = __toESM(require("crypto"), 1);
|
|
28
|
+
var import_v3 = require("../v3.js");
|
|
29
|
+
var import_v3_config = require("./v3.config.js");
|
|
30
|
+
const FILE_UPLOAD_IFRAME_URL = "https://browserbase.github.io/stagehand-eval-sites/sites/file-uploads-iframe/";
|
|
31
|
+
const FILE_UPLOAD_V2_URL = "https://browserbase.github.io/stagehand-eval-sites/sites/file-uploads-2/";
|
|
32
|
+
const RESUME_INPUT = "#resumeUpload";
|
|
33
|
+
const RESUME_SUCCESS = "#resumeSuccess";
|
|
34
|
+
const IMAGES_INPUT = "#imagesUpload";
|
|
35
|
+
const IMAGES_SUCCESS = "#imagesSuccess";
|
|
36
|
+
const AUDIO_INPUT = "#audioUpload";
|
|
37
|
+
const AUDIO_SUCCESS = "#audioSuccess";
|
|
38
|
+
const IFRAME_UPLOAD_INPUT = "/html/body/div/iframe/html/body/div/div[1]/input";
|
|
39
|
+
const IFRAME_SUCCESS = "body > div > iframe >> html > body > div > div:nth-of-type(2)";
|
|
40
|
+
import_test.test.describe("tests setInputFiles()", () => {
|
|
41
|
+
let v3;
|
|
42
|
+
const fixtures = [];
|
|
43
|
+
import_test.test.beforeEach(async () => {
|
|
44
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
45
|
+
await v3.init();
|
|
46
|
+
});
|
|
47
|
+
import_test.test.afterEach(async () => {
|
|
48
|
+
await v3?.close?.().catch(() => {
|
|
49
|
+
});
|
|
50
|
+
await Promise.all(
|
|
51
|
+
fixtures.splice(0).map((file) => import_fs.promises.unlink(file).catch(() => {
|
|
52
|
+
}))
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
const createFixture = async (namePrefix, contents, ext = ".txt") => {
|
|
56
|
+
const normalizedExt = ext.startsWith(".") ? ext : `.${ext}`;
|
|
57
|
+
const filename = `${namePrefix}-${import_crypto.default.randomBytes(4).toString("hex")}${normalizedExt}`;
|
|
58
|
+
const filePath = import_path.default.resolve(process.cwd(), filename);
|
|
59
|
+
await import_fs.promises.writeFile(filePath, contents, "utf-8");
|
|
60
|
+
fixtures.push(filePath);
|
|
61
|
+
return filePath;
|
|
62
|
+
};
|
|
63
|
+
const expectUploadSuccess = async (page, successSelector, expectedText) => {
|
|
64
|
+
await import_test.expect.poll(
|
|
65
|
+
() => page.evaluate((selector) => {
|
|
66
|
+
const el = document.querySelector(selector);
|
|
67
|
+
if (!el) return "";
|
|
68
|
+
const display = window.getComputedStyle(el).display;
|
|
69
|
+
if (display === "none") return "";
|
|
70
|
+
return el.textContent ?? "";
|
|
71
|
+
}, successSelector),
|
|
72
|
+
{ message: `wait for success message at ${successSelector}` }
|
|
73
|
+
).toContain(expectedText);
|
|
74
|
+
};
|
|
75
|
+
const getInputFileCount = async (page, inputSelector) => {
|
|
76
|
+
return await page.evaluate((selector) => {
|
|
77
|
+
const el = document.querySelector(selector);
|
|
78
|
+
if (!(el instanceof HTMLInputElement)) return 0;
|
|
79
|
+
return el.files?.length ?? 0;
|
|
80
|
+
}, inputSelector);
|
|
81
|
+
};
|
|
82
|
+
const expectFileCount = async (page, inputSelector, expected) => {
|
|
83
|
+
await import_test.expect.poll(() => getInputFileCount(page, inputSelector), {
|
|
84
|
+
message: `wait for file count on ${inputSelector}`
|
|
85
|
+
}).toBe(expected);
|
|
86
|
+
};
|
|
87
|
+
(0, import_test.test)("deepLocator uploads and validates within iframe", async () => {
|
|
88
|
+
const page = v3.context.pages()[0];
|
|
89
|
+
await page.goto(FILE_UPLOAD_IFRAME_URL);
|
|
90
|
+
const fixture = await createFixture(
|
|
91
|
+
"iframe-upload",
|
|
92
|
+
"<p>iframe upload</p>",
|
|
93
|
+
".txt"
|
|
94
|
+
);
|
|
95
|
+
await page.deepLocator(IFRAME_UPLOAD_INPUT).setInputFiles(import_path.default.relative(process.cwd(), fixture));
|
|
96
|
+
const successLocator = page.deepLocator(IFRAME_SUCCESS);
|
|
97
|
+
await import_test.expect.poll(async () => await successLocator.textContent() ?? "", {
|
|
98
|
+
message: "wait for iframe upload success"
|
|
99
|
+
}).toContain("file uploaded successfully");
|
|
100
|
+
});
|
|
101
|
+
(0, import_test.test)("locator uploads resume via relative path string", async () => {
|
|
102
|
+
const page = v3.context.pages()[0];
|
|
103
|
+
await page.goto(FILE_UPLOAD_V2_URL);
|
|
104
|
+
const fixture = await createFixture("resume", "<p>resume</p>", ".pdf");
|
|
105
|
+
await page.locator(RESUME_INPUT).setInputFiles(import_path.default.relative(process.cwd(), fixture));
|
|
106
|
+
await expectUploadSuccess(page, RESUME_SUCCESS, "Resume uploaded!");
|
|
107
|
+
await expectFileCount(page, RESUME_INPUT, 1);
|
|
108
|
+
});
|
|
109
|
+
(0, import_test.test)("locator uploads multiple images via absolute paths", async () => {
|
|
110
|
+
const page = v3.context.pages()[0];
|
|
111
|
+
await page.goto(FILE_UPLOAD_V2_URL);
|
|
112
|
+
const first = await createFixture("image-a", "<p>A</p>", ".png");
|
|
113
|
+
const second = await createFixture("image-b", "<p>B</p>", ".jpeg");
|
|
114
|
+
await page.locator(IMAGES_INPUT).setInputFiles([first, second]);
|
|
115
|
+
await expectUploadSuccess(page, IMAGES_SUCCESS, "Images uploaded!");
|
|
116
|
+
await expectFileCount(page, IMAGES_INPUT, 2);
|
|
117
|
+
});
|
|
118
|
+
(0, import_test.test)("locator uploads audio via payload object", async () => {
|
|
119
|
+
const page = v3.context.pages()[0];
|
|
120
|
+
await page.goto(FILE_UPLOAD_V2_URL);
|
|
121
|
+
await page.locator(AUDIO_INPUT).setInputFiles({
|
|
122
|
+
name: "voice-sample.mp3",
|
|
123
|
+
mimeType: "audio/mpeg",
|
|
124
|
+
buffer: import_buffer.Buffer.from("fake audio bytes", "utf-8")
|
|
125
|
+
});
|
|
126
|
+
await expectUploadSuccess(page, AUDIO_SUCCESS, "Audio file uploaded!");
|
|
127
|
+
await expectFileCount(page, AUDIO_INPUT, 1);
|
|
128
|
+
});
|
|
129
|
+
(0, import_test.test)("locator uploads multiple payload objects to images input", async () => {
|
|
130
|
+
const page = v3.context.pages()[0];
|
|
131
|
+
await page.goto(FILE_UPLOAD_V2_URL);
|
|
132
|
+
await page.locator(IMAGES_INPUT).setInputFiles([
|
|
133
|
+
{
|
|
134
|
+
name: "payload-a.png",
|
|
135
|
+
mimeType: "image/png",
|
|
136
|
+
buffer: import_buffer.Buffer.from("payload-a", "utf-8")
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
name: "payload-b.png",
|
|
140
|
+
mimeType: "image/png",
|
|
141
|
+
buffer: import_buffer.Buffer.from("payload-b", "utf-8")
|
|
142
|
+
}
|
|
143
|
+
]);
|
|
144
|
+
await expectUploadSuccess(page, IMAGES_SUCCESS, "Images uploaded!");
|
|
145
|
+
await expectFileCount(page, IMAGES_INPUT, 2);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
//# sourceMappingURL=setinputfiles.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/setinputfiles.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { Buffer } from \"buffer\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport crypto from \"crypto\";\nimport type { Page as V3Page } from \"../understudy/page.js\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\nconst FILE_UPLOAD_IFRAME_URL =\n \"https://browserbase.github.io/stagehand-eval-sites/sites/file-uploads-iframe/\";\nconst FILE_UPLOAD_V2_URL =\n \"https://browserbase.github.io/stagehand-eval-sites/sites/file-uploads-2/\";\n\nconst RESUME_INPUT = \"#resumeUpload\";\nconst RESUME_SUCCESS = \"#resumeSuccess\";\nconst IMAGES_INPUT = \"#imagesUpload\";\nconst IMAGES_SUCCESS = \"#imagesSuccess\";\nconst AUDIO_INPUT = \"#audioUpload\";\nconst AUDIO_SUCCESS = \"#audioSuccess\";\nconst IFRAME_UPLOAD_INPUT = \"/html/body/div/iframe/html/body/div/div[1]/input\";\nconst IFRAME_SUCCESS =\n \"body > div > iframe >> html > body > div > div:nth-of-type(2)\";\n\ntest.describe(\"tests setInputFiles()\", () => {\n let v3: V3;\n const fixtures: string[] = [];\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 await Promise.all(\n fixtures.splice(0).map((file) => fs.unlink(file).catch(() => {})),\n );\n });\n\n const createFixture = async (\n namePrefix: string,\n contents: string,\n ext = \".txt\",\n ): Promise<string> => {\n const normalizedExt = ext.startsWith(\".\") ? ext : `.${ext}`;\n const filename = `${namePrefix}-${crypto.randomBytes(4).toString(\"hex\")}${normalizedExt}`;\n const filePath = path.resolve(process.cwd(), filename);\n await fs.writeFile(filePath, contents, \"utf-8\");\n fixtures.push(filePath);\n return filePath;\n };\n\n const expectUploadSuccess = async (\n page: V3Page,\n successSelector: string,\n expectedText: string,\n ) => {\n await expect\n .poll(\n () =>\n page.evaluate((selector) => {\n const el = document.querySelector(selector);\n if (!el) return \"\";\n const display = window.getComputedStyle(el).display;\n if (display === \"none\") return \"\";\n return el.textContent ?? \"\";\n }, successSelector),\n { message: `wait for success message at ${successSelector}` },\n )\n .toContain(expectedText);\n };\n\n const getInputFileCount = async (page: V3Page, inputSelector: string) => {\n return await page.evaluate((selector) => {\n const el = document.querySelector(selector);\n if (!(el instanceof HTMLInputElement)) return 0;\n return el.files?.length ?? 0;\n }, inputSelector);\n };\n\n const expectFileCount = async (\n page: V3Page,\n inputSelector: string,\n expected: number,\n ) => {\n await expect\n .poll(() => getInputFileCount(page, inputSelector), {\n message: `wait for file count on ${inputSelector}`,\n })\n .toBe(expected);\n };\n\n test(\"deepLocator uploads and validates within iframe\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(FILE_UPLOAD_IFRAME_URL);\n const fixture = await createFixture(\n \"iframe-upload\",\n \"<p>iframe upload</p>\",\n \".txt\",\n );\n await page\n .deepLocator(IFRAME_UPLOAD_INPUT)\n .setInputFiles(path.relative(process.cwd(), fixture));\n\n const successLocator = page.deepLocator(IFRAME_SUCCESS);\n await expect\n .poll(async () => (await successLocator.textContent()) ?? \"\", {\n message: \"wait for iframe upload success\",\n })\n .toContain(\"file uploaded successfully\");\n });\n\n test(\"locator uploads resume via relative path string\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(FILE_UPLOAD_V2_URL);\n const fixture = await createFixture(\"resume\", \"<p>resume</p>\", \".pdf\");\n await page\n .locator(RESUME_INPUT)\n .setInputFiles(path.relative(process.cwd(), fixture));\n await expectUploadSuccess(page, RESUME_SUCCESS, \"Resume uploaded!\");\n await expectFileCount(page, RESUME_INPUT, 1);\n });\n\n test(\"locator uploads multiple images via absolute paths\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(FILE_UPLOAD_V2_URL);\n const first = await createFixture(\"image-a\", \"<p>A</p>\", \".png\");\n const second = await createFixture(\"image-b\", \"<p>B</p>\", \".jpeg\");\n await page.locator(IMAGES_INPUT).setInputFiles([first, second]);\n await expectUploadSuccess(page, IMAGES_SUCCESS, \"Images uploaded!\");\n await expectFileCount(page, IMAGES_INPUT, 2);\n });\n\n test(\"locator uploads audio via payload object\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(FILE_UPLOAD_V2_URL);\n await page.locator(AUDIO_INPUT).setInputFiles({\n name: \"voice-sample.mp3\",\n mimeType: \"audio/mpeg\",\n buffer: Buffer.from(\"fake audio bytes\", \"utf-8\"),\n });\n await expectUploadSuccess(page, AUDIO_SUCCESS, \"Audio file uploaded!\");\n await expectFileCount(page, AUDIO_INPUT, 1);\n });\n\n test(\"locator uploads multiple payload objects to images input\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(FILE_UPLOAD_V2_URL);\n await page.locator(IMAGES_INPUT).setInputFiles([\n {\n name: \"payload-a.png\",\n mimeType: \"image/png\",\n buffer: Buffer.from(\"payload-a\", \"utf-8\"),\n },\n {\n name: \"payload-b.png\",\n mimeType: \"image/png\",\n buffer: Buffer.from(\"payload-b\", \"utf-8\"),\n },\n ]);\n await expectUploadSuccess(page, IMAGES_SUCCESS, \"Images uploaded!\");\n await expectFileCount(page, IMAGES_INPUT, 2);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs", "crypto", "path"]
|
|
7
|
+
}
|