@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,167 @@
|
|
|
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.hover() - mouse hover at coordinates", () => {
|
|
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)("hover triggers mouseover event at coordinates", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html," + encodeURIComponent(
|
|
18
|
+
`<!doctype html><html><body style="margin: 0; padding: 0;">
|
|
19
|
+
<div id="target"
|
|
20
|
+
style="position: absolute; top: 100px; left: 100px; width: 200px; height: 200px; background: lightblue;"
|
|
21
|
+
onmouseover="this.dataset.hovered='true'"
|
|
22
|
+
onmouseout="this.dataset.hovered='false'">
|
|
23
|
+
Hover Me
|
|
24
|
+
</div>
|
|
25
|
+
</body></html>`
|
|
26
|
+
)
|
|
27
|
+
);
|
|
28
|
+
let hovered = await page.evaluate(() => {
|
|
29
|
+
const el = document.getElementById("target");
|
|
30
|
+
return el?.dataset.hovered === "true";
|
|
31
|
+
});
|
|
32
|
+
(0, import_test.expect)(hovered).toBe(false);
|
|
33
|
+
await page.hover(200, 200);
|
|
34
|
+
hovered = await page.evaluate(() => {
|
|
35
|
+
const el = document.getElementById("target");
|
|
36
|
+
return el?.dataset.hovered === "true";
|
|
37
|
+
});
|
|
38
|
+
(0, import_test.expect)(hovered).toBe(true);
|
|
39
|
+
});
|
|
40
|
+
(0, import_test.test)("hover moves mouse without clicking", async () => {
|
|
41
|
+
const page = v3.context.pages()[0];
|
|
42
|
+
await page.goto(
|
|
43
|
+
"data:text/html," + encodeURIComponent(
|
|
44
|
+
`<!doctype html><html><body style="margin: 0; padding: 0;">
|
|
45
|
+
<button id="btn"
|
|
46
|
+
style="position: absolute; top: 100px; left: 100px; width: 200px; height: 100px;"
|
|
47
|
+
onclick="this.dataset.clicked='true'"
|
|
48
|
+
onmouseover="this.dataset.hovered='true'">
|
|
49
|
+
Click Me
|
|
50
|
+
</button>
|
|
51
|
+
</body></html>`
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
await page.hover(200, 150);
|
|
55
|
+
const state = await page.evaluate(() => {
|
|
56
|
+
const btn = document.getElementById("btn");
|
|
57
|
+
return {
|
|
58
|
+
hovered: btn?.dataset.hovered === "true",
|
|
59
|
+
clicked: btn?.dataset.clicked === "true"
|
|
60
|
+
};
|
|
61
|
+
});
|
|
62
|
+
(0, import_test.expect)(state.hovered).toBe(true);
|
|
63
|
+
(0, import_test.expect)(state.clicked).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
(0, import_test.test)("hover returns xpath when requested", async () => {
|
|
66
|
+
const page = v3.context.pages()[0];
|
|
67
|
+
await page.goto(
|
|
68
|
+
"data:text/html," + encodeURIComponent(
|
|
69
|
+
`<!doctype html><html><body style="margin: 0; padding: 0;">
|
|
70
|
+
<div id="target" style="position: absolute; top: 0px; left: 400px; width: 300px; height: 100px; background: blue;">
|
|
71
|
+
Target element
|
|
72
|
+
</div>
|
|
73
|
+
<p style="position: absolute; top: 200px; left: 0px;">Content below</p>
|
|
74
|
+
</body></html>`
|
|
75
|
+
)
|
|
76
|
+
);
|
|
77
|
+
const xpath = await page.hover(550, 50, { returnXpath: true });
|
|
78
|
+
(0, import_test.expect)(typeof xpath).toBe("string");
|
|
79
|
+
(0, import_test.expect)(xpath.length).toBeGreaterThan(0);
|
|
80
|
+
(0, import_test.expect)(xpath.toLowerCase()).toMatch(/div|target/);
|
|
81
|
+
});
|
|
82
|
+
(0, import_test.test)("hover without returnXpath returns empty string", async () => {
|
|
83
|
+
const page = v3.context.pages()[0];
|
|
84
|
+
await page.goto(
|
|
85
|
+
"data:text/html," + encodeURIComponent(
|
|
86
|
+
`<!doctype html><html><body style="margin: 0; padding: 0;">
|
|
87
|
+
<div style="width: 100px; height: 100px; background: lightblue;">Content</div>
|
|
88
|
+
</body></html>`
|
|
89
|
+
)
|
|
90
|
+
);
|
|
91
|
+
const result = await page.hover(50, 50);
|
|
92
|
+
(0, import_test.expect)(result).toBe("");
|
|
93
|
+
});
|
|
94
|
+
(0, import_test.test)("hover triggers CSS :hover styles", async () => {
|
|
95
|
+
const page = v3.context.pages()[0];
|
|
96
|
+
await page.goto(
|
|
97
|
+
"data:text/html," + encodeURIComponent(
|
|
98
|
+
`<!doctype html><html>
|
|
99
|
+
<head>
|
|
100
|
+
<style>
|
|
101
|
+
#hoverable {
|
|
102
|
+
position: absolute;
|
|
103
|
+
top: 100px;
|
|
104
|
+
left: 100px;
|
|
105
|
+
width: 200px;
|
|
106
|
+
height: 200px;
|
|
107
|
+
background: red;
|
|
108
|
+
}
|
|
109
|
+
#hoverable:hover {
|
|
110
|
+
background: green;
|
|
111
|
+
}
|
|
112
|
+
</style>
|
|
113
|
+
</head>
|
|
114
|
+
<body style="margin: 0; padding: 0;">
|
|
115
|
+
<div id="hoverable">Hover to change color</div>
|
|
116
|
+
</body></html>`
|
|
117
|
+
)
|
|
118
|
+
);
|
|
119
|
+
let bgColor = await page.evaluate(() => {
|
|
120
|
+
const el = document.getElementById("hoverable");
|
|
121
|
+
return getComputedStyle(el).backgroundColor;
|
|
122
|
+
});
|
|
123
|
+
(0, import_test.expect)(bgColor).toBe("rgb(255, 0, 0)");
|
|
124
|
+
await page.hover(200, 200);
|
|
125
|
+
bgColor = await page.evaluate(() => {
|
|
126
|
+
const el = document.getElementById("hoverable");
|
|
127
|
+
return getComputedStyle(el).backgroundColor;
|
|
128
|
+
});
|
|
129
|
+
(0, import_test.expect)(bgColor).toBe("rgb(0, 128, 0)");
|
|
130
|
+
});
|
|
131
|
+
(0, import_test.test)("multiple hovers move the mouse correctly", async () => {
|
|
132
|
+
const page = v3.context.pages()[0];
|
|
133
|
+
await page.goto(
|
|
134
|
+
"data:text/html," + encodeURIComponent(
|
|
135
|
+
`<!doctype html><html><body style="margin: 0; padding: 0;">
|
|
136
|
+
<div id="box1"
|
|
137
|
+
style="position: absolute; top: 0; left: 0; width: 100px; height: 100px; background: red;"
|
|
138
|
+
onmouseover="this.dataset.hovered='true'"
|
|
139
|
+
onmouseout="this.dataset.hovered='false'">
|
|
140
|
+
Box 1
|
|
141
|
+
</div>
|
|
142
|
+
<div id="box2"
|
|
143
|
+
style="position: absolute; top: 0; left: 200px; width: 100px; height: 100px; background: blue;"
|
|
144
|
+
onmouseover="this.dataset.hovered='true'"
|
|
145
|
+
onmouseout="this.dataset.hovered='false'">
|
|
146
|
+
Box 2
|
|
147
|
+
</div>
|
|
148
|
+
</body></html>`
|
|
149
|
+
)
|
|
150
|
+
);
|
|
151
|
+
await page.hover(50, 50);
|
|
152
|
+
let state = await page.evaluate(() => ({
|
|
153
|
+
box1: document.getElementById("box1")?.dataset.hovered === "true",
|
|
154
|
+
box2: document.getElementById("box2")?.dataset.hovered === "true"
|
|
155
|
+
}));
|
|
156
|
+
(0, import_test.expect)(state.box1).toBe(true);
|
|
157
|
+
(0, import_test.expect)(state.box2).toBe(false);
|
|
158
|
+
await page.hover(250, 50);
|
|
159
|
+
state = await page.evaluate(() => ({
|
|
160
|
+
box1: document.getElementById("box1")?.dataset.hovered === "true",
|
|
161
|
+
box2: document.getElementById("box2")?.dataset.hovered === "true"
|
|
162
|
+
}));
|
|
163
|
+
(0, import_test.expect)(state.box1).toBe(false);
|
|
164
|
+
(0, import_test.expect)(state.box2).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
//# sourceMappingURL=page-hover.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/page-hover.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.hover() - mouse hover at coordinates\", () => {\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(\"hover triggers mouseover event at coordinates\", 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=\"margin: 0; padding: 0;\">\n <div id=\"target\" \n style=\"position: absolute; top: 100px; left: 100px; width: 200px; height: 200px; background: lightblue;\"\n onmouseover=\"this.dataset.hovered='true'\"\n onmouseout=\"this.dataset.hovered='false'\">\n Hover Me\n </div>\n </body></html>`,\n ),\n );\n\n // Check initial state\n let hovered = await page.evaluate(() => {\n const el = document.getElementById(\"target\");\n return el?.dataset.hovered === \"true\";\n });\n expect(hovered).toBe(false);\n\n // Hover at coordinates within the target element (200, 200 is center of the div)\n await page.hover(200, 200);\n\n // Verify mouseover was triggered\n hovered = await page.evaluate(() => {\n const el = document.getElementById(\"target\");\n return el?.dataset.hovered === \"true\";\n });\n expect(hovered).toBe(true);\n });\n\n test(\"hover moves mouse without clicking\", 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=\"margin: 0; padding: 0;\">\n <button id=\"btn\" \n style=\"position: absolute; top: 100px; left: 100px; width: 200px; height: 100px;\"\n onclick=\"this.dataset.clicked='true'\"\n onmouseover=\"this.dataset.hovered='true'\">\n Click Me\n </button>\n </body></html>`,\n ),\n );\n\n // Hover over the button\n await page.hover(200, 150);\n\n // Check that hover happened but click did not\n const state = await page.evaluate(() => {\n const btn = document.getElementById(\"btn\");\n return {\n hovered: btn?.dataset.hovered === \"true\",\n clicked: btn?.dataset.clicked === \"true\",\n };\n });\n\n expect(state.hovered).toBe(true);\n expect(state.clicked).toBe(false);\n });\n\n test(\"hover 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=\"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 // Hover at coordinate (550, 50) which should be directly over the target div\n const xpath = await page.hover(550, 50, { 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\n expect(xpath.toLowerCase()).toMatch(/div|target/);\n });\n\n test(\"hover 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=\"margin: 0; padding: 0;\">\n <div style=\"width: 100px; height: 100px; background: lightblue;\">Content</div>\n </body></html>`,\n ),\n );\n\n // Hover without returnXpath\n const result = await page.hover(50, 50);\n\n // Should return empty string\n expect(result).toBe(\"\");\n });\n\n test(\"hover triggers CSS :hover styles\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html>\n <head>\n <style>\n #hoverable {\n position: absolute;\n top: 100px;\n left: 100px;\n width: 200px;\n height: 200px;\n background: red;\n }\n #hoverable:hover {\n background: green;\n }\n </style>\n </head>\n <body style=\"margin: 0; padding: 0;\">\n <div id=\"hoverable\">Hover to change color</div>\n </body></html>`,\n ),\n );\n\n // Get initial background color\n let bgColor = await page.evaluate(() => {\n const el = document.getElementById(\"hoverable\");\n return getComputedStyle(el!).backgroundColor;\n });\n expect(bgColor).toBe(\"rgb(255, 0, 0)\"); // red\n\n // Hover over the element\n await page.hover(200, 200);\n\n // Check that CSS :hover state is applied\n bgColor = await page.evaluate(() => {\n const el = document.getElementById(\"hoverable\");\n return getComputedStyle(el!).backgroundColor;\n });\n expect(bgColor).toBe(\"rgb(0, 128, 0)\"); // green\n });\n\n test(\"multiple hovers move the mouse correctly\", 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=\"margin: 0; padding: 0;\">\n <div id=\"box1\" \n style=\"position: absolute; top: 0; left: 0; width: 100px; height: 100px; background: red;\"\n onmouseover=\"this.dataset.hovered='true'\"\n onmouseout=\"this.dataset.hovered='false'\">\n Box 1\n </div>\n <div id=\"box2\" \n style=\"position: absolute; top: 0; left: 200px; width: 100px; height: 100px; background: blue;\"\n onmouseover=\"this.dataset.hovered='true'\"\n onmouseout=\"this.dataset.hovered='false'\">\n Box 2\n </div>\n </body></html>`,\n ),\n );\n\n // Hover over box1\n await page.hover(50, 50);\n\n let state = await page.evaluate(() => ({\n box1: document.getElementById(\"box1\")?.dataset.hovered === \"true\",\n box2: document.getElementById(\"box2\")?.dataset.hovered === \"true\",\n }));\n\n expect(state.box1).toBe(true);\n expect(state.box2).toBe(false);\n\n // Move hover to box2\n await page.hover(250, 50);\n\n state = await page.evaluate(() => ({\n box1: document.getElementById(\"box1\")?.dataset.hovered === \"true\",\n box2: document.getElementById(\"box2\")?.dataset.hovered === \"true\",\n }));\n\n expect(state.box1).toBe(false);\n expect(state.box2).toBe(true);\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,295 @@
|
|
|
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_fs = require("fs");
|
|
25
|
+
var os = __toESM(require("os"), 1);
|
|
26
|
+
var path = __toESM(require("path"), 1);
|
|
27
|
+
var import_v3 = require("../v3.js");
|
|
28
|
+
var import_v3_config = require("./v3.config.js");
|
|
29
|
+
var import_frame = require("../understudy/frame.js");
|
|
30
|
+
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
31
|
+
import_test.test.describe("Page.screenshot options", () => {
|
|
32
|
+
let v3;
|
|
33
|
+
import_test.test.beforeEach(async () => {
|
|
34
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
35
|
+
await v3.init();
|
|
36
|
+
});
|
|
37
|
+
import_test.test.afterEach(async () => {
|
|
38
|
+
await v3?.close?.().catch(() => {
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
(0, import_test.test)("rejects clip combined with fullPage", async () => {
|
|
42
|
+
const page = v3.context.pages()[0];
|
|
43
|
+
await page.goto("data:text/html,<html><body>test</body></html>");
|
|
44
|
+
await (0, import_test.expect)(
|
|
45
|
+
page.screenshot({
|
|
46
|
+
fullPage: true,
|
|
47
|
+
clip: { x: 0, y: 0, width: 100, height: 100 }
|
|
48
|
+
})
|
|
49
|
+
).rejects.toThrow(/clip and fullPage/);
|
|
50
|
+
});
|
|
51
|
+
(0, import_test.test)("rejects unsupported image type", async () => {
|
|
52
|
+
const page = v3.context.pages()[0];
|
|
53
|
+
await page.goto("data:text/html,<html><body>noop</body></html>");
|
|
54
|
+
await (0, import_test.expect)(
|
|
55
|
+
page.screenshot({
|
|
56
|
+
// @ts-expect-error intentional invalid type for runtime validation
|
|
57
|
+
type: "webp"
|
|
58
|
+
})
|
|
59
|
+
).rejects.toThrow(/unsupported image type/);
|
|
60
|
+
});
|
|
61
|
+
(0, import_test.test)("rejects jpeg quality for png screenshots", async () => {
|
|
62
|
+
const page = v3.context.pages()[0];
|
|
63
|
+
await page.goto("data:text/html,<html><body>noop</body></html>");
|
|
64
|
+
await (0, import_test.expect)(page.screenshot({ type: "png", quality: 50 })).rejects.toThrow(
|
|
65
|
+
/quality option is only valid/
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
(0, import_test.test)("honours timeout option", async () => {
|
|
69
|
+
const page = v3.context.pages()[0];
|
|
70
|
+
await page.goto("data:text/html,<html><body>noop</body></html>");
|
|
71
|
+
const mainFrame = page.mainFrame();
|
|
72
|
+
const originalScreenshot = mainFrame.screenshot.bind(mainFrame);
|
|
73
|
+
mainFrame.screenshot = async () => {
|
|
74
|
+
await wait(50);
|
|
75
|
+
return Buffer.from("late");
|
|
76
|
+
};
|
|
77
|
+
try {
|
|
78
|
+
await (0, import_test.expect)(page.screenshot({ timeout: 10 })).rejects.toThrow(/timeout/);
|
|
79
|
+
} finally {
|
|
80
|
+
mainFrame.screenshot = originalScreenshot;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
(0, import_test.test)("applies advanced options and cleans up overlays", async () => {
|
|
84
|
+
const page = v3.context.pages()[0];
|
|
85
|
+
const screenshotTimeout = process.env.CI ? 15e3 : 5e3;
|
|
86
|
+
const testStart = Date.now();
|
|
87
|
+
console.log(
|
|
88
|
+
`[screenshot-test] start ${new Date(testStart).toISOString()} timeout=${screenshotTimeout}`
|
|
89
|
+
);
|
|
90
|
+
const html = `
|
|
91
|
+
<!doctype html>
|
|
92
|
+
<html>
|
|
93
|
+
<head>
|
|
94
|
+
<meta charset="utf-8" />
|
|
95
|
+
<style>
|
|
96
|
+
body { background: #aaccee; margin: 0; height: 100vh; display: flex; flex-direction: column; align-items: flex-start; }
|
|
97
|
+
.mask-target { width: 80px; height: 80px; margin: 40px; background: rgb(0, 180, 60); animation: pulse 1s infinite alternate; }
|
|
98
|
+
@keyframes pulse { from { transform: scale(1); } to { transform: scale(1.2); } }
|
|
99
|
+
</style>
|
|
100
|
+
</head>
|
|
101
|
+
<body>
|
|
102
|
+
<div class="mask-target"></div>
|
|
103
|
+
<div class="mask-target"></div>
|
|
104
|
+
<input id="focus-me" value="focus" />
|
|
105
|
+
<script>document.getElementById('focus-me').focus();</script>
|
|
106
|
+
</body>
|
|
107
|
+
</html>
|
|
108
|
+
`;
|
|
109
|
+
await page.goto("data:text/html," + encodeURIComponent(html));
|
|
110
|
+
console.log(`[screenshot-test] page loaded in ${Date.now() - testStart}ms`);
|
|
111
|
+
const maskLocator = page.locator(".mask-target");
|
|
112
|
+
const tempPath = path.join(
|
|
113
|
+
os.tmpdir(),
|
|
114
|
+
`stagehand-screenshot-${Date.now()}-${Math.random().toString(36).slice(2)}.jpeg`
|
|
115
|
+
);
|
|
116
|
+
console.log(`[screenshot-test] tempPath=${tempPath}`);
|
|
117
|
+
const targetId = page.targetId();
|
|
118
|
+
const screenshotCalls = [];
|
|
119
|
+
const evaluateCalls = [];
|
|
120
|
+
const originalScreenshot = import_frame.Frame.prototype.screenshot;
|
|
121
|
+
const originalEvaluate = import_frame.Frame.prototype.evaluate;
|
|
122
|
+
import_frame.Frame.prototype.screenshot = async function screenshotSpy(options) {
|
|
123
|
+
const frame = this;
|
|
124
|
+
if (frame.pageId === targetId) {
|
|
125
|
+
screenshotCalls.push({ frameId: frame.frameId, options });
|
|
126
|
+
return Buffer.from("stub-image");
|
|
127
|
+
}
|
|
128
|
+
return originalScreenshot.call(this, options);
|
|
129
|
+
};
|
|
130
|
+
import_frame.Frame.prototype.evaluate = async function evaluateSpy(expression, arg) {
|
|
131
|
+
const frame = this;
|
|
132
|
+
if (frame.pageId === targetId) {
|
|
133
|
+
evaluateCalls.push({ frameId: frame.frameId, arg });
|
|
134
|
+
}
|
|
135
|
+
return originalEvaluate.call(this, expression, arg);
|
|
136
|
+
};
|
|
137
|
+
const internalPage = page;
|
|
138
|
+
const sendCalls = [];
|
|
139
|
+
const originalSend = internalPage.mainSession.send.bind(
|
|
140
|
+
internalPage.mainSession
|
|
141
|
+
);
|
|
142
|
+
internalPage.mainSession.send = async (method, params) => {
|
|
143
|
+
sendCalls.push({ method, params });
|
|
144
|
+
return originalSend(method, params);
|
|
145
|
+
};
|
|
146
|
+
try {
|
|
147
|
+
const maskCount = await maskLocator.count();
|
|
148
|
+
console.log(`[screenshot-test] maskLocator.count=${maskCount}`);
|
|
149
|
+
const buffer = await page.screenshot({
|
|
150
|
+
animations: "disabled",
|
|
151
|
+
caret: "hide",
|
|
152
|
+
clip: { x: 0, y: 0, width: 200, height: 200 },
|
|
153
|
+
mask: [maskLocator],
|
|
154
|
+
maskColor: "rgba(255, 0, 0, 0.4)",
|
|
155
|
+
omitBackground: true,
|
|
156
|
+
path: tempPath,
|
|
157
|
+
quality: 80,
|
|
158
|
+
scale: "css",
|
|
159
|
+
style: "body { border: 3px solid black; }",
|
|
160
|
+
timeout: screenshotTimeout,
|
|
161
|
+
type: "jpeg"
|
|
162
|
+
});
|
|
163
|
+
console.log(
|
|
164
|
+
`[screenshot-test] screenshot returned bytes=${buffer.length} elapsed=${Date.now() - testStart}ms`
|
|
165
|
+
);
|
|
166
|
+
(0, import_test.expect)(Buffer.isBuffer(buffer)).toBeTruthy();
|
|
167
|
+
(0, import_test.expect)(screenshotCalls.length).toBeGreaterThanOrEqual(1);
|
|
168
|
+
console.log(
|
|
169
|
+
`[screenshot-test] screenshotCalls=${screenshotCalls.length} evaluateCalls=${evaluateCalls.length} sendCalls=${sendCalls.length}`
|
|
170
|
+
);
|
|
171
|
+
const recorded = screenshotCalls[0]?.options ?? {};
|
|
172
|
+
(0, import_test.expect)(recorded).toMatchObject({ type: "jpeg", quality: 80 });
|
|
173
|
+
(0, import_test.expect)(recorded?.clip).toMatchObject({
|
|
174
|
+
x: 0,
|
|
175
|
+
y: 0,
|
|
176
|
+
width: 200,
|
|
177
|
+
height: 200
|
|
178
|
+
});
|
|
179
|
+
if (typeof recorded?.scale === "number") {
|
|
180
|
+
(0, import_test.expect)(recorded.scale).toBeGreaterThan(0);
|
|
181
|
+
(0, import_test.expect)(recorded.scale).toBeLessThanOrEqual(2);
|
|
182
|
+
}
|
|
183
|
+
await import_fs.promises.stat(tempPath);
|
|
184
|
+
const maskNodes = await page.evaluate(
|
|
185
|
+
() => document.querySelectorAll("[data-stagehand-mask]").length
|
|
186
|
+
);
|
|
187
|
+
(0, import_test.expect)(maskNodes).toBe(0);
|
|
188
|
+
const styleNodes = await page.evaluate(
|
|
189
|
+
() => document.querySelectorAll("[data-stagehand-style]").length
|
|
190
|
+
);
|
|
191
|
+
(0, import_test.expect)(styleNodes).toBe(0);
|
|
192
|
+
const backgroundCalls = sendCalls.filter(
|
|
193
|
+
(call) => call.method === "Emulation.setDefaultBackgroundColorOverride"
|
|
194
|
+
);
|
|
195
|
+
(0, import_test.expect)(backgroundCalls.length).toBeGreaterThan(1);
|
|
196
|
+
(0, import_test.expect)(
|
|
197
|
+
backgroundCalls.some(
|
|
198
|
+
(call) => call.params && typeof call.params === "object" && "color" in call.params
|
|
199
|
+
)
|
|
200
|
+
).toBeTruthy();
|
|
201
|
+
(0, import_test.expect)(
|
|
202
|
+
backgroundCalls.some(
|
|
203
|
+
(call) => !call.params || Object.keys(call.params).length === 0
|
|
204
|
+
)
|
|
205
|
+
).toBeTruthy();
|
|
206
|
+
const cssArgs = evaluateCalls.map((entry) => {
|
|
207
|
+
const value = entry.arg;
|
|
208
|
+
return value?.css ?? null;
|
|
209
|
+
}).filter((css) => typeof css === "string");
|
|
210
|
+
const tokens = evaluateCalls.map((entry) => {
|
|
211
|
+
const arg = entry.arg;
|
|
212
|
+
return arg?.token ?? null;
|
|
213
|
+
}).filter((token) => typeof token === "string");
|
|
214
|
+
(0, import_test.expect)(tokens.some((token) => token.includes("animations"))).toBeTruthy();
|
|
215
|
+
(0, import_test.expect)(tokens.some((token) => token.includes("caret"))).toBeTruthy();
|
|
216
|
+
(0, import_test.expect)(tokens.some((token) => token.includes("custom"))).toBeTruthy();
|
|
217
|
+
(0, import_test.expect)(
|
|
218
|
+
cssArgs.some((css) => css.includes("border: 3px solid black"))
|
|
219
|
+
).toBeTruthy();
|
|
220
|
+
const maskCalls = evaluateCalls.filter((entry) => {
|
|
221
|
+
const arg = entry.arg;
|
|
222
|
+
return arg && typeof arg === "object" && "rects" in arg;
|
|
223
|
+
});
|
|
224
|
+
(0, import_test.expect)(maskCalls.length).toBeGreaterThan(0);
|
|
225
|
+
const rects = maskCalls[0]?.arg?.rects;
|
|
226
|
+
(0, import_test.expect)(Array.isArray(rects)).toBeTruthy();
|
|
227
|
+
(0, import_test.expect)(rects.length).toBe(2);
|
|
228
|
+
} finally {
|
|
229
|
+
import_frame.Frame.prototype.screenshot = originalScreenshot;
|
|
230
|
+
import_frame.Frame.prototype.evaluate = originalEvaluate;
|
|
231
|
+
internalPage.mainSession.send = originalSend;
|
|
232
|
+
await import_fs.promises.unlink(tempPath).catch(() => {
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
(0, import_test.test)("masks elements inside dialog top layer", async () => {
|
|
237
|
+
const page = v3.context.pages()[0];
|
|
238
|
+
const html = `
|
|
239
|
+
<!doctype html>
|
|
240
|
+
<html>
|
|
241
|
+
<head>
|
|
242
|
+
<meta charset="utf-8" />
|
|
243
|
+
<style>
|
|
244
|
+
dialog { padding: 16px; border: 2px solid #444; }
|
|
245
|
+
#dialog-input { display: block; width: 160px; height: 32px; }
|
|
246
|
+
</style>
|
|
247
|
+
</head>
|
|
248
|
+
<body>
|
|
249
|
+
<dialog id="dialog">
|
|
250
|
+
<label>Secret <input id="dialog-input" value="top-layer" /></label>
|
|
251
|
+
</dialog>
|
|
252
|
+
<script>
|
|
253
|
+
const dialog = document.getElementById("dialog");
|
|
254
|
+
if (dialog) {
|
|
255
|
+
if (typeof dialog.showModal === "function") {
|
|
256
|
+
try {
|
|
257
|
+
dialog.showModal();
|
|
258
|
+
} catch {
|
|
259
|
+
dialog.setAttribute("open", "");
|
|
260
|
+
}
|
|
261
|
+
} else {
|
|
262
|
+
dialog.setAttribute("open", "");
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
</script>
|
|
266
|
+
</body>
|
|
267
|
+
</html>
|
|
268
|
+
`;
|
|
269
|
+
await page.goto("data:text/html," + encodeURIComponent(html));
|
|
270
|
+
const targetId = page.targetId();
|
|
271
|
+
const originalScreenshot = import_frame.Frame.prototype.screenshot;
|
|
272
|
+
let dialogMaskCount = 0;
|
|
273
|
+
import_frame.Frame.prototype.screenshot = async function screenshotSpy(options) {
|
|
274
|
+
const frame = this;
|
|
275
|
+
if (frame.pageId === targetId) {
|
|
276
|
+
dialogMaskCount = await frame.evaluate(() => {
|
|
277
|
+
const dialog = document.querySelector("dialog[open]");
|
|
278
|
+
if (!dialog) return 0;
|
|
279
|
+
return dialog.querySelectorAll("[data-stagehand-mask]").length;
|
|
280
|
+
});
|
|
281
|
+
return Buffer.from("stub-image");
|
|
282
|
+
}
|
|
283
|
+
return originalScreenshot.call(this, options);
|
|
284
|
+
};
|
|
285
|
+
try {
|
|
286
|
+
await page.screenshot({
|
|
287
|
+
mask: [page.locator("#dialog-input")]
|
|
288
|
+
});
|
|
289
|
+
(0, import_test.expect)(dialogMaskCount).toBeGreaterThan(0);
|
|
290
|
+
} finally {
|
|
291
|
+
import_frame.Frame.prototype.screenshot = originalScreenshot;
|
|
292
|
+
}
|
|
293
|
+
});
|
|
294
|
+
});
|
|
295
|
+
//# sourceMappingURL=page-screenshot.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/page-screenshot.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { test, expect } from \"@playwright/test\";\nimport { promises as fs } from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\nimport { Frame } from \"../understudy/frame.js\";\n\nconst wait = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\ntest.describe(\"Page.screenshot options\", () => {\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(\"rejects clip combined with fullPage\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\"data:text/html,<html><body>test</body></html>\");\n\n await expect(\n page.screenshot({\n fullPage: true,\n clip: { x: 0, y: 0, width: 100, height: 100 },\n }),\n ).rejects.toThrow(/clip and fullPage/);\n });\n\n test(\"rejects unsupported image type\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\"data:text/html,<html><body>noop</body></html>\");\n\n await expect(\n page.screenshot({\n // @ts-expect-error intentional invalid type for runtime validation\n type: \"webp\",\n }),\n ).rejects.toThrow(/unsupported image type/);\n });\n\n test(\"rejects jpeg quality for png screenshots\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\"data:text/html,<html><body>noop</body></html>\");\n\n await expect(page.screenshot({ type: \"png\", quality: 50 })).rejects.toThrow(\n /quality option is only valid/,\n );\n });\n\n test(\"honours timeout option\", async () => {\n const page = v3.context.pages()[0];\n await page.goto(\"data:text/html,<html><body>noop</body></html>\");\n\n const mainFrame = page.mainFrame();\n const originalScreenshot = mainFrame.screenshot.bind(mainFrame);\n\n (\n mainFrame as typeof mainFrame & {\n screenshot: typeof mainFrame.screenshot;\n }\n ).screenshot = async () => {\n await wait(50);\n return Buffer.from(\"late\");\n };\n\n try {\n await expect(page.screenshot({ timeout: 10 })).rejects.toThrow(/timeout/);\n } finally {\n (\n mainFrame as typeof mainFrame & {\n screenshot: typeof mainFrame.screenshot;\n }\n ).screenshot = originalScreenshot;\n }\n });\n\n test(\"applies advanced options and cleans up overlays\", async () => {\n const page = v3.context.pages()[0];\n const screenshotTimeout = process.env.CI ? 15000 : 5000;\n const testStart = Date.now();\n console.log(\n `[screenshot-test] start ${new Date(testStart).toISOString()} timeout=${screenshotTimeout}`,\n );\n\n const html = `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n body { background: #aaccee; margin: 0; height: 100vh; display: flex; flex-direction: column; align-items: flex-start; }\n .mask-target { width: 80px; height: 80px; margin: 40px; background: rgb(0, 180, 60); animation: pulse 1s infinite alternate; }\n @keyframes pulse { from { transform: scale(1); } to { transform: scale(1.2); } }\n </style>\n </head>\n <body>\n <div class=\"mask-target\"></div>\n <div class=\"mask-target\"></div>\n <input id=\"focus-me\" value=\"focus\" />\n <script>document.getElementById('focus-me').focus();</script>\n </body>\n </html>\n `;\n\n await page.goto(\"data:text/html,\" + encodeURIComponent(html));\n console.log(`[screenshot-test] page loaded in ${Date.now() - testStart}ms`);\n\n const maskLocator = page.locator(\".mask-target\");\n const tempPath = path.join(\n os.tmpdir(),\n `stagehand-screenshot-${Date.now()}-${Math.random().toString(36).slice(2)}.jpeg`,\n );\n console.log(`[screenshot-test] tempPath=${tempPath}`);\n\n const targetId = page.targetId();\n const screenshotCalls: Array<{\n frameId: string;\n options: Parameters<Frame[\"screenshot\"]>[0];\n }> = [];\n const evaluateCalls: Array<{ frameId: string; arg: unknown }> = [];\n const originalScreenshot = Frame.prototype.screenshot;\n const originalEvaluate = Frame.prototype.evaluate;\n\n // Hook Frame.screenshot so we can assert which options reach CDP without writing real data.\n Frame.prototype.screenshot = async function screenshotSpy(options) {\n const frame = this as Frame;\n if (frame.pageId === targetId) {\n screenshotCalls.push({ frameId: frame.frameId, options });\n return Buffer.from(\"stub-image\");\n }\n return originalScreenshot.call(this, options);\n };\n\n // Spy on Frame.evaluate to capture the arguments used to inject CSS/masks.\n Frame.prototype.evaluate = async function evaluateSpy(expression, arg?) {\n const frame = this as Frame;\n if (frame.pageId === targetId) {\n evaluateCalls.push({ frameId: frame.frameId, arg });\n }\n return originalEvaluate.call(this, expression as never, arg);\n } as Frame[\"evaluate\"];\n\n const internalPage = page as unknown as {\n mainSession: {\n send: (method: string, params?: unknown) => Promise<unknown>;\n };\n };\n const sendCalls: Array<{ method: string; params: unknown }> = [];\n const originalSend = internalPage.mainSession.send.bind(\n internalPage.mainSession,\n ) as (method: string, params?: unknown) => Promise<unknown>;\n // Capture background overrides so we can confirm omitBackground toggles on/off.\n internalPage.mainSession.send = async (\n method: string,\n params?: unknown,\n ) => {\n sendCalls.push({ method, params });\n return originalSend(method, params);\n };\n\n try {\n const maskCount = await maskLocator.count();\n console.log(`[screenshot-test] maskLocator.count=${maskCount}`);\n\n const buffer = await page.screenshot({\n animations: \"disabled\",\n caret: \"hide\",\n clip: { x: 0, y: 0, width: 200, height: 200 },\n mask: [maskLocator],\n maskColor: \"rgba(255, 0, 0, 0.4)\",\n omitBackground: true,\n path: tempPath,\n quality: 80,\n scale: \"css\",\n style: \"body { border: 3px solid black; }\",\n timeout: screenshotTimeout,\n type: \"jpeg\",\n });\n console.log(\n `[screenshot-test] screenshot returned bytes=${buffer.length} elapsed=${Date.now() - testStart}ms`,\n );\n\n expect(Buffer.isBuffer(buffer)).toBeTruthy();\n expect(screenshotCalls.length).toBeGreaterThanOrEqual(1);\n console.log(\n `[screenshot-test] screenshotCalls=${screenshotCalls.length} evaluateCalls=${evaluateCalls.length} sendCalls=${sendCalls.length}`,\n );\n const recorded = screenshotCalls[0]?.options ?? {};\n expect(recorded).toMatchObject({ type: \"jpeg\", quality: 80 });\n expect(recorded?.clip).toMatchObject({\n x: 0,\n y: 0,\n width: 200,\n height: 200,\n });\n if (typeof recorded?.scale === \"number\") {\n expect(recorded.scale).toBeGreaterThan(0);\n expect(recorded.scale).toBeLessThanOrEqual(2);\n }\n\n await fs.stat(tempPath);\n\n const maskNodes = await page.evaluate(\n () => document.querySelectorAll(\"[data-stagehand-mask]\").length,\n );\n expect(maskNodes).toBe(0);\n\n const styleNodes = await page.evaluate(\n () => document.querySelectorAll(\"[data-stagehand-style]\").length,\n );\n expect(styleNodes).toBe(0);\n\n const backgroundCalls = sendCalls.filter(\n (call) => call.method === \"Emulation.setDefaultBackgroundColorOverride\",\n );\n expect(backgroundCalls.length).toBeGreaterThan(1);\n expect(\n backgroundCalls.some(\n (call) =>\n call.params &&\n typeof call.params === \"object\" &&\n \"color\" in (call.params as Record<string, unknown>),\n ),\n ).toBeTruthy();\n expect(\n backgroundCalls.some(\n (call) =>\n !call.params ||\n Object.keys(call.params as Record<string, unknown>).length === 0,\n ),\n ).toBeTruthy();\n\n const cssArgs = evaluateCalls\n .map((entry) => {\n const value = entry.arg as { css?: string } | undefined;\n return value?.css ?? null;\n })\n .filter((css): css is string => typeof css === \"string\");\n\n const tokens = evaluateCalls\n .map((entry) => {\n const arg = entry.arg as { token?: string } | undefined;\n return arg?.token ?? null;\n })\n .filter((token): token is string => typeof token === \"string\");\n\n // Tokens include which helper injected the style (animations/caret/custom).\n expect(tokens.some((token) => token.includes(\"animations\"))).toBeTruthy();\n expect(tokens.some((token) => token.includes(\"caret\"))).toBeTruthy();\n expect(tokens.some((token) => token.includes(\"custom\"))).toBeTruthy();\n // Custom style should bubble through so we check the actual CSS text.\n expect(\n cssArgs.some((css) => css.includes(\"border: 3px solid black\")),\n ).toBeTruthy();\n\n const maskCalls = evaluateCalls.filter((entry) => {\n const arg = entry.arg;\n return (\n arg &&\n typeof arg === \"object\" &&\n \"rects\" in (arg as Record<string, unknown>)\n );\n });\n expect(maskCalls.length).toBeGreaterThan(0);\n const rects = (maskCalls[0]?.arg as { rects?: unknown } | undefined)\n ?.rects;\n expect(Array.isArray(rects)).toBeTruthy();\n expect((rects as unknown[]).length).toBe(2);\n } finally {\n Frame.prototype.screenshot = originalScreenshot;\n Frame.prototype.evaluate = originalEvaluate;\n internalPage.mainSession.send = originalSend;\n await fs.unlink(tempPath).catch(() => {});\n }\n });\n\n test(\"masks elements inside dialog top layer\", async () => {\n const page = v3.context.pages()[0];\n\n const html = `\n <!doctype html>\n <html>\n <head>\n <meta charset=\"utf-8\" />\n <style>\n dialog { padding: 16px; border: 2px solid #444; }\n #dialog-input { display: block; width: 160px; height: 32px; }\n </style>\n </head>\n <body>\n <dialog id=\"dialog\">\n <label>Secret <input id=\"dialog-input\" value=\"top-layer\" /></label>\n </dialog>\n <script>\n const dialog = document.getElementById(\"dialog\");\n if (dialog) {\n if (typeof dialog.showModal === \"function\") {\n try {\n dialog.showModal();\n } catch {\n dialog.setAttribute(\"open\", \"\");\n }\n } else {\n dialog.setAttribute(\"open\", \"\");\n }\n }\n </script>\n </body>\n </html>\n `;\n\n await page.goto(\"data:text/html,\" + encodeURIComponent(html));\n\n const targetId = page.targetId();\n const originalScreenshot = Frame.prototype.screenshot;\n let dialogMaskCount = 0;\n\n Frame.prototype.screenshot = async function screenshotSpy(options) {\n const frame = this as Frame;\n if (frame.pageId === targetId) {\n dialogMaskCount = await frame.evaluate(() => {\n const dialog = document.querySelector(\"dialog[open]\");\n if (!dialog) return 0;\n return dialog.querySelectorAll(\"[data-stagehand-mask]\").length;\n });\n return Buffer.from(\"stub-image\");\n }\n return originalScreenshot.call(this, options);\n };\n\n try {\n await page.screenshot({\n mask: [page.locator(\"#dialog-input\")],\n });\n expect(dialogMaskCount).toBeGreaterThan(0);\n } finally {\n Frame.prototype.screenshot = originalScreenshot;\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["fs"]
|
|
7
|
+
}
|