@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,191 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_config = require("./v3.config.js");
|
|
4
|
+
import_test.test.describe("Locator content methods (textContent, innerHtml, innerText, inputValue)", () => {
|
|
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((e) => {
|
|
12
|
+
});
|
|
13
|
+
});
|
|
14
|
+
(0, import_test.test)("Locator.textContent() returns raw text including hidden content", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html," + encodeURIComponent(
|
|
18
|
+
`<!doctype html><html><body>
|
|
19
|
+
<div id="content">
|
|
20
|
+
Hello
|
|
21
|
+
<span style="display:none">Hidden</span>
|
|
22
|
+
World
|
|
23
|
+
</div>
|
|
24
|
+
</body></html>`
|
|
25
|
+
)
|
|
26
|
+
);
|
|
27
|
+
const content = await page.mainFrame().locator("#content").textContent();
|
|
28
|
+
(0, import_test.expect)(content).toContain("Hello");
|
|
29
|
+
(0, import_test.expect)(content).toContain("Hidden");
|
|
30
|
+
(0, import_test.expect)(content).toContain("World");
|
|
31
|
+
});
|
|
32
|
+
(0, import_test.test)("Locator.innerText() returns visible text only", async () => {
|
|
33
|
+
const page = v3.context.pages()[0];
|
|
34
|
+
await page.goto(
|
|
35
|
+
"data:text/html," + encodeURIComponent(
|
|
36
|
+
`<!doctype html><html><body>
|
|
37
|
+
<div id="content">
|
|
38
|
+
Visible
|
|
39
|
+
<span style="display:none">Hidden</span>
|
|
40
|
+
Text
|
|
41
|
+
</div>
|
|
42
|
+
</body></html>`
|
|
43
|
+
)
|
|
44
|
+
);
|
|
45
|
+
const text = await page.mainFrame().locator("#content").innerText();
|
|
46
|
+
(0, import_test.expect)(text).toContain("Visible");
|
|
47
|
+
(0, import_test.expect)(text).toContain("Text");
|
|
48
|
+
(0, import_test.expect)(text).not.toContain("Hidden");
|
|
49
|
+
});
|
|
50
|
+
(0, import_test.test)("Locator.innerHtml() returns HTML markup", async () => {
|
|
51
|
+
const page = v3.context.pages()[0];
|
|
52
|
+
await page.goto(
|
|
53
|
+
"data:text/html," + encodeURIComponent(
|
|
54
|
+
`<!doctype html><html><body>
|
|
55
|
+
<div id="container">
|
|
56
|
+
<p class="para">Hello</p>
|
|
57
|
+
<strong>World</strong>
|
|
58
|
+
</div>
|
|
59
|
+
</body></html>`
|
|
60
|
+
)
|
|
61
|
+
);
|
|
62
|
+
const html = await page.mainFrame().locator("#container").innerHtml();
|
|
63
|
+
(0, import_test.expect)(html).toContain('<p class="para">Hello</p>');
|
|
64
|
+
(0, import_test.expect)(html).toContain("<strong>World</strong>");
|
|
65
|
+
});
|
|
66
|
+
(0, import_test.test)("Locator.inputValue() reads value from input elements", async () => {
|
|
67
|
+
const page = v3.context.pages()[0];
|
|
68
|
+
await page.goto(
|
|
69
|
+
"data:text/html," + encodeURIComponent(
|
|
70
|
+
`<!doctype html><html><body>
|
|
71
|
+
<input id="text-input" type="text" value="hello world" />
|
|
72
|
+
<textarea id="textarea">multi
|
|
73
|
+
line
|
|
74
|
+
text</textarea>
|
|
75
|
+
<input id="number-input" type="number" value="42" />
|
|
76
|
+
</body></html>`
|
|
77
|
+
)
|
|
78
|
+
);
|
|
79
|
+
const textValue = await page.mainFrame().locator("#text-input").inputValue();
|
|
80
|
+
(0, import_test.expect)(textValue).toBe("hello world");
|
|
81
|
+
const taValue = await page.mainFrame().locator("#textarea").inputValue();
|
|
82
|
+
(0, import_test.expect)(taValue).toBe("multi\nline\ntext");
|
|
83
|
+
const numValue = await page.mainFrame().locator("#number-input").inputValue();
|
|
84
|
+
(0, import_test.expect)(numValue).toBe("42");
|
|
85
|
+
});
|
|
86
|
+
(0, import_test.test)("Locator.textContent() on empty elements returns empty string", async () => {
|
|
87
|
+
const page = v3.context.pages()[0];
|
|
88
|
+
await page.goto(
|
|
89
|
+
"data:text/html," + encodeURIComponent(
|
|
90
|
+
`<!doctype html><html><body>
|
|
91
|
+
<div id="empty"></div>
|
|
92
|
+
<span id="whitespace"> </span>
|
|
93
|
+
</body></html>`
|
|
94
|
+
)
|
|
95
|
+
);
|
|
96
|
+
const empty = await page.mainFrame().locator("#empty").textContent();
|
|
97
|
+
(0, import_test.expect)(empty).toBe("");
|
|
98
|
+
const whitespace = await page.mainFrame().locator("#whitespace").textContent();
|
|
99
|
+
(0, import_test.expect)(whitespace.trim()).toBe("");
|
|
100
|
+
});
|
|
101
|
+
(0, import_test.test)("Locator.innerText() with nested elements and formatting", async () => {
|
|
102
|
+
const page = v3.context.pages()[0];
|
|
103
|
+
await page.goto(
|
|
104
|
+
"data:text/html," + encodeURIComponent(
|
|
105
|
+
`<!doctype html><html><body>
|
|
106
|
+
<div id="formatted">
|
|
107
|
+
<p>Line 1</p>
|
|
108
|
+
<p>Line 2</p>
|
|
109
|
+
<ul>
|
|
110
|
+
<li>Item 1</li>
|
|
111
|
+
<li>Item 2</li>
|
|
112
|
+
</ul>
|
|
113
|
+
</div>
|
|
114
|
+
</body></html>`
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
const text = await page.mainFrame().locator("#formatted").innerText();
|
|
118
|
+
(0, import_test.expect)(text).toContain("Line 1");
|
|
119
|
+
(0, import_test.expect)(text).toContain("Line 2");
|
|
120
|
+
(0, import_test.expect)(text).toContain("Item 1");
|
|
121
|
+
(0, import_test.expect)(text).toContain("Item 2");
|
|
122
|
+
});
|
|
123
|
+
(0, import_test.test)("Locator.inputValue() on contenteditable elements", async () => {
|
|
124
|
+
const page = v3.context.pages()[0];
|
|
125
|
+
await page.goto(
|
|
126
|
+
"data:text/html," + encodeURIComponent(
|
|
127
|
+
`<!doctype html><html><body>
|
|
128
|
+
<div id="editable" contenteditable="true">Editable content</div>
|
|
129
|
+
</body></html>`
|
|
130
|
+
)
|
|
131
|
+
);
|
|
132
|
+
const value = await page.mainFrame().locator("#editable").inputValue();
|
|
133
|
+
(0, import_test.expect)(value).toBe("Editable content");
|
|
134
|
+
});
|
|
135
|
+
(0, import_test.test)("Locator.innerHtml() preserves attributes and structure", async () => {
|
|
136
|
+
const page = v3.context.pages()[0];
|
|
137
|
+
await page.goto(
|
|
138
|
+
"data:text/html," + encodeURIComponent(
|
|
139
|
+
`<!doctype html><html><body>
|
|
140
|
+
<div id="complex">
|
|
141
|
+
<a href="/link" class="link-class">Link</a>
|
|
142
|
+
<img src="image.png" alt="test" />
|
|
143
|
+
</div>
|
|
144
|
+
</body></html>`
|
|
145
|
+
)
|
|
146
|
+
);
|
|
147
|
+
const html = await page.mainFrame().locator("#complex").innerHtml();
|
|
148
|
+
(0, import_test.expect)(html).toContain('href="/link"');
|
|
149
|
+
(0, import_test.expect)(html).toContain('class="link-class"');
|
|
150
|
+
(0, import_test.expect)(html).toContain('src="image.png"');
|
|
151
|
+
(0, import_test.expect)(html).toContain('alt="test"');
|
|
152
|
+
});
|
|
153
|
+
(0, import_test.test)("Locator.textContent() vs innerText() with script/style tags", async () => {
|
|
154
|
+
const page = v3.context.pages()[0];
|
|
155
|
+
await page.goto(
|
|
156
|
+
"data:text/html," + encodeURIComponent(
|
|
157
|
+
`<!doctype html><html><body>
|
|
158
|
+
<div id="mixed">
|
|
159
|
+
Visible text
|
|
160
|
+
<script>console.log('script');</script>
|
|
161
|
+
<style>body { color: red; }</style>
|
|
162
|
+
More visible
|
|
163
|
+
</div>
|
|
164
|
+
</body></html>`
|
|
165
|
+
)
|
|
166
|
+
);
|
|
167
|
+
const textContent = await page.mainFrame().locator("#mixed").textContent();
|
|
168
|
+
(0, import_test.expect)(textContent).toContain("Visible text");
|
|
169
|
+
(0, import_test.expect)(textContent).toContain("More visible");
|
|
170
|
+
const innerText = await page.mainFrame().locator("#mixed").innerText();
|
|
171
|
+
(0, import_test.expect)(innerText).toContain("Visible text");
|
|
172
|
+
(0, import_test.expect)(innerText).toContain("More visible");
|
|
173
|
+
(0, import_test.expect)(innerText).not.toContain("console.log");
|
|
174
|
+
});
|
|
175
|
+
(0, import_test.test)("Locator.inputValue() returns empty string for non-input elements", async () => {
|
|
176
|
+
const page = v3.context.pages()[0];
|
|
177
|
+
await page.goto(
|
|
178
|
+
"data:text/html," + encodeURIComponent(
|
|
179
|
+
`<!doctype html><html><body>
|
|
180
|
+
<div id="div">Not an input</div>
|
|
181
|
+
<input id="empty-input" type="text" value="" />
|
|
182
|
+
</body></html>`
|
|
183
|
+
)
|
|
184
|
+
);
|
|
185
|
+
const divValue = await page.mainFrame().locator("#div").inputValue();
|
|
186
|
+
(0, import_test.expect)(divValue).toBe("");
|
|
187
|
+
const emptyInput = await page.mainFrame().locator("#empty-input").inputValue();
|
|
188
|
+
(0, import_test.expect)(emptyInput).toBe("");
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
//# sourceMappingURL=locator-content-methods.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/locator-content-methods.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator content methods (textContent, innerHtml, innerText, inputValue)\", () => {\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((e) => {\n void e;\n });\n });\n\n test(\"Locator.textContent() returns raw text including hidden content\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"content\">\n Hello\n <span style=\"display:none\">Hidden</span>\n World\n </div>\n </body></html>`,\n ),\n );\n\n const content = await page.mainFrame().locator(\"#content\").textContent();\n // textContent includes all text nodes, even hidden ones\n expect(content).toContain(\"Hello\");\n expect(content).toContain(\"Hidden\");\n expect(content).toContain(\"World\");\n });\n\n test(\"Locator.innerText() returns visible text only\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"content\">\n Visible\n <span style=\"display:none\">Hidden</span>\n Text\n </div>\n </body></html>`,\n ),\n );\n\n const text = await page.mainFrame().locator(\"#content\").innerText();\n // innerText is layout-aware and excludes hidden elements\n expect(text).toContain(\"Visible\");\n expect(text).toContain(\"Text\");\n expect(text).not.toContain(\"Hidden\");\n });\n\n test(\"Locator.innerHtml() returns HTML markup\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"container\">\n <p class=\"para\">Hello</p>\n <strong>World</strong>\n </div>\n </body></html>`,\n ),\n );\n\n const html = await page.mainFrame().locator(\"#container\").innerHtml();\n expect(html).toContain('<p class=\"para\">Hello</p>');\n expect(html).toContain(\"<strong>World</strong>\");\n });\n\n test(\"Locator.inputValue() reads value from input elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"text-input\" type=\"text\" value=\"hello world\" />\n <textarea id=\"textarea\">multi\nline\ntext</textarea>\n <input id=\"number-input\" type=\"number\" value=\"42\" />\n </body></html>`,\n ),\n );\n\n const textValue = await page\n .mainFrame()\n .locator(\"#text-input\")\n .inputValue();\n expect(textValue).toBe(\"hello world\");\n\n const taValue = await page.mainFrame().locator(\"#textarea\").inputValue();\n expect(taValue).toBe(\"multi\\nline\\ntext\");\n\n const numValue = await page\n .mainFrame()\n .locator(\"#number-input\")\n .inputValue();\n expect(numValue).toBe(\"42\");\n });\n\n test(\"Locator.textContent() on empty elements 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>\n <div id=\"empty\"></div>\n <span id=\"whitespace\"> </span>\n </body></html>`,\n ),\n );\n\n const empty = await page.mainFrame().locator(\"#empty\").textContent();\n expect(empty).toBe(\"\");\n\n const whitespace = await page\n .mainFrame()\n .locator(\"#whitespace\")\n .textContent();\n expect(whitespace.trim()).toBe(\"\");\n });\n\n test(\"Locator.innerText() with nested elements and formatting\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"formatted\">\n <p>Line 1</p>\n <p>Line 2</p>\n <ul>\n <li>Item 1</li>\n <li>Item 2</li>\n </ul>\n </div>\n </body></html>`,\n ),\n );\n\n const text = await page.mainFrame().locator(\"#formatted\").innerText();\n expect(text).toContain(\"Line 1\");\n expect(text).toContain(\"Line 2\");\n expect(text).toContain(\"Item 1\");\n expect(text).toContain(\"Item 2\");\n });\n\n test(\"Locator.inputValue() on contenteditable elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"editable\" contenteditable=\"true\">Editable content</div>\n </body></html>`,\n ),\n );\n\n const value = await page.mainFrame().locator(\"#editable\").inputValue();\n expect(value).toBe(\"Editable content\");\n });\n\n test(\"Locator.innerHtml() preserves attributes and structure\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"complex\">\n <a href=\"/link\" class=\"link-class\">Link</a>\n <img src=\"image.png\" alt=\"test\" />\n </div>\n </body></html>`,\n ),\n );\n\n const html = await page.mainFrame().locator(\"#complex\").innerHtml();\n expect(html).toContain('href=\"/link\"');\n expect(html).toContain('class=\"link-class\"');\n expect(html).toContain('src=\"image.png\"');\n expect(html).toContain('alt=\"test\"');\n });\n\n test(\"Locator.textContent() vs innerText() with script/style tags\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"mixed\">\n Visible text\n <script>console.log('script');</script>\n <style>body { color: red; }</style>\n More visible\n </div>\n </body></html>`,\n ),\n );\n\n const textContent = await page.mainFrame().locator(\"#mixed\").textContent();\n // textContent includes script content\n expect(textContent).toContain(\"Visible text\");\n expect(textContent).toContain(\"More visible\");\n\n const innerText = await page.mainFrame().locator(\"#mixed\").innerText();\n // innerText excludes script/style\n expect(innerText).toContain(\"Visible text\");\n expect(innerText).toContain(\"More visible\");\n expect(innerText).not.toContain(\"console.log\");\n });\n\n test(\"Locator.inputValue() returns empty string for non-input elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <div id=\"div\">Not an input</div>\n <input id=\"empty-input\" type=\"text\" value=\"\" />\n </body></html>`,\n ),\n );\n\n const divValue = await page.mainFrame().locator(\"#div\").inputValue();\n expect(divValue).toBe(\"\");\n\n const emptyInput = await page\n .mainFrame()\n .locator(\"#empty-input\")\n .inputValue();\n expect(emptyInput).toBe(\"\");\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_dynamic_config = require("./v3.dynamic.config.js");
|
|
4
|
+
var import_testUtils = require("./testUtils.js");
|
|
5
|
+
import_test.test.describe("Locator count() method with iframes", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
import_test.test.beforeEach(async () => {
|
|
8
|
+
v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
|
|
9
|
+
await v3.init();
|
|
10
|
+
});
|
|
11
|
+
import_test.test.afterEach(async () => {
|
|
12
|
+
await (0, import_testUtils.closeV3)(v3);
|
|
13
|
+
});
|
|
14
|
+
(0, import_test.test)("count() does not search inside iframes by default", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html," + encodeURIComponent(`
|
|
18
|
+
<button>Main Frame Button 1</button>
|
|
19
|
+
<button>Main Frame Button 2</button>
|
|
20
|
+
<iframe id="test-iframe" srcdoc="
|
|
21
|
+
<button>Iframe Button 1</button>
|
|
22
|
+
<button>Iframe Button 2</button>
|
|
23
|
+
<button>Iframe Button 3</button>
|
|
24
|
+
"></iframe>
|
|
25
|
+
`)
|
|
26
|
+
);
|
|
27
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
28
|
+
const mainFrameCount = await page.mainFrame().locator("button").count();
|
|
29
|
+
(0, import_test.expect)(mainFrameCount).toBe(2);
|
|
30
|
+
});
|
|
31
|
+
(0, import_test.test)("count() works with frameLocator for iframe content", async () => {
|
|
32
|
+
const page = v3.context.pages()[0];
|
|
33
|
+
await page.goto(
|
|
34
|
+
"data:text/html," + encodeURIComponent(`
|
|
35
|
+
<button>Main Frame Button</button>
|
|
36
|
+
<iframe id="test-iframe" srcdoc="
|
|
37
|
+
<button>Iframe Button 1</button>
|
|
38
|
+
<button>Iframe Button 2</button>
|
|
39
|
+
<button>Iframe Button 3</button>
|
|
40
|
+
"></iframe>
|
|
41
|
+
`)
|
|
42
|
+
);
|
|
43
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
44
|
+
const iframeLocator = page.frameLocator("#test-iframe");
|
|
45
|
+
const iframeCount = await iframeLocator.locator("button").count();
|
|
46
|
+
(0, import_test.expect)(iframeCount).toBe(3);
|
|
47
|
+
});
|
|
48
|
+
(0, import_test.test)("count() with nested iframes", async () => {
|
|
49
|
+
const page = v3.context.pages()[0];
|
|
50
|
+
await page.goto(
|
|
51
|
+
"data:text/html," + encodeURIComponent(`
|
|
52
|
+
<div class="level-0">Main Frame</div>
|
|
53
|
+
<iframe id="frame1" srcdoc="
|
|
54
|
+
<div class='level-1'>Frame 1</div>
|
|
55
|
+
<iframe id='frame2' srcdoc='
|
|
56
|
+
<div class="level-2">Frame 2</div>
|
|
57
|
+
<div class="level-2">Frame 2</div>
|
|
58
|
+
'></iframe>
|
|
59
|
+
"></iframe>
|
|
60
|
+
`)
|
|
61
|
+
);
|
|
62
|
+
await new Promise((resolve) => setTimeout(resolve, 800));
|
|
63
|
+
const mainCount = await page.mainFrame().locator(".level-0").count();
|
|
64
|
+
(0, import_test.expect)(mainCount).toBe(1);
|
|
65
|
+
const frame1Count = await page.frameLocator("#frame1").locator(".level-1").count();
|
|
66
|
+
(0, import_test.expect)(frame1Count).toBe(1);
|
|
67
|
+
const frame2Count = await page.frameLocator("#frame1").frameLocator("#frame2").locator(".level-2").count();
|
|
68
|
+
(0, import_test.expect)(frame2Count).toBe(2);
|
|
69
|
+
});
|
|
70
|
+
(0, import_test.test)("count() with same selector in multiple contexts", async () => {
|
|
71
|
+
const page = v3.context.pages()[0];
|
|
72
|
+
await page.goto(
|
|
73
|
+
"data:text/html," + encodeURIComponent(`
|
|
74
|
+
<span class="item">Main 1</span>
|
|
75
|
+
<span class="item">Main 2</span>
|
|
76
|
+
<iframe id="frame1" srcdoc="
|
|
77
|
+
<span class='item'>Frame1 Item</span>
|
|
78
|
+
"></iframe>
|
|
79
|
+
<iframe id="frame2" srcdoc="
|
|
80
|
+
<span class='item'>Frame2 Item 1</span>
|
|
81
|
+
<span class='item'>Frame2 Item 2</span>
|
|
82
|
+
<span class='item'>Frame2 Item 3</span>
|
|
83
|
+
"></iframe>
|
|
84
|
+
`)
|
|
85
|
+
);
|
|
86
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
87
|
+
const mainCount = await page.mainFrame().locator(".item").count();
|
|
88
|
+
const frame1Count = await page.frameLocator("#frame1").locator(".item").count();
|
|
89
|
+
const frame2Count = await page.frameLocator("#frame2").locator(".item").count();
|
|
90
|
+
(0, import_test.expect)(mainCount).toBe(2);
|
|
91
|
+
(0, import_test.expect)(frame1Count).toBe(1);
|
|
92
|
+
(0, import_test.expect)(frame2Count).toBe(3);
|
|
93
|
+
});
|
|
94
|
+
(0, import_test.test)("count() returns 0 for non-existent iframe", async () => {
|
|
95
|
+
const page = v3.context.pages()[0];
|
|
96
|
+
await page.goto("data:text/html,<div>No iframes here</div>");
|
|
97
|
+
try {
|
|
98
|
+
const frameLocator = page.frameLocator("#non-existent");
|
|
99
|
+
await frameLocator.locator("button").count();
|
|
100
|
+
(0, import_test.expect)(true).toBe(false);
|
|
101
|
+
} catch (error) {
|
|
102
|
+
(0, import_test.expect)(error.message).toContain(
|
|
103
|
+
"Could not find an element for the given xPath(s):"
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=locator-count-iframe.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/locator-count-iframe.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"Locator count() method with iframes\", () => {\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(\"count() does not search inside iframes by default\", async () => {\n const page = v3.context.pages()[0];\n\n // Create a page with buttons in main frame and iframe\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(`\n <button>Main Frame Button 1</button>\n <button>Main Frame Button 2</button>\n <iframe id=\"test-iframe\" srcdoc=\"\n <button>Iframe Button 1</button>\n <button>Iframe Button 2</button>\n <button>Iframe Button 3</button>\n \"></iframe>\n `),\n );\n\n // Wait for iframe to load\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n // Count buttons in main frame only\n const mainFrameCount = await page.mainFrame().locator(\"button\").count();\n expect(mainFrameCount).toBe(2); // Should only find buttons in main frame\n });\n\n test(\"count() works with frameLocator for iframe content\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(`\n <button>Main Frame Button</button>\n <iframe id=\"test-iframe\" srcdoc=\"\n <button>Iframe Button 1</button>\n <button>Iframe Button 2</button>\n <button>Iframe Button 3</button>\n \"></iframe>\n `),\n );\n\n // Wait for iframe to load\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n // Count buttons in iframe using frameLocator\n const iframeLocator = page.frameLocator(\"#test-iframe\");\n const iframeCount = await iframeLocator.locator(\"button\").count();\n expect(iframeCount).toBe(3); // Should find 3 buttons in iframe\n });\n\n test(\"count() with nested iframes\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(`\n <div class=\"level-0\">Main Frame</div>\n <iframe id=\"frame1\" srcdoc=\"\n <div class='level-1'>Frame 1</div>\n <iframe id='frame2' srcdoc='\n <div class="level-2">Frame 2</div>\n <div class="level-2">Frame 2</div>\n '></iframe>\n \"></iframe>\n `),\n );\n\n // Wait for all iframes to load\n await new Promise((resolve) => setTimeout(resolve, 800));\n\n // Count at each level\n const mainCount = await page.mainFrame().locator(\".level-0\").count();\n expect(mainCount).toBe(1);\n\n const frame1Count = await page\n .frameLocator(\"#frame1\")\n .locator(\".level-1\")\n .count();\n expect(frame1Count).toBe(1);\n\n const frame2Count = await page\n .frameLocator(\"#frame1\")\n .frameLocator(\"#frame2\")\n .locator(\".level-2\")\n .count();\n expect(frame2Count).toBe(2);\n });\n\n test(\"count() with same selector in multiple contexts\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(`\n <span class=\"item\">Main 1</span>\n <span class=\"item\">Main 2</span>\n <iframe id=\"frame1\" srcdoc=\"\n <span class='item'>Frame1 Item</span>\n \"></iframe>\n <iframe id=\"frame2\" srcdoc=\"\n <span class='item'>Frame2 Item 1</span>\n <span class='item'>Frame2 Item 2</span>\n <span class='item'>Frame2 Item 3</span>\n \"></iframe>\n `),\n );\n\n // Wait for iframes to load\n await new Promise((resolve) => setTimeout(resolve, 500));\n\n // Count in each context\n const mainCount = await page.mainFrame().locator(\".item\").count();\n const frame1Count = await page\n .frameLocator(\"#frame1\")\n .locator(\".item\")\n .count();\n const frame2Count = await page\n .frameLocator(\"#frame2\")\n .locator(\".item\")\n .count();\n\n expect(mainCount).toBe(2); // Main frame items only\n expect(frame1Count).toBe(1); // Frame 1 items only\n expect(frame2Count).toBe(3); // Frame 2 items only\n });\n\n test(\"count() returns 0 for non-existent iframe\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\"data:text/html,<div>No iframes here</div>\");\n\n try {\n const frameLocator = page.frameLocator(\"#non-existent\");\n await frameLocator.locator(\"button\").count();\n // If we get here, the test should fail\n expect(true).toBe(false);\n } catch (error) {\n // Expected behavior - frameLocator should throw when iframe doesn't exist\n expect(error.message).toContain(\n \"Could not find an element for the given xPath(s):\",\n );\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_v3_dynamic_config = require("./v3.dynamic.config.js");
|
|
4
|
+
var import_testUtils = require("./testUtils.js");
|
|
5
|
+
import_test.test.describe("Locator count() method tests", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
import_test.test.beforeEach(async () => {
|
|
8
|
+
v3 = new import_v3.V3(import_v3_dynamic_config.v3DynamicTestConfig);
|
|
9
|
+
await v3.init();
|
|
10
|
+
});
|
|
11
|
+
import_test.test.afterEach(async () => {
|
|
12
|
+
await (0, import_testUtils.closeV3)(v3);
|
|
13
|
+
});
|
|
14
|
+
(0, import_test.test)("count() returns correct number for CSS selectors", async () => {
|
|
15
|
+
const page = v3.context.pages()[0];
|
|
16
|
+
await page.goto(
|
|
17
|
+
"data:text/html,<div class='test'>1</div><div class='test'>2</div><div class='test'>3</div><span>4</span>"
|
|
18
|
+
);
|
|
19
|
+
const locator = page.mainFrame().locator(".test");
|
|
20
|
+
const count = await locator.count();
|
|
21
|
+
(0, import_test.expect)(count).toBe(3);
|
|
22
|
+
});
|
|
23
|
+
(0, import_test.test)("count() returns 0 for non-matching selectors", async () => {
|
|
24
|
+
const page = v3.context.pages()[0];
|
|
25
|
+
await page.goto("data:text/html,<div>Test</div>");
|
|
26
|
+
const locator = page.mainFrame().locator(".non-existent");
|
|
27
|
+
const count = await locator.count();
|
|
28
|
+
(0, import_test.expect)(count).toBe(0);
|
|
29
|
+
});
|
|
30
|
+
(0, import_test.test)("count() works with XPath selectors", async () => {
|
|
31
|
+
const page = v3.context.pages()[0];
|
|
32
|
+
await page.goto(
|
|
33
|
+
"data:text/html,<button>Button 1</button><button>Button 2</button><button>Button 3</button>"
|
|
34
|
+
);
|
|
35
|
+
const locator = page.mainFrame().locator("//button");
|
|
36
|
+
const count = await locator.count();
|
|
37
|
+
(0, import_test.expect)(count).toBe(3);
|
|
38
|
+
});
|
|
39
|
+
(0, import_test.test)("count() works with text selectors", async () => {
|
|
40
|
+
const page = v3.context.pages()[0];
|
|
41
|
+
await page.goto(
|
|
42
|
+
"data:text/html,<div>Click me</div><button>Click me</button><span>Don't click me</span>"
|
|
43
|
+
);
|
|
44
|
+
const locator = page.mainFrame().locator("text=Click me");
|
|
45
|
+
const count = await locator.count();
|
|
46
|
+
(0, import_test.expect)(count).toBe(3);
|
|
47
|
+
});
|
|
48
|
+
(0, import_test.test)("count() handles shadow DOM elements", async () => {
|
|
49
|
+
const page = v3.context.pages()[0];
|
|
50
|
+
await page.goto(
|
|
51
|
+
"data:text/html," + encodeURIComponent(
|
|
52
|
+
'<div id="host"></div><script>const host = document.getElementById("host");const shadow = host.attachShadow({mode: "open"});shadow.innerHTML = "<button>1</button><button>2</button>";</script>'
|
|
53
|
+
),
|
|
54
|
+
{ waitUntil: "load", timeoutMs: 3e4 }
|
|
55
|
+
);
|
|
56
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
57
|
+
const locator = page.mainFrame().locator("button");
|
|
58
|
+
const count = await locator.count();
|
|
59
|
+
(0, import_test.expect)(count).toBe(2);
|
|
60
|
+
});
|
|
61
|
+
(0, import_test.test)("count() works with complex CSS selectors", async () => {
|
|
62
|
+
const page = v3.context.pages()[0];
|
|
63
|
+
await page.goto(
|
|
64
|
+
"data:text/html,<div class='container'><span class='item'>1</span><span class='item'>2</span></div><div><span class='item'>3</span></div>"
|
|
65
|
+
);
|
|
66
|
+
const locator = page.mainFrame().locator(".container .item");
|
|
67
|
+
const count = await locator.count();
|
|
68
|
+
(0, import_test.expect)(count).toBe(2);
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=locator-count.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/locator-count.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { v3DynamicTestConfig } from \"./v3.dynamic.config.js\";\nimport { closeV3 } from \"./testUtils.js\";\n\ntest.describe(\"Locator count() method tests\", () => {\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(\"count() returns correct number for CSS selectors\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,<div class='test'>1</div><div class='test'>2</div><div class='test'>3</div><span>4</span>\",\n );\n\n const locator = page.mainFrame().locator(\".test\");\n const count = await locator.count();\n\n expect(count).toBe(3);\n });\n\n test(\"count() returns 0 for non-matching selectors\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\"data:text/html,<div>Test</div>\");\n\n const locator = page.mainFrame().locator(\".non-existent\");\n const count = await locator.count();\n\n expect(count).toBe(0);\n });\n\n test(\"count() works with XPath selectors\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,<button>Button 1</button><button>Button 2</button><button>Button 3</button>\",\n );\n\n const locator = page.mainFrame().locator(\"//button\");\n const count = await locator.count();\n\n expect(count).toBe(3);\n });\n\n test(\"count() works with text selectors\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,<div>Click me</div><button>Click me</button><span>Don't click me</span>\",\n );\n\n const locator = page.mainFrame().locator(\"text=Click me\");\n const count = await locator.count();\n\n // Case-insensitive substring match: also matches \"Don't click me\"\n expect(count).toBe(3);\n });\n\n test(\"count() handles shadow DOM elements\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n '<div id=\"host\"></div>' +\n \"<script>\" +\n 'const host = document.getElementById(\"host\");' +\n 'const shadow = host.attachShadow({mode: \"open\"});' +\n 'shadow.innerHTML = \"<button>1</button><button>2</button>\";' +\n \"</script>\",\n ),\n { waitUntil: \"load\", timeoutMs: 30000 },\n );\n\n // Wait a bit for shadow DOM to be attached\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const locator = page.mainFrame().locator(\"button\");\n const count = await locator.count();\n\n expect(count).toBe(2);\n });\n\n test(\"count() works with complex CSS selectors\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,<div class='container'><span class='item'>1</span><span class='item'>2</span></div><div><span class='item'>3</span></div>\",\n );\n\n const locator = page.mainFrame().locator(\".container .item\");\n const count = await locator.count();\n\n expect(count).toBe(2);\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,kBAA6B;AAC7B,gBAAmB;AACnB,+BAAoC;AACpC,uBAAwB;AAExB,iBAAK,SAAS,gCAAgC,MAAM;AAClD,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,oDAAoD,YAAY;AACnE,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,OAAO;AAChD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AAED,wBAAK,gDAAgD,YAAY;AAC/D,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK,KAAK,gCAAgC;AAEhD,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,eAAe;AACxD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AAED,wBAAK,sCAAsC,YAAY;AACrD,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,UAAU;AACnD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AAED,wBAAK,qCAAqC,YAAY;AACpD,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,eAAe;AACxD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAGlC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AAED,wBAAK,uCAAuC,YAAY;AACtD,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT,oBACE;AAAA,QACE;AAAA,MAMF;AAAA,MACF,EAAE,WAAW,QAAQ,WAAW,IAAM;AAAA,IACxC;AAGA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,GAAG,CAAC;AAEvD,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,QAAQ;AACjD,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AAED,wBAAK,4CAA4C,YAAY;AAC3D,UAAM,OAAO,GAAG,QAAQ,MAAM,EAAE,CAAC;AAEjC,UAAM,KAAK;AAAA,MACT;AAAA,IACF;AAEA,UAAM,UAAU,KAAK,UAAU,EAAE,QAAQ,kBAAkB;AAC3D,UAAM,QAAQ,MAAM,QAAQ,MAAM;AAElC,4BAAO,KAAK,EAAE,KAAK,CAAC;AAAA,EACtB,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
var import_test = require("@playwright/test");
|
|
2
|
+
var import_v3 = require("../v3.js");
|
|
3
|
+
var import_sdkErrors = require("../types/public/sdkErrors.js");
|
|
4
|
+
var import_v3_config = require("./v3.config.js");
|
|
5
|
+
import_test.test.describe("Locator.fill()", () => {
|
|
6
|
+
let v3;
|
|
7
|
+
import_test.test.beforeEach(async () => {
|
|
8
|
+
v3 = new import_v3.V3(import_v3_config.v3TestConfig);
|
|
9
|
+
await v3.init();
|
|
10
|
+
});
|
|
11
|
+
import_test.test.afterEach(async () => {
|
|
12
|
+
await v3?.close?.().catch((e) => {
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
(0, import_test.test)("fills date inputs via value setter even when beforeinput blocks insertText", async () => {
|
|
16
|
+
const page = v3.context.pages()[0];
|
|
17
|
+
await page.goto(
|
|
18
|
+
"data:text/html," + encodeURIComponent(
|
|
19
|
+
`<!doctype html><html><body>
|
|
20
|
+
<input id="date" type="date" />
|
|
21
|
+
<script>
|
|
22
|
+
const input = document.getElementById('date');
|
|
23
|
+
input.addEventListener('beforeinput', (e) => {
|
|
24
|
+
if (e && e.inputType === 'insertText') e.preventDefault();
|
|
25
|
+
});
|
|
26
|
+
</script>
|
|
27
|
+
</body></html>`
|
|
28
|
+
)
|
|
29
|
+
);
|
|
30
|
+
const dateInput = page.mainFrame().locator("xpath=/html/body/input");
|
|
31
|
+
await dateInput.fill("2026-01-01");
|
|
32
|
+
const value = await dateInput.inputValue();
|
|
33
|
+
(0, import_test.expect)(value).toBe("2026-01-01");
|
|
34
|
+
});
|
|
35
|
+
(0, import_test.test)("xpath case: throws StagehandLocatorError when fill encounters an exception", async () => {
|
|
36
|
+
const page = v3.context.pages()[0];
|
|
37
|
+
await page.goto(
|
|
38
|
+
"data:text/html," + encodeURIComponent(
|
|
39
|
+
`<!doctype html><html><body>
|
|
40
|
+
<input id="date" type="date" />
|
|
41
|
+
</body></html>`
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
await page.waitForSelector("xpath=/html/body/input");
|
|
45
|
+
await page.evaluate(() => {
|
|
46
|
+
const input = document.querySelector("input");
|
|
47
|
+
Object.defineProperty(input, "isConnected", {
|
|
48
|
+
get() {
|
|
49
|
+
throw new Error("boom");
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
const dateInput = page.mainFrame().locator("xpath=/html/body/input");
|
|
54
|
+
let error;
|
|
55
|
+
try {
|
|
56
|
+
await dateInput.fill("2026-01-01");
|
|
57
|
+
} catch (err) {
|
|
58
|
+
error = err;
|
|
59
|
+
}
|
|
60
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StagehandLocatorError);
|
|
61
|
+
if (error instanceof Error) {
|
|
62
|
+
(0, import_test.expect)(error.message).toContain("Error Filling Element");
|
|
63
|
+
(0, import_test.expect)(error.message).toContain("selector: xpath=/html/body/input");
|
|
64
|
+
(0, import_test.expect)(error.message).toContain("boom");
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
(0, import_test.test)("css selector case: throws StagehandLocatorError when fill encounters an exception", async () => {
|
|
68
|
+
const page = v3.context.pages()[0];
|
|
69
|
+
await page.goto(
|
|
70
|
+
"data:text/html," + encodeURIComponent(
|
|
71
|
+
`<!doctype html><html><body>
|
|
72
|
+
<input id="date" type="date" />
|
|
73
|
+
</body></html>`
|
|
74
|
+
)
|
|
75
|
+
);
|
|
76
|
+
await page.waitForSelector("#date");
|
|
77
|
+
await page.evaluate(() => {
|
|
78
|
+
const input = document.querySelector("input");
|
|
79
|
+
Object.defineProperty(input, "isConnected", {
|
|
80
|
+
get() {
|
|
81
|
+
throw new Error("boom");
|
|
82
|
+
},
|
|
83
|
+
configurable: true
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
const frameId = page.mainFrameId();
|
|
87
|
+
const { executionContextId } = await page.sendCDP("Page.createIsolatedWorld", {
|
|
88
|
+
frameId,
|
|
89
|
+
worldName: "v3-world"
|
|
90
|
+
});
|
|
91
|
+
await page.sendCDP("Runtime.evaluate", {
|
|
92
|
+
expression: `(() => {
|
|
93
|
+
const input = document.querySelector('input');
|
|
94
|
+
if (input) {
|
|
95
|
+
Object.defineProperty(input, 'isConnected', {
|
|
96
|
+
get() { throw new Error("boom"); },
|
|
97
|
+
configurable: true
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
})()`,
|
|
101
|
+
contextId: executionContextId
|
|
102
|
+
});
|
|
103
|
+
const dateInput = page.mainFrame().locator("#date");
|
|
104
|
+
let error;
|
|
105
|
+
try {
|
|
106
|
+
await dateInput.fill("2026-01-01");
|
|
107
|
+
} catch (err) {
|
|
108
|
+
error = err;
|
|
109
|
+
}
|
|
110
|
+
(0, import_test.expect)(error).toBeInstanceOf(import_sdkErrors.StagehandLocatorError);
|
|
111
|
+
if (error instanceof Error) {
|
|
112
|
+
(0, import_test.expect)(error.message).toContain("Error Filling Element");
|
|
113
|
+
(0, import_test.expect)(error.message).toContain("selector: #date");
|
|
114
|
+
(0, import_test.expect)(error.message).toContain("boom");
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=locator-fill.spec.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../lib/v3/tests/locator-fill.spec.ts"],
|
|
4
|
+
"sourcesContent": ["import { expect, test } from \"@playwright/test\";\nimport { V3 } from \"../v3.js\";\nimport { StagehandLocatorError } from \"../types/public/sdkErrors.js\";\nimport { v3TestConfig } from \"./v3.config.js\";\n\ntest.describe(\"Locator.fill()\", () => {\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((e) => {\n void e;\n });\n });\n\n test(\"fills date inputs via value setter even when beforeinput blocks insertText\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n <script>\n const input = document.getElementById('date');\n input.addEventListener('beforeinput', (e) => {\n if (e && e.inputType === 'insertText') e.preventDefault();\n });\n </script>\n </body></html>`,\n ),\n );\n\n const dateInput = page.mainFrame().locator(\"xpath=/html/body/input\");\n await dateInput.fill(\"2026-01-01\");\n\n const value = await dateInput.inputValue();\n expect(value).toBe(\"2026-01-01\");\n });\n\n test(\"xpath case: throws StagehandLocatorError when fill encounters an exception\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n </body></html>`,\n ),\n );\n\n await page.waitForSelector(\"xpath=/html/body/input\");\n\n await page.evaluate(() => {\n const input = document.querySelector(\"input\");\n Object.defineProperty(input, \"isConnected\", {\n get() {\n throw new Error(\"boom\");\n },\n });\n });\n\n const dateInput = page.mainFrame().locator(\"xpath=/html/body/input\");\n let error: unknown;\n try {\n await dateInput.fill(\"2026-01-01\");\n } catch (err) {\n error = err;\n }\n\n expect(error).toBeInstanceOf(StagehandLocatorError);\n if (error instanceof Error) {\n // Log the message so it's visible in test output.\n expect(error.message).toContain(\"Error Filling Element\");\n expect(error.message).toContain(\"selector: xpath=/html/body/input\");\n expect(error.message).toContain(\"boom\");\n }\n });\n\n test(\"css selector case: throws StagehandLocatorError when fill encounters an exception\", async () => {\n const page = v3.context.pages()[0];\n\n await page.goto(\n \"data:text/html,\" +\n encodeURIComponent(\n `<!doctype html><html><body>\n <input id=\"date\" type=\"date\" />\n </body></html>`,\n ),\n );\n\n await page.waitForSelector(\"#date\");\n\n // Override in main world\n await page.evaluate(() => {\n const input = document.querySelector(\"input\");\n Object.defineProperty(input, \"isConnected\", {\n get() {\n throw new Error(\"boom\");\n },\n configurable: true,\n });\n });\n\n // Also override in the isolated world that CSS selectors use\n const frameId = page.mainFrameId();\n const { executionContextId } = await page.sendCDP<{\n executionContextId: number;\n }>(\"Page.createIsolatedWorld\", {\n frameId,\n worldName: \"v3-world\",\n });\n\n await page.sendCDP(\"Runtime.evaluate\", {\n expression: `(() => {\n const input = document.querySelector('input');\n if (input) {\n Object.defineProperty(input, 'isConnected', {\n get() { throw new Error(\"boom\"); },\n configurable: true\n });\n }\n })()`,\n contextId: executionContextId,\n });\n\n const dateInput = page.mainFrame().locator(\"#date\");\n let error: unknown;\n try {\n await dateInput.fill(\"2026-01-01\");\n } catch (err) {\n error = err;\n }\n\n expect(error).toBeInstanceOf(StagehandLocatorError);\n if (error instanceof Error) {\n expect(error.message).toContain(\"Error Filling Element\");\n expect(error.message).toContain(\"selector: #date\");\n expect(error.message).toContain(\"boom\");\n }\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|