@browserbasehq/orca 3.1.0-patch.0 → 3.1.0-patch.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/cli.js +183 -0
- package/dist/cjs/cli.js.map +7 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +24956 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/lib/inference.d.ts +65 -0
- package/dist/cjs/lib/inferenceLogUtils.d.ts +12 -0
- package/dist/cjs/lib/logger.d.ts +69 -0
- package/dist/cjs/lib/modelUtils.d.ts +11 -0
- package/dist/cjs/lib/prompt.d.ts +14 -0
- package/dist/cjs/lib/utils.d.ts +68 -0
- package/dist/cjs/lib/v3/agent/AgentClient.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/AgentProvider.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/AnthropicCUAClient.d.ts +57 -0
- package/dist/cjs/lib/v3/agent/GoogleCUAClient.d.ts +74 -0
- package/dist/cjs/lib/v3/agent/MicrosoftCUAClient.d.ts +71 -0
- package/dist/cjs/lib/v3/agent/OpenAICUAClient.d.ts +69 -0
- package/dist/cjs/lib/v3/agent/prompts/agentSystemPrompt.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/act.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/ariaTree.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/tools/click.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/clickAndHold.d.ts +14 -0
- package/dist/cjs/lib/v3/agent/tools/dragAndDrop.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/extract.d.ts +20 -0
- package/dist/cjs/lib/v3/agent/tools/fillFormVision.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/fillform.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/goto.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/tools/index.d.ts +92 -0
- package/dist/cjs/lib/v3/agent/tools/keys.d.ts +24 -0
- package/dist/cjs/lib/v3/agent/tools/navback.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/screenshot.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/scroll.d.ts +19 -0
- package/dist/cjs/lib/v3/agent/tools/search.d.ts +15 -0
- package/dist/cjs/lib/v3/agent/tools/think.d.ts +6 -0
- package/dist/cjs/lib/v3/agent/tools/type.d.ts +7 -0
- package/dist/cjs/lib/v3/agent/tools/wait.d.ts +5 -0
- package/dist/cjs/lib/v3/agent/utils/actionMapping.d.ts +3 -0
- package/dist/cjs/lib/v3/agent/utils/coordinateNormalization.d.ts +13 -0
- package/dist/cjs/lib/v3/agent/utils/cuaKeyMapping.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/googleCustomToolHandler.d.ts +25 -0
- package/dist/cjs/lib/v3/agent/utils/handleDoneToolCall.d.ts +22 -0
- package/dist/cjs/lib/v3/agent/utils/imageCompression.d.ts +53 -0
- package/dist/cjs/lib/v3/agent/utils/messageProcessing.d.ts +12 -0
- package/dist/cjs/lib/v3/agent/utils/screenshotHandler.d.ts +10 -0
- package/dist/cjs/lib/v3/agent/utils/validateExperimentalFeatures.d.ts +26 -0
- package/dist/cjs/lib/v3/agent/utils/xpath.d.ts +11 -0
- package/dist/cjs/lib/v3/api.d.ts +86 -0
- package/dist/cjs/lib/v3/cache/ActCache.d.ts +23 -0
- package/dist/cjs/lib/v3/cache/AgentCache.d.ts +109 -0
- package/dist/cjs/lib/v3/cache/CacheStorage.d.ts +17 -0
- package/dist/cjs/lib/v3/cache/serverAgentCache.d.ts +7 -0
- package/dist/cjs/lib/v3/cache/utils.d.ts +15 -0
- package/dist/cjs/lib/v3/cli.d.ts +2 -0
- package/dist/cjs/lib/v3/dom/a11yScripts/index.d.ts +11 -0
- package/dist/cjs/lib/v3/dom/build/a11yScripts.generated.d.ts +16 -0
- package/dist/cjs/lib/v3/dom/build/locatorScripts.generated.d.ts +52 -0
- package/dist/cjs/lib/v3/dom/build/reRenderScriptContent.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/rerender-index.js +1 -0
- package/dist/cjs/lib/v3/dom/build/screenshotScripts.generated.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/build/scriptV3Content.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/cjs/lib/v3/dom/build/v3-index.js +1 -0
- package/dist/cjs/lib/v3/dom/genA11yScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genDomScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genLocatorScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/genScreenshotScripts.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/counts.d.ts +15 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/index.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/scripts.d.ts +37 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/selectors.d.ts +4 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/waitForSelector.d.ts +19 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathParser.d.ts +76 -0
- package/dist/cjs/lib/v3/dom/locatorScripts/xpathResolver.d.ts +9 -0
- package/dist/cjs/lib/v3/dom/piercer.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/piercer.runtime.d.ts +23 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.entry.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/rerenderMissingShadows.runtime.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/index.d.ts +1 -0
- package/dist/cjs/lib/v3/dom/screenshotScripts/resolveMaskRect.d.ts +8 -0
- package/dist/cjs/lib/v3/external_clients/aisdk.d.ts +11 -0
- package/dist/cjs/lib/v3/external_clients/customOpenAI.d.ts +18 -0
- package/dist/cjs/lib/v3/flowLogger.d.ts +139 -0
- package/dist/cjs/lib/v3/handlers/actHandler.d.ts +21 -0
- package/dist/cjs/lib/v3/handlers/extractHandler.d.ts +31 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/actHandlerUtils.d.ts +24 -0
- package/dist/cjs/lib/v3/handlers/handlerUtils/timeoutGuard.d.ts +2 -0
- package/dist/cjs/lib/v3/handlers/observeHandler.d.ts +17 -0
- package/dist/cjs/lib/v3/handlers/v3AgentHandler.d.ts +32 -0
- package/dist/cjs/lib/v3/handlers/v3CuaAgentHandler.d.ts +33 -0
- package/dist/cjs/lib/v3/index.d.ts +18 -0
- package/dist/cjs/lib/v3/launch/browserbase.d.ts +7 -0
- package/dist/cjs/lib/v3/launch/local.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/AnthropicClient.d.ts +16 -0
- package/dist/cjs/lib/v3/llm/CerebrasClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/GoogleClient.d.ts +19 -0
- package/dist/cjs/lib/v3/llm/GroqClient.d.ts +17 -0
- package/dist/cjs/lib/v3/llm/LLMClient.d.ts +121 -0
- package/dist/cjs/lib/v3/llm/LLMProvider.d.ts +13 -0
- package/dist/cjs/lib/v3/llm/OpenAIClient.d.ts +15 -0
- package/dist/cjs/lib/v3/llm/aisdk.d.ts +15 -0
- package/dist/cjs/lib/v3/logger.d.ts +9 -0
- package/dist/cjs/lib/v3/mcp/connection.d.ts +11 -0
- package/dist/cjs/lib/v3/mcp/utils.d.ts +3 -0
- package/dist/cjs/lib/v3/shutdown/cleanupLocal.d.ts +14 -0
- package/dist/cjs/lib/v3/shutdown/supervisor.d.ts +11 -0
- package/dist/cjs/lib/v3/shutdown/supervisorClient.d.ts +15 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js +113 -0
- package/dist/cjs/lib/v3/tests/agent-abort-signal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js +102 -0
- package/dist/cjs/lib/v3/tests/agent-cache-self-heal.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js +374 -0
- package/dist/cjs/lib/v3/tests/agent-callbacks.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js +354 -0
- package/dist/cjs/lib/v3/tests/agent-experimental-validation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js +247 -0
- package/dist/cjs/lib/v3/tests/agent-hybrid-mode.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js +105 -0
- package/dist/cjs/lib/v3/tests/agent-message-continuation.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js +126 -0
- package/dist/cjs/lib/v3/tests/agent-streaming.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js +44 -0
- package/dist/cjs/lib/v3/tests/cdp-session-detached.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js +147 -0
- package/dist/cjs/lib/v3/tests/click-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js +54 -0
- package/dist/cjs/lib/v3/tests/connect-to-existing-browser.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js +176 -0
- package/dist/cjs/lib/v3/tests/context-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/default-page-tracking.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js +80 -0
- package/dist/cjs/lib/v3/tests/downloads.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js +53 -0
- package/dist/cjs/lib/v3/tests/frame-get-location-and-click.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js +493 -0
- package/dist/cjs/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js +92 -0
- package/dist/cjs/lib/v3/tests/keep-alive.child.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js +568 -0
- package/dist/cjs/lib/v3/tests/keep-alive.helpers.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js +15 -0
- package/dist/cjs/lib/v3/tests/keep-alive.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js +296 -0
- package/dist/cjs/lib/v3/tests/keyboard.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js +159 -0
- package/dist/cjs/lib/v3/tests/locator-backend-node-id.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js +191 -0
- package/dist/cjs/lib/v3/tests/locator-content-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js +108 -0
- package/dist/cjs/lib/v3/tests/locator-count-iframe.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js +71 -0
- package/dist/cjs/lib/v3/tests/locator-count.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js +118 -0
- package/dist/cjs/lib/v3/tests/locator-fill.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js +136 -0
- package/dist/cjs/lib/v3/tests/locator-input-methods.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js +157 -0
- package/dist/cjs/lib/v3/tests/locator-nth.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js +242 -0
- package/dist/cjs/lib/v3/tests/locator-select-option.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js +547 -0
- package/dist/cjs/lib/v3/tests/logger-initialization.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js +269 -0
- package/dist/cjs/lib/v3/tests/multi-instance-logger.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js +23 -0
- package/dist/cjs/lib/v3/tests/nested-div.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js +90 -0
- package/dist/cjs/lib/v3/tests/page-addInitScript.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js +56 -0
- package/dist/cjs/lib/v3/tests/page-console.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js +418 -0
- package/dist/cjs/lib/v3/tests/page-drag-and-drop.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js +35 -0
- package/dist/cjs/lib/v3/tests/page-goto-response.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js +167 -0
- package/dist/cjs/lib/v3/tests/page-hover.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js +295 -0
- package/dist/cjs/lib/v3/tests/page-screenshot.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js +182 -0
- package/dist/cjs/lib/v3/tests/page-scroll.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js +46 -0
- package/dist/cjs/lib/v3/tests/page-send-cdp.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js +98 -0
- package/dist/cjs/lib/v3/tests/perform-understudy-method.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js +148 -0
- package/dist/cjs/lib/v3/tests/setinputfiles.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-oopif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js +156 -0
- package/dist/cjs/lib/v3/tests/shadow-iframe-spif.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/testUtils.js +54 -0
- package/dist/cjs/lib/v3/tests/testUtils.js.map +7 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js +100 -0
- package/dist/cjs/lib/v3/tests/text-selector-innermost.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js +32 -0
- package/dist/cjs/lib/v3/tests/timeouts.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js +65 -0
- package/dist/cjs/lib/v3/tests/user-data-dir.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.config.js +36 -0
- package/dist/cjs/lib/v3/tests/v3.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js +67 -0
- package/dist/cjs/lib/v3/tests/v3.dynamic.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js +61 -0
- package/dist/cjs/lib/v3/tests/v3.playwright.config.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js +593 -0
- package/dist/cjs/lib/v3/tests/wait-for-selector.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js +97 -0
- package/dist/cjs/lib/v3/tests/wait-for-timeout.spec.js.map +7 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js +77 -0
- package/dist/cjs/lib/v3/tests/xpath-for-location-deep.spec.js.map +7 -0
- package/dist/cjs/lib/v3/timeoutConfig.d.ts +2 -0
- package/dist/cjs/lib/v3/types/private/agent.d.ts +6 -0
- package/dist/cjs/lib/v3/types/private/api.d.ts +11 -0
- package/dist/cjs/lib/v3/types/private/cache.d.ts +128 -0
- package/dist/cjs/lib/v3/types/private/evaluator.d.ts +40 -0
- package/dist/cjs/lib/v3/types/private/handlers.d.ts +38 -0
- package/dist/cjs/lib/v3/types/private/index.d.ts +7 -0
- package/dist/cjs/lib/v3/types/private/internal.d.ts +39 -0
- package/dist/cjs/lib/v3/types/private/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/private/network.d.ts +34 -0
- package/dist/cjs/lib/v3/types/private/shutdown.d.ts +19 -0
- package/dist/cjs/lib/v3/types/private/shutdownErrors.d.ts +12 -0
- package/dist/cjs/lib/v3/types/private/snapshot.d.ts +117 -0
- package/dist/cjs/lib/v3/types/public/agent.d.ts +595 -0
- package/dist/cjs/lib/v3/types/public/api.d.ts +1211 -0
- package/dist/cjs/lib/v3/types/public/apiErrors.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/index.d.ts +12 -0
- package/dist/cjs/lib/v3/types/public/locator.d.ts +9 -0
- package/dist/cjs/lib/v3/types/public/logs.d.ts +23 -0
- package/dist/cjs/lib/v3/types/public/methods.d.ts +56 -0
- package/dist/cjs/lib/v3/types/public/metrics.d.ts +27 -0
- package/dist/cjs/lib/v3/types/public/model.d.ts +65 -0
- package/dist/cjs/lib/v3/types/public/options.d.ts +70 -0
- package/dist/cjs/lib/v3/types/public/page.d.ts +18 -0
- package/dist/cjs/lib/v3/types/public/screenshotTypes.d.ts +25 -0
- package/dist/cjs/lib/v3/types/public/sdkErrors.d.ts +152 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/a11yTree.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/activeElement.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/capture.d.ts +77 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/coordinateResolver.d.ts +7 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/domTree.d.ts +46 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/focusSelectors.d.ts +24 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/index.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/sessions.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/treeFormatUtils.d.ts +28 -0
- package/dist/cjs/lib/v3/understudy/a11y/snapshot/xpathUtils.d.ts +26 -0
- package/dist/cjs/lib/v3/understudy/a11yInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/cdp.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/consoleMessage.d.ts +22 -0
- package/dist/cjs/lib/v3/understudy/context.d.ts +132 -0
- package/dist/cjs/lib/v3/understudy/deepLocator.d.ts +87 -0
- package/dist/cjs/lib/v3/understudy/executionContextRegistry.d.ts +15 -0
- package/dist/cjs/lib/v3/understudy/fileUploadUtils.d.ts +13 -0
- package/dist/cjs/lib/v3/understudy/frame.d.ts +69 -0
- package/dist/cjs/lib/v3/understudy/frameLocator.d.ts +50 -0
- package/dist/cjs/lib/v3/understudy/frameRegistry.d.ts +101 -0
- package/dist/cjs/lib/v3/understudy/initScripts.d.ts +2 -0
- package/dist/cjs/lib/v3/understudy/lifecycleWatcher.d.ts +64 -0
- package/dist/cjs/lib/v3/understudy/locator.d.ts +194 -0
- package/dist/cjs/lib/v3/understudy/locatorInvocation.d.ts +8 -0
- package/dist/cjs/lib/v3/understudy/navigationResponseTracker.d.ts +84 -0
- package/dist/cjs/lib/v3/understudy/networkManager.d.ts +53 -0
- package/dist/cjs/lib/v3/understudy/page.d.ts +354 -0
- package/dist/cjs/lib/v3/understudy/piercer.d.ts +4 -0
- package/dist/cjs/lib/v3/understudy/response.d.ts +137 -0
- package/dist/cjs/lib/v3/understudy/screenshotUtils.d.ts +16 -0
- package/dist/cjs/lib/v3/understudy/selectorResolver.d.ts +38 -0
- package/dist/cjs/lib/v3/v3.d.ts +191 -0
- package/dist/cjs/lib/v3/zodCompat.d.ts +12 -0
- package/dist/cjs/lib/v3Evaluator.d.ts +19 -0
- package/dist/cjs/lib/version.d.ts +5 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js +101 -0
- package/dist/cjs/tests/browserbase-session-accessors.test.js.map +7 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js +187 -0
- package/dist/cjs/tests/cache-llm-resolution.test.js.map +7 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js +50 -0
- package/dist/cjs/tests/helpers/mockCDPSession.js.map +7 -0
- package/dist/cjs/tests/llm-provider.test.js +57 -0
- package/dist/cjs/tests/llm-provider.test.js.map +7 -0
- package/dist/cjs/tests/model-deprecation.test.js +132 -0
- package/dist/cjs/tests/model-deprecation.test.js.map +7 -0
- package/dist/cjs/tests/page-snapshot.test.js +58 -0
- package/dist/cjs/tests/page-snapshot.test.js.map +7 -0
- package/dist/cjs/tests/public-api/export-surface.test.js +76 -0
- package/dist/cjs/tests/public-api/export-surface.test.js.map +7 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js +150 -0
- package/dist/cjs/tests/public-api/llm-and-agents.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js +104 -0
- package/dist/cjs/tests/public-api/public-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/public-types.test.js +74 -0
- package/dist/cjs/tests/public-api/public-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js +53 -0
- package/dist/cjs/tests/public-api/runtime-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js +100 -0
- package/dist/cjs/tests/public-api/schema-utils.test.js.map +7 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js +103 -0
- package/dist/cjs/tests/public-api/timeout-error-types.test.js.map +7 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js +47 -0
- package/dist/cjs/tests/public-api/tool-type-export.test.js.map +7 -0
- package/dist/cjs/tests/public-api/v3-core.test.js +104 -0
- package/dist/cjs/tests/public-api/v3-core.test.js.map +7 -0
- package/dist/cjs/tests/safety-confirmation.test.js +134 -0
- package/dist/cjs/tests/safety-confirmation.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js +370 -0
- package/dist/cjs/tests/snapshot-a11y-resolvers.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js +294 -0
- package/dist/cjs/tests/snapshot-a11y-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js +403 -0
- package/dist/cjs/tests/snapshot-capture-orchestration.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-cbor.test.js +197 -0
- package/dist/cjs/tests/snapshot-cbor.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js +246 -0
- package/dist/cjs/tests/snapshot-dom-session-builders.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js +104 -0
- package/dist/cjs/tests/snapshot-dom-tree-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js +45 -0
- package/dist/cjs/tests/snapshot-focus-selectors-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js +388 -0
- package/dist/cjs/tests/snapshot-frame-merge.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js +106 -0
- package/dist/cjs/tests/snapshot-tree-format-utils.test.js.map +7 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js +74 -0
- package/dist/cjs/tests/snapshot-xpath-utils.test.js.map +7 -0
- package/dist/cjs/tests/timeout-handlers.test.js +864 -0
- package/dist/cjs/tests/timeout-handlers.test.js.map +7 -0
- package/dist/cjs/tests/xpath-parser.test.js +314 -0
- package/dist/cjs/tests/xpath-parser.test.js.map +7 -0
- package/dist/cjs/tests/xpath-resolver.test.js +70 -0
- package/dist/cjs/tests/xpath-resolver.test.js.map +7 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js +119 -0
- package/dist/cjs/tests/zod-enum-compatibility.test.js.map +7 -0
- package/dist/esm/lib/modelUtils.d.ts +0 -3
- package/dist/esm/lib/modelUtils.js +2 -7
- package/dist/esm/lib/modelUtils.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/act.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/act.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/extract.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/extract.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/fillform.d.ts +1 -2
- package/dist/esm/lib/v3/agent/tools/fillform.js.map +1 -1
- package/dist/esm/lib/v3/agent/tools/index.d.ts +2 -2
- package/dist/esm/lib/v3/agent/tools/index.js.map +1 -1
- package/dist/esm/lib/v3/cli.d.ts +2 -0
- package/dist/esm/lib/v3/cli.js +10 -0
- package/dist/esm/lib/v3/cli.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/rerender-index.js.map +1 -0
- package/dist/esm/lib/v3/dom/build/v3-index.d.ts +0 -0
- package/dist/esm/lib/v3/dom/build/v3-index.js.map +1 -0
- package/dist/esm/lib/v3/handlers/v3AgentHandler.d.ts +2 -2
- package/dist/esm/lib/v3/handlers/v3AgentHandler.js.map +1 -1
- package/dist/esm/lib/v3/index.d.ts +1 -0
- package/dist/esm/lib/v3/index.js +1 -0
- package/dist/esm/lib/v3/index.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisor.d.ts +7 -5
- package/dist/esm/lib/v3/shutdown/supervisor.js +62 -52
- package/dist/esm/lib/v3/shutdown/supervisor.js.map +1 -1
- package/dist/esm/lib/v3/shutdown/supervisorClient.js +48 -52
- package/dist/esm/lib/v3/shutdown/supervisorClient.js.map +1 -1
- package/dist/esm/lib/v3/tests/click-count.spec.js +47 -12
- package/dist/esm/lib/v3/tests/click-count.spec.js.map +2 -2
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js +67 -21
- package/dist/esm/lib/v3/tests/iframe-ctx-addInitScript.spec.js.map +2 -2
- package/dist/esm/lib/v3/tests/v3.playwright.config.js +3 -60
- package/dist/esm/lib/v3/tests/v3.playwright.config.js.map +2 -2
- package/dist/esm/lib/v3/types/private/shutdown.d.ts +1 -13
- package/dist/esm/lib/v3/types/private/shutdown.js.map +1 -1
- package/dist/esm/lib/v3/understudy/context.js +10 -1
- package/dist/esm/lib/v3/understudy/context.js.map +1 -1
- package/dist/esm/lib/v3/understudy/locator.js +2 -2
- package/dist/esm/lib/v3/understudy/locator.js.map +1 -1
- package/dist/esm/lib/v3/understudy/page.js +2 -1
- package/dist/esm/lib/v3/understudy/page.js.map +1 -1
- package/dist/esm/lib/v3/v3.js +10 -13
- package/dist/esm/lib/v3/v3.js.map +1 -1
- package/dist/esm/tests/public-api/export-surface.test.js +1 -0
- package/dist/esm/tests/public-api/export-surface.test.js.map +2 -2
- package/package.json +13 -9
- package/dist/esm/lib/v3/tests/envReporter.js +0 -57
- package/dist/esm/lib/v3/tests/envReporter.js.map +0 -7
- package/dist/esm/tests/agent-execution-model.test.js +0 -139
- package/dist/esm/tests/agent-execution-model.test.js.map +0 -7
- package/dist/esm/tests/model-utils.test.js +0 -43
- package/dist/esm/tests/model-utils.test.js.map +0 -7
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/timeout-handlers.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\nimport { ActHandler } from \"../lib/v3/handlers/actHandler.js\";\nimport { ExtractHandler } from \"../lib/v3/handlers/extractHandler.js\";\nimport { ObserveHandler } from \"../lib/v3/handlers/observeHandler.js\";\nimport type { Page } from \"../lib/v3/understudy/page.js\";\nimport type { ClientOptions } from \"../lib/v3/types/public/model.js\";\nimport type { LLMClient } from \"../lib/v3/llm/LLMClient.js\";\nimport { createTimeoutGuard } from \"../lib/v3/handlers/handlerUtils/timeoutGuard.js\";\nimport { waitForDomNetworkQuiet } from \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\";\nimport { captureHybridSnapshot } from \"../lib/v3/understudy/a11y/snapshot/index.js\";\nimport {\n ActTimeoutError,\n ExtractTimeoutError,\n ObserveTimeoutError,\n} from \"../lib/v3/types/public/sdkErrors.js\";\nimport {\n act as actInference,\n extract as extractInference,\n observe as observeInference,\n} from \"../lib/inference.js\";\nimport { V3FunctionName } from \"../lib/v3/types/public/methods.js\";\n\nvi.mock(\"../lib/v3/handlers/handlerUtils/timeoutGuard\", () => ({\n createTimeoutGuard: vi.fn(),\n}));\n\nvi.mock(\"../lib/v3/handlers/handlerUtils/actHandlerUtils\", () => ({\n waitForDomNetworkQuiet: vi.fn(),\n performUnderstudyMethod: vi.fn(),\n}));\n\nvi.mock(\"../lib/v3/understudy/a11y/snapshot\", () => ({\n captureHybridSnapshot: vi.fn(),\n diffCombinedTrees: vi.fn(),\n}));\n\nvi.mock(\"../lib/inference\", () => ({\n act: vi.fn(),\n extract: vi.fn(),\n observe: vi.fn(),\n}));\n\ndescribe(\"ActHandler timeout guard\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"throws ActTimeoutError when timeout expires before snapshot\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n // Make createTimeoutGuard return a guard that throws on call #2\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 2) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ActTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.act({\n instruction: \"do something\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ActTimeoutError);\n\n // Verify pre-timeout helper ran\n expect(waitForDomNetworkQuietMock).toHaveBeenCalledTimes(1);\n // Verify snapshot was NOT called (timeout fired before it)\n expect(captureHybridSnapshotMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ActTimeoutError when timeout expires before LLM call\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const actInferenceMock = vi.mocked(actInference);\n\n // Throw on call #3 (after snapshot but before LLM)\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 3) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ActTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.act({\n instruction: \"do something\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ActTimeoutError);\n\n // Snapshot should have been called\n expect(captureHybridSnapshotMock).toHaveBeenCalledTimes(1);\n // LLM inference should NOT have been called\n expect(actInferenceMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ActTimeoutError with correct message format\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const timeoutMs = 100;\n\n vi.mocked(createTimeoutGuard).mockImplementation((ms, errorFactory) => {\n return vi.fn(() => {\n throw errorFactory ? errorFactory(ms!) : new ActTimeoutError(ms!);\n });\n });\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n try {\n await handler.act({\n instruction: \"do something\",\n page: fakePage,\n timeout: timeoutMs,\n });\n throw new Error(\"Expected ActTimeoutError to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(ActTimeoutError);\n expect((error as ActTimeoutError).message).toContain(\"act()\");\n expect((error as ActTimeoutError).message).toContain(`${timeoutMs}ms`);\n expect((error as ActTimeoutError).name).toBe(\"ActTimeoutError\");\n }\n });\n});\n\ndescribe(\"ActHandler two-step timeout\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"throws ActTimeoutError during step 2; step 2 action does not run\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n performUnderstudyMethodMock.mockResolvedValue(undefined);\n\n const actInferenceMock = vi.mocked(actInference);\n // First call returns a two-step action\n actInferenceMock.mockResolvedValueOnce({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: true,\n prompt_tokens: 100,\n completion_tokens: 50,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n const diffCombinedTreesMock = vi.mocked(\n (await import(\"../lib/v3/understudy/a11y/snapshot/index.js\"))\n .diffCombinedTrees,\n );\n diffCombinedTreesMock.mockReturnValue(\"diff tree\");\n\n // Timeout fires after step 1 completes, during step 2 snapshot\n // ensureTimeRemaining calls: 1=before wait, 2=after wait/before snap1, 3=before LLM1,\n // 4=before action1, 5=inside takeDeterministicAction, 6=performUnderstudy,\n // 7=before snap2 (this one should throw)\n let callCount = 0;\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n return vi.fn(() => {\n callCount += 1;\n if (callCount >= 7) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ActTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.act({\n instruction: \"click then type\",\n page: fakePage,\n timeout: 50,\n }),\n ).rejects.toThrow(ActTimeoutError);\n\n // Step 1 action should have been executed\n expect(performUnderstudyMethodMock).toHaveBeenCalledTimes(1);\n // Step 2 LLM call should NOT have happened\n expect(actInferenceMock).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe(\"ActHandler self-heal timeout\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"throws ActTimeoutError during self-heal snapshot; no retry action executes\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n // First call fails, triggering self-heal\n performUnderstudyMethodMock.mockRejectedValueOnce(\n new Error(\"Element not found\"),\n );\n\n const actInferenceMock = vi.mocked(actInference);\n actInferenceMock.mockResolvedValue({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n prompt_tokens: 100,\n completion_tokens: 50,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n // Timeout during self-heal snapshot (call 7 or later)\n let callCount = 0;\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n return vi.fn(() => {\n callCount += 1;\n // Timeout during self-heal snapshot call\n if (callCount >= 7) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ActTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildActHandler({ selfHeal: true });\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.act({\n instruction: \"click button\",\n page: fakePage,\n timeout: 50,\n }),\n ).rejects.toThrow(ActTimeoutError);\n\n // First action attempt should have been tried\n expect(performUnderstudyMethodMock).toHaveBeenCalledTimes(1);\n // First LLM call should have happened\n expect(actInferenceMock).toHaveBeenCalledTimes(1);\n // Self-heal snapshot should have been started (call happened)\n expect(captureHybridSnapshotMock).toHaveBeenCalled();\n });\n\n it(\"throws ActTimeoutError during self-heal LLM inference; no retry action executes\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n // First call fails, triggering self-heal\n performUnderstudyMethodMock.mockRejectedValueOnce(\n new Error(\"Element not found\"),\n );\n\n const actInferenceMock = vi.mocked(actInference);\n actInferenceMock.mockResolvedValueOnce({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n prompt_tokens: 100,\n completion_tokens: 50,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n // Timeout during self-heal LLM inference (call 8)\n let callCount = 0;\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n return vi.fn(() => {\n callCount += 1;\n // Timeout during self-heal LLM call\n if (callCount >= 8) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ActTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildActHandler({ selfHeal: true });\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.act({\n instruction: \"click button\",\n page: fakePage,\n timeout: 50,\n }),\n ).rejects.toThrow(ActTimeoutError);\n\n // Self-heal snapshot was captured\n expect(captureHybridSnapshotMock).toHaveBeenCalledTimes(2);\n // Only one LLM inference (the retry inference was aborted by timeout)\n expect(actInferenceMock).toHaveBeenCalledTimes(1);\n });\n});\n\ndescribe(\"ExtractHandler timeout guard\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"throws ExtractTimeoutError when timeout expires before snapshot\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const extractInferenceMock = vi.mocked(extractInference);\n\n // Throw immediately on first call\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n return vi.fn(() => {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ExtractTimeoutError(timeoutMs!);\n });\n },\n );\n\n const handler = buildExtractHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.extract({\n instruction: \"extract title\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ExtractTimeoutError);\n\n // Snapshot should NOT have been called\n expect(captureHybridSnapshotMock).not.toHaveBeenCalled();\n // LLM inference should NOT have been called\n expect(extractInferenceMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ExtractTimeoutError when timeout expires before LLM call\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const extractInferenceMock = vi.mocked(extractInference);\n\n // Throw on call #2 (after snapshot but before LLM)\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 2) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ExtractTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildExtractHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.extract({\n instruction: \"extract title\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ExtractTimeoutError);\n\n // Snapshot should have been called\n expect(captureHybridSnapshotMock).toHaveBeenCalledTimes(1);\n // LLM inference should NOT have been called\n expect(extractInferenceMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ExtractTimeoutError with correct message format\", async () => {\n const timeoutMs = 200;\n\n vi.mocked(createTimeoutGuard).mockImplementation((ms, errorFactory) => {\n return vi.fn(() => {\n throw errorFactory ? errorFactory(ms!) : new ExtractTimeoutError(ms!);\n });\n });\n\n const handler = buildExtractHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n try {\n await handler.extract({\n instruction: \"extract title\",\n page: fakePage,\n timeout: timeoutMs,\n });\n throw new Error(\"Expected ExtractTimeoutError to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(ExtractTimeoutError);\n expect((error as ExtractTimeoutError).message).toContain(\"extract()\");\n expect((error as ExtractTimeoutError).message).toContain(\n `${timeoutMs}ms`,\n );\n expect((error as ExtractTimeoutError).name).toBe(\"ExtractTimeoutError\");\n }\n });\n\n it(\"stops LLM and post-processing when timeout expires\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: { \"1-0\": \"https://example.com\" },\n });\n\n const extractInferenceMock = vi.mocked(extractInference);\n\n // Allow snapshot but timeout before LLM\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 2) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ExtractTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildExtractHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.extract({\n instruction: \"extract links\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ExtractTimeoutError);\n\n // Post-processing (URL injection) never runs because LLM was never called\n expect(extractInferenceMock).not.toHaveBeenCalled();\n });\n});\n\ndescribe(\"ObserveHandler timeout guard\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"throws ObserveTimeoutError when timeout expires before snapshot\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const observeInferenceMock = vi.mocked(observeInference);\n\n // Throw immediately on first call\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n return vi.fn(() => {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ObserveTimeoutError(timeoutMs!);\n });\n },\n );\n\n const handler = buildObserveHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.observe({\n instruction: \"find buttons\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ObserveTimeoutError);\n\n // Snapshot should NOT have been called\n expect(captureHybridSnapshotMock).not.toHaveBeenCalled();\n // LLM inference should NOT have been called\n expect(observeInferenceMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ObserveTimeoutError when timeout expires before LLM call\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const observeInferenceMock = vi.mocked(observeInference);\n\n // Throw on call #2 (after snapshot but before LLM)\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 2) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ObserveTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildObserveHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.observe({\n instruction: \"find buttons\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ObserveTimeoutError);\n\n // Snapshot should have been called\n expect(captureHybridSnapshotMock).toHaveBeenCalledTimes(1);\n // LLM inference should NOT have been called\n expect(observeInferenceMock).not.toHaveBeenCalled();\n });\n\n it(\"throws ObserveTimeoutError with correct message format\", async () => {\n const timeoutMs = 150;\n\n vi.mocked(createTimeoutGuard).mockImplementation((ms, errorFactory) => {\n return vi.fn(() => {\n throw errorFactory ? errorFactory(ms!) : new ObserveTimeoutError(ms!);\n });\n });\n\n const handler = buildObserveHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n try {\n await handler.observe({\n instruction: \"find buttons\",\n page: fakePage,\n timeout: timeoutMs,\n });\n throw new Error(\"Expected ObserveTimeoutError to be thrown\");\n } catch (error) {\n expect(error).toBeInstanceOf(ObserveTimeoutError);\n expect((error as ObserveTimeoutError).message).toContain(\"observe()\");\n expect((error as ObserveTimeoutError).message).toContain(\n `${timeoutMs}ms`,\n );\n expect((error as ObserveTimeoutError).name).toBe(\"ObserveTimeoutError\");\n }\n });\n\n it(\"aborts result processing when timeout expires\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const observeInferenceMock = vi.mocked(observeInference);\n\n // Timeout before LLM call\n vi.mocked(createTimeoutGuard).mockImplementation(\n (timeoutMs, errorFactory) => {\n let calls = 0;\n return vi.fn(() => {\n calls += 1;\n if (calls >= 2) {\n throw errorFactory\n ? errorFactory(timeoutMs!)\n : new ObserveTimeoutError(timeoutMs!);\n }\n });\n },\n );\n\n const handler = buildObserveHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n await expect(\n handler.observe({\n instruction: \"find all interactive elements\",\n page: fakePage,\n timeout: 5,\n }),\n ).rejects.toThrow(ObserveTimeoutError);\n\n // Result mapping/processing never happens\n expect(observeInferenceMock).not.toHaveBeenCalled();\n });\n});\n\ndescribe(\"No-timeout success paths\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n it(\"act() completes successfully without timeout and records metrics\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n performUnderstudyMethodMock.mockResolvedValue(undefined);\n\n const actInferenceMock = vi.mocked(actInference);\n actInferenceMock.mockResolvedValue({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n prompt_tokens: 100,\n completion_tokens: 50,\n reasoning_tokens: 10,\n cached_input_tokens: 5,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n // No timeout - guard never throws\n vi.mocked(createTimeoutGuard).mockImplementation(() => {\n return vi.fn(() => {\n // No-op - never throws\n });\n });\n\n const metricsCallback = vi.fn();\n const handler = buildActHandler({ onMetrics: metricsCallback });\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n const result = await handler.act({\n instruction: \"click button\",\n page: fakePage,\n // No timeout specified\n });\n\n expect(result.success).toBe(true);\n expect(metricsCallback).toHaveBeenCalledWith(\n V3FunctionName.ACT,\n 100,\n 50,\n 10,\n 5,\n 500,\n );\n });\n\n it(\"extract() completes successfully without timeout and records metrics\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: {},\n combinedUrlMap: {},\n });\n\n const extractInferenceMock = vi.mocked(extractInference);\n extractInferenceMock.mockResolvedValue({\n title: \"Test Title\",\n metadata: { completed: true, progress: \"100%\" },\n prompt_tokens: 200,\n completion_tokens: 100,\n reasoning_tokens: 20,\n cached_input_tokens: 10,\n inference_time_ms: 800,\n } as ReturnType<typeof extractInference> extends Promise<infer T>\n ? T\n : never);\n\n // No timeout - guard never throws\n vi.mocked(createTimeoutGuard).mockImplementation(() => {\n return vi.fn(() => {\n // No-op - never throws\n });\n });\n\n const metricsCallback = vi.fn();\n const handler = buildExtractHandler({ onMetrics: metricsCallback });\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n const result = await handler.extract({\n instruction: \"extract title\",\n page: fakePage,\n // No timeout specified\n });\n\n expect(result).toHaveProperty(\"title\", \"Test Title\");\n expect(metricsCallback).toHaveBeenCalledWith(\n V3FunctionName.EXTRACT,\n 200,\n 100,\n 20,\n 10,\n 800,\n );\n });\n\n it(\"observe() completes successfully without timeout and records metrics\", async () => {\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const observeInferenceMock = vi.mocked(observeInference);\n observeInferenceMock.mockResolvedValue({\n elements: [\n {\n elementId: \"1-0\",\n description: \"Submit button\",\n },\n ],\n prompt_tokens: 150,\n completion_tokens: 75,\n reasoning_tokens: 15,\n cached_input_tokens: 8,\n inference_time_ms: 600,\n } as ReturnType<typeof observeInference> extends Promise<infer T>\n ? T\n : never);\n\n // No timeout - guard never throws\n vi.mocked(createTimeoutGuard).mockImplementation(() => {\n return vi.fn(() => {\n // No-op - never throws\n });\n });\n\n const metricsCallback = vi.fn();\n const handler = buildObserveHandler({ onMetrics: metricsCallback });\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n const result = await handler.observe({\n instruction: \"find buttons\",\n page: fakePage,\n // No timeout specified\n });\n\n expect(result).toHaveLength(1);\n expect(result[0]).toHaveProperty(\"description\", \"Submit button\");\n expect(metricsCallback).toHaveBeenCalledWith(\n V3FunctionName.OBSERVE,\n 150,\n 75,\n 15,\n 8,\n 600,\n );\n });\n\n it(\"act() with zero timeout behaves as no timeout\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n performUnderstudyMethodMock.mockResolvedValue(undefined);\n\n const actInferenceMock = vi.mocked(actInference);\n actInferenceMock.mockResolvedValue({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n prompt_tokens: 100,\n completion_tokens: 50,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n // When timeout is 0 or negative, createTimeoutGuard returns a no-op\n vi.mocked(createTimeoutGuard).mockImplementation((timeoutMs) => {\n if (!timeoutMs || timeoutMs <= 0) {\n return vi.fn(() => {\n // No-op\n });\n }\n return vi.fn(() => {\n throw new ActTimeoutError(timeoutMs);\n });\n });\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n const result = await handler.act({\n instruction: \"click button\",\n page: fakePage,\n timeout: 0, // Zero timeout should be treated as \"no timeout\"\n });\n\n expect(result.success).toBe(true);\n });\n\n it(\"act() with negative timeout behaves as no timeout\", async () => {\n const waitForDomNetworkQuietMock = vi.mocked(waitForDomNetworkQuiet);\n waitForDomNetworkQuietMock.mockResolvedValue(undefined);\n\n const captureHybridSnapshotMock = vi.mocked(captureHybridSnapshot);\n captureHybridSnapshotMock.mockResolvedValue({\n combinedTree: \"tree content\",\n combinedXpathMap: { \"1-0\": \"/html/body/button\" },\n combinedUrlMap: {},\n });\n\n const { performUnderstudyMethod } = await import(\n \"../lib/v3/handlers/handlerUtils/actHandlerUtils.js\"\n );\n const performUnderstudyMethodMock = vi.mocked(performUnderstudyMethod);\n performUnderstudyMethodMock.mockResolvedValue(undefined);\n\n const actInferenceMock = vi.mocked(actInference);\n actInferenceMock.mockResolvedValue({\n element: {\n elementId: \"1-0\",\n description: \"click button\",\n method: \"click\",\n arguments: [],\n },\n twoStep: false,\n prompt_tokens: 100,\n completion_tokens: 50,\n inference_time_ms: 500,\n } as ReturnType<typeof actInference> extends Promise<infer T> ? T : never);\n\n vi.mocked(createTimeoutGuard).mockImplementation((timeoutMs) => {\n if (!timeoutMs || timeoutMs <= 0) {\n return vi.fn(() => {\n // No-op\n });\n }\n return vi.fn(() => {\n throw new ActTimeoutError(timeoutMs);\n });\n });\n\n const handler = buildActHandler();\n const fakePage = {\n mainFrame: vi.fn().mockReturnValue({}),\n } as unknown as Page;\n\n const result = await handler.act({\n instruction: \"click button\",\n page: fakePage,\n timeout: -100, // Negative timeout should be treated as \"no timeout\"\n });\n\n expect(result.success).toBe(true);\n });\n});\n\ninterface BuildActHandlerOptions {\n selfHeal?: boolean;\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n}\n\nfunction buildActHandler(options: BuildActHandlerOptions = {}): ActHandler {\n const defaultClientOptions = {} as ClientOptions;\n const fakeClient = {\n type: \"openai\",\n modelName: \"gpt-4o\",\n clientOptions: defaultClientOptions,\n } as LLMClient;\n const resolveLlmClient = vi.fn().mockReturnValue(fakeClient);\n\n return new ActHandler(\n fakeClient,\n \"gpt-4o\",\n defaultClientOptions,\n resolveLlmClient,\n undefined,\n false,\n options.selfHeal ?? false,\n options.onMetrics,\n undefined,\n );\n}\n\ninterface BuildExtractHandlerOptions {\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n}\n\nfunction buildExtractHandler(\n options: BuildExtractHandlerOptions = {},\n): ExtractHandler {\n const defaultClientOptions = {} as ClientOptions;\n const fakeClient = {\n type: \"openai\",\n modelName: \"gpt-4o\",\n clientOptions: defaultClientOptions,\n } as LLMClient;\n const resolveLlmClient = vi.fn().mockReturnValue(fakeClient);\n\n return new ExtractHandler(\n fakeClient,\n \"gpt-4o\",\n defaultClientOptions,\n resolveLlmClient,\n undefined,\n false,\n false,\n options.onMetrics,\n );\n}\n\ninterface BuildObserveHandlerOptions {\n onMetrics?: (\n functionName: V3FunctionName,\n promptTokens: number,\n completionTokens: number,\n reasoningTokens: number,\n cachedInputTokens: number,\n inferenceTimeMs: number,\n ) => void;\n}\n\nfunction buildObserveHandler(\n options: BuildObserveHandlerOptions = {},\n): ObserveHandler {\n const defaultClientOptions = {} as ClientOptions;\n const fakeClient = {\n type: \"openai\",\n modelName: \"gpt-4o\",\n clientOptions: defaultClientOptions,\n } as LLMClient;\n const resolveLlmClient = vi.fn().mockReturnValue(fakeClient);\n\n return new ObserveHandler(\n fakeClient,\n \"gpt-4o\",\n defaultClientOptions,\n resolveLlmClient,\n undefined,\n false,\n false,\n options.onMetrics,\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["actInference", "extractInference", "observeInference"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_xpathParser = require("../lib/v3/dom/locatorScripts/xpathParser.js");
|
|
3
|
+
(0, import_vitest.describe)("parseXPathSteps", () => {
|
|
4
|
+
(0, import_vitest.describe)("basic tag parsing", () => {
|
|
5
|
+
(0, import_vitest.it)("parses a simple absolute path", () => {
|
|
6
|
+
(0, import_vitest.expect)((0, import_xpathParser.parseXPathSteps)("/html/body/div")).toEqual([
|
|
7
|
+
{ axis: "child", tag: "html", predicates: [] },
|
|
8
|
+
{ axis: "child", tag: "body", predicates: [] },
|
|
9
|
+
{ axis: "child", tag: "div", predicates: [] }
|
|
10
|
+
]);
|
|
11
|
+
});
|
|
12
|
+
(0, import_vitest.it)("lowercases tag names", () => {
|
|
13
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("/HTML/BODY");
|
|
14
|
+
(0, import_vitest.expect)(steps[0].tag).toBe("html");
|
|
15
|
+
(0, import_vitest.expect)(steps[1].tag).toBe("body");
|
|
16
|
+
});
|
|
17
|
+
(0, import_vitest.it)("treats wildcard correctly", () => {
|
|
18
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//*");
|
|
19
|
+
(0, import_vitest.expect)(steps).toEqual([{ axis: "desc", tag: "*", predicates: [] }]);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
(0, import_vitest.describe)("axes", () => {
|
|
23
|
+
(0, import_vitest.it)("distinguishes child (/) from descendant (//)", () => {
|
|
24
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("/html//div/span");
|
|
25
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
26
|
+
{ axis: "child", tag: "html", predicates: [] },
|
|
27
|
+
{ axis: "desc", tag: "div", predicates: [] },
|
|
28
|
+
{ axis: "child", tag: "span", predicates: [] }
|
|
29
|
+
]);
|
|
30
|
+
});
|
|
31
|
+
(0, import_vitest.it)("handles leading //", () => {
|
|
32
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div");
|
|
33
|
+
(0, import_vitest.expect)(steps[0].axis).toBe("desc");
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
(0, import_vitest.describe)("positional indices", () => {
|
|
37
|
+
(0, import_vitest.it)("parses positional index", () => {
|
|
38
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("/div[1]/span[3]");
|
|
39
|
+
(0, import_vitest.expect)(steps[0]).toMatchObject({
|
|
40
|
+
tag: "div",
|
|
41
|
+
predicates: [{ type: "index", index: 1 }]
|
|
42
|
+
});
|
|
43
|
+
(0, import_vitest.expect)(steps[1]).toMatchObject({
|
|
44
|
+
tag: "span",
|
|
45
|
+
predicates: [{ type: "index", index: 3 }]
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
(0, import_vitest.it)("clamps index to minimum 1", () => {
|
|
49
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("/div[0]");
|
|
50
|
+
(0, import_vitest.expect)(steps[0].predicates[0]).toMatchObject({
|
|
51
|
+
type: "index",
|
|
52
|
+
index: 1
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
(0, import_vitest.it)("keeps multiple positional predicates in order", () => {
|
|
56
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[2][3]");
|
|
57
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
58
|
+
{ type: "index", index: 2 },
|
|
59
|
+
{ type: "index", index: 3 }
|
|
60
|
+
]);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
(0, import_vitest.describe)("attribute predicates", () => {
|
|
64
|
+
(0, import_vitest.it)("parses single attribute predicate with single quotes", () => {
|
|
65
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//img[@alt='Stagehand']");
|
|
66
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
67
|
+
{
|
|
68
|
+
axis: "desc",
|
|
69
|
+
tag: "img",
|
|
70
|
+
predicates: [{ type: "attrEquals", name: "alt", value: "Stagehand" }]
|
|
71
|
+
}
|
|
72
|
+
]);
|
|
73
|
+
});
|
|
74
|
+
(0, import_vitest.it)("parses single attribute predicate with double quotes", () => {
|
|
75
|
+
const steps = (0, import_xpathParser.parseXPathSteps)('//img[@alt="Stagehand"]');
|
|
76
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
77
|
+
{ type: "attrEquals", name: "alt", value: "Stagehand" }
|
|
78
|
+
]);
|
|
79
|
+
});
|
|
80
|
+
(0, import_vitest.it)("parses multiple attribute predicates", () => {
|
|
81
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@class='foo'][@id='bar']");
|
|
82
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
83
|
+
{ type: "attrEquals", name: "class", value: "foo" },
|
|
84
|
+
{ type: "attrEquals", name: "id", value: "bar" }
|
|
85
|
+
]);
|
|
86
|
+
});
|
|
87
|
+
(0, import_vitest.it)("parses attribute predicate combined with positional index", () => {
|
|
88
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@class='item'][2]");
|
|
89
|
+
(0, import_vitest.expect)(steps[0]).toMatchObject({
|
|
90
|
+
tag: "div",
|
|
91
|
+
predicates: [
|
|
92
|
+
{ type: "attrEquals", name: "class", value: "item" },
|
|
93
|
+
{ type: "index", index: 2 }
|
|
94
|
+
]
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
(0, import_vitest.it)("parses attribute with hyphenated name", () => {
|
|
98
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@data-testid='submit']");
|
|
99
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
100
|
+
{ type: "attrEquals", name: "data-testid", value: "submit" }
|
|
101
|
+
]);
|
|
102
|
+
});
|
|
103
|
+
(0, import_vitest.it)("parses attribute with empty value", () => {
|
|
104
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//input[@value='']");
|
|
105
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
106
|
+
{ type: "attrEquals", name: "value", value: "" }
|
|
107
|
+
]);
|
|
108
|
+
});
|
|
109
|
+
(0, import_vitest.it)("parses attribute value containing closing bracket", () => {
|
|
110
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@title='array[0]']");
|
|
111
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
112
|
+
{ type: "attrEquals", name: "title", value: "array[0]" }
|
|
113
|
+
]);
|
|
114
|
+
});
|
|
115
|
+
(0, import_vitest.it)("parses attribute value containing multiple brackets", () => {
|
|
116
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@data-json='[1,2,3]']");
|
|
117
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
118
|
+
{ type: "attrEquals", name: "data-json", value: "[1,2,3]" }
|
|
119
|
+
]);
|
|
120
|
+
});
|
|
121
|
+
(0, import_vitest.it)("parses attribute value containing a closing bracket", () => {
|
|
122
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@title='a]b']/span");
|
|
123
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
124
|
+
{
|
|
125
|
+
axis: "desc",
|
|
126
|
+
tag: "div",
|
|
127
|
+
predicates: [{ type: "attrEquals", name: "title", value: "a]b" }]
|
|
128
|
+
},
|
|
129
|
+
{ axis: "child", tag: "span", predicates: [] }
|
|
130
|
+
]);
|
|
131
|
+
});
|
|
132
|
+
(0, import_vitest.it)("parses attribute existence predicates", () => {
|
|
133
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//iframe[@data-test]");
|
|
134
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
135
|
+
{ type: "attrExists", name: "data-test" }
|
|
136
|
+
]);
|
|
137
|
+
});
|
|
138
|
+
(0, import_vitest.it)("parses attribute contains predicates", () => {
|
|
139
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//iframe[contains(@src,'checkout')]");
|
|
140
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
141
|
+
{ type: "attrContains", name: "src", value: "checkout" }
|
|
142
|
+
]);
|
|
143
|
+
});
|
|
144
|
+
(0, import_vitest.it)("parses attribute starts-with predicates", () => {
|
|
145
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//button[starts-with(@id,'save-')]");
|
|
146
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
147
|
+
{ type: "attrStartsWith", name: "id", value: "save-" }
|
|
148
|
+
]);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
(0, import_vitest.describe)("text predicates", () => {
|
|
152
|
+
(0, import_vitest.it)("parses text equality", () => {
|
|
153
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//button[text()='Submit']");
|
|
154
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
155
|
+
{ type: "textEquals", value: "Submit" }
|
|
156
|
+
]);
|
|
157
|
+
});
|
|
158
|
+
(0, import_vitest.it)("parses text contains", () => {
|
|
159
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[contains(text(),'Welcome')]");
|
|
160
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
161
|
+
{ type: "textContains", value: "Welcome" }
|
|
162
|
+
]);
|
|
163
|
+
});
|
|
164
|
+
(0, import_vitest.it)("parses normalize-space on text", () => {
|
|
165
|
+
const steps = (0, import_xpathParser.parseXPathSteps)(
|
|
166
|
+
"//div[normalize-space(text())='Hello world']"
|
|
167
|
+
);
|
|
168
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
169
|
+
{ type: "textEquals", value: "Hello world", normalize: true }
|
|
170
|
+
]);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
(0, import_vitest.describe)("boolean predicates", () => {
|
|
174
|
+
(0, import_vitest.it)("parses and predicates", () => {
|
|
175
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@a='x' and @b='y']");
|
|
176
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
177
|
+
{
|
|
178
|
+
type: "and",
|
|
179
|
+
predicates: [
|
|
180
|
+
{ type: "attrEquals", name: "a", value: "x" },
|
|
181
|
+
{ type: "attrEquals", name: "b", value: "y" }
|
|
182
|
+
]
|
|
183
|
+
}
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
(0, import_vitest.it)("parses operators without surrounding whitespace", () => {
|
|
187
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[not(@x)and@y='z']");
|
|
188
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
189
|
+
{
|
|
190
|
+
type: "and",
|
|
191
|
+
predicates: [
|
|
192
|
+
{ type: "not", predicate: { type: "attrExists", name: "x" } },
|
|
193
|
+
{ type: "attrEquals", name: "y", value: "z" }
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
]);
|
|
197
|
+
});
|
|
198
|
+
(0, import_vitest.it)("parses or predicates", () => {
|
|
199
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@a='x' or @b='y']");
|
|
200
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
201
|
+
{
|
|
202
|
+
type: "or",
|
|
203
|
+
predicates: [
|
|
204
|
+
{ type: "attrEquals", name: "a", value: "x" },
|
|
205
|
+
{ type: "attrEquals", name: "b", value: "y" }
|
|
206
|
+
]
|
|
207
|
+
}
|
|
208
|
+
]);
|
|
209
|
+
});
|
|
210
|
+
(0, import_vitest.it)("parses not predicates", () => {
|
|
211
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//button[not(@disabled)]");
|
|
212
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
213
|
+
{ type: "not", predicate: { type: "attrExists", name: "disabled" } }
|
|
214
|
+
]);
|
|
215
|
+
});
|
|
216
|
+
(0, import_vitest.it)("does not treat @and as a boolean operator", () => {
|
|
217
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//div[@and='x' and @y='z']");
|
|
218
|
+
(0, import_vitest.expect)(steps[0].predicates).toEqual([
|
|
219
|
+
{
|
|
220
|
+
type: "and",
|
|
221
|
+
predicates: [
|
|
222
|
+
{ type: "attrEquals", name: "and", value: "x" },
|
|
223
|
+
{ type: "attrEquals", name: "y", value: "z" }
|
|
224
|
+
]
|
|
225
|
+
}
|
|
226
|
+
]);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
(0, import_vitest.describe)("multi-step with predicates", () => {
|
|
230
|
+
(0, import_vitest.it)("parses complex path with mixed predicates", () => {
|
|
231
|
+
const steps = (0, import_xpathParser.parseXPathSteps)(
|
|
232
|
+
"/html/body//div[@class='container']/ul/li[3]"
|
|
233
|
+
);
|
|
234
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
235
|
+
{ axis: "child", tag: "html", predicates: [] },
|
|
236
|
+
{ axis: "child", tag: "body", predicates: [] },
|
|
237
|
+
{
|
|
238
|
+
axis: "desc",
|
|
239
|
+
tag: "div",
|
|
240
|
+
predicates: [
|
|
241
|
+
{ type: "attrEquals", name: "class", value: "container" }
|
|
242
|
+
]
|
|
243
|
+
},
|
|
244
|
+
{ axis: "child", tag: "ul", predicates: [] },
|
|
245
|
+
{ axis: "child", tag: "li", predicates: [{ type: "index", index: 3 }] }
|
|
246
|
+
]);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
(0, import_vitest.describe)("edge cases", () => {
|
|
250
|
+
(0, import_vitest.it)("returns empty array for empty string", () => {
|
|
251
|
+
(0, import_vitest.expect)((0, import_xpathParser.parseXPathSteps)("")).toEqual([]);
|
|
252
|
+
});
|
|
253
|
+
(0, import_vitest.it)("strips xpath= prefix", () => {
|
|
254
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("xpath=//div");
|
|
255
|
+
(0, import_vitest.expect)(steps).toEqual([{ axis: "desc", tag: "div", predicates: [] }]);
|
|
256
|
+
});
|
|
257
|
+
(0, import_vitest.it)("strips XPATH= prefix (case-insensitive)", () => {
|
|
258
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("XPATH=//div");
|
|
259
|
+
(0, import_vitest.expect)(steps).toEqual([{ axis: "desc", tag: "div", predicates: [] }]);
|
|
260
|
+
});
|
|
261
|
+
(0, import_vitest.it)("handles forward slashes inside attribute values", () => {
|
|
262
|
+
const steps = (0, import_xpathParser.parseXPathSteps)("//a[@href='/api/endpoint']");
|
|
263
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
264
|
+
{
|
|
265
|
+
axis: "desc",
|
|
266
|
+
tag: "a",
|
|
267
|
+
predicates: [
|
|
268
|
+
{ type: "attrEquals", name: "href", value: "/api/endpoint" }
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
]);
|
|
272
|
+
});
|
|
273
|
+
(0, import_vitest.it)("handles URL attribute values with multiple slashes", () => {
|
|
274
|
+
const steps = (0, import_xpathParser.parseXPathSteps)(
|
|
275
|
+
"//a[@data-url='http://example.com/path/to/page']"
|
|
276
|
+
);
|
|
277
|
+
(0, import_vitest.expect)(steps).toEqual([
|
|
278
|
+
{
|
|
279
|
+
axis: "desc",
|
|
280
|
+
tag: "a",
|
|
281
|
+
predicates: [
|
|
282
|
+
{
|
|
283
|
+
type: "attrEquals",
|
|
284
|
+
name: "data-url",
|
|
285
|
+
value: "http://example.com/path/to/page"
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
]);
|
|
290
|
+
});
|
|
291
|
+
(0, import_vitest.it)("handles whitespace", () => {
|
|
292
|
+
const steps = (0, import_xpathParser.parseXPathSteps)(" //div ");
|
|
293
|
+
(0, import_vitest.expect)(steps.length).toBe(1);
|
|
294
|
+
(0, import_vitest.expect)(steps[0].tag).toBe("div");
|
|
295
|
+
});
|
|
296
|
+
});
|
|
297
|
+
});
|
|
298
|
+
(0, import_vitest.describe)("applyPredicates", () => {
|
|
299
|
+
const makeElement = (id) => {
|
|
300
|
+
return {
|
|
301
|
+
localName: "div",
|
|
302
|
+
getAttribute: (name) => name === "id" ? id : null
|
|
303
|
+
};
|
|
304
|
+
};
|
|
305
|
+
(0, import_vitest.it)("applies positional predicates sequentially", () => {
|
|
306
|
+
const elements = ["a", "b", "c", "d"].map(makeElement);
|
|
307
|
+
const predicates = [
|
|
308
|
+
{ type: "index", index: 2 },
|
|
309
|
+
{ type: "index", index: 3 }
|
|
310
|
+
];
|
|
311
|
+
(0, import_vitest.expect)((0, import_xpathParser.applyPredicates)(elements, predicates)).toEqual([]);
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
//# sourceMappingURL=xpath-parser.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/xpath-parser.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { describe, expect, it } from \"vitest\";\nimport {\n applyPredicates,\n parseXPathSteps,\n type XPathPredicate,\n} from \"../lib/v3/dom/locatorScripts/xpathParser.js\";\n\ndescribe(\"parseXPathSteps\", () => {\n describe(\"basic tag parsing\", () => {\n it(\"parses a simple absolute path\", () => {\n expect(parseXPathSteps(\"/html/body/div\")).toEqual([\n { axis: \"child\", tag: \"html\", predicates: [] },\n { axis: \"child\", tag: \"body\", predicates: [] },\n { axis: \"child\", tag: \"div\", predicates: [] },\n ]);\n });\n\n it(\"lowercases tag names\", () => {\n const steps = parseXPathSteps(\"/HTML/BODY\");\n expect(steps[0].tag).toBe(\"html\");\n expect(steps[1].tag).toBe(\"body\");\n });\n\n it(\"treats wildcard correctly\", () => {\n const steps = parseXPathSteps(\"//*\");\n expect(steps).toEqual([{ axis: \"desc\", tag: \"*\", predicates: [] }]);\n });\n });\n\n describe(\"axes\", () => {\n it(\"distinguishes child (/) from descendant (//)\", () => {\n const steps = parseXPathSteps(\"/html//div/span\");\n expect(steps).toEqual([\n { axis: \"child\", tag: \"html\", predicates: [] },\n { axis: \"desc\", tag: \"div\", predicates: [] },\n { axis: \"child\", tag: \"span\", predicates: [] },\n ]);\n });\n\n it(\"handles leading //\", () => {\n const steps = parseXPathSteps(\"//div\");\n expect(steps[0].axis).toBe(\"desc\");\n });\n });\n\n describe(\"positional indices\", () => {\n it(\"parses positional index\", () => {\n const steps = parseXPathSteps(\"/div[1]/span[3]\");\n expect(steps[0]).toMatchObject({\n tag: \"div\",\n predicates: [{ type: \"index\", index: 1 }],\n });\n expect(steps[1]).toMatchObject({\n tag: \"span\",\n predicates: [{ type: \"index\", index: 3 }],\n });\n });\n\n it(\"clamps index to minimum 1\", () => {\n const steps = parseXPathSteps(\"/div[0]\");\n expect(steps[0].predicates[0]).toMatchObject({\n type: \"index\",\n index: 1,\n });\n });\n\n it(\"keeps multiple positional predicates in order\", () => {\n const steps = parseXPathSteps(\"//div[2][3]\");\n expect(steps[0].predicates).toEqual([\n { type: \"index\", index: 2 },\n { type: \"index\", index: 3 },\n ]);\n });\n });\n\n describe(\"attribute predicates\", () => {\n it(\"parses single attribute predicate with single quotes\", () => {\n const steps = parseXPathSteps(\"//img[@alt='Stagehand']\");\n expect(steps).toEqual([\n {\n axis: \"desc\",\n tag: \"img\",\n predicates: [{ type: \"attrEquals\", name: \"alt\", value: \"Stagehand\" }],\n },\n ]);\n });\n\n it(\"parses single attribute predicate with double quotes\", () => {\n const steps = parseXPathSteps('//img[@alt=\"Stagehand\"]');\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"alt\", value: \"Stagehand\" },\n ]);\n });\n\n it(\"parses multiple attribute predicates\", () => {\n const steps = parseXPathSteps(\"//div[@class='foo'][@id='bar']\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"class\", value: \"foo\" },\n { type: \"attrEquals\", name: \"id\", value: \"bar\" },\n ]);\n });\n\n it(\"parses attribute predicate combined with positional index\", () => {\n const steps = parseXPathSteps(\"//div[@class='item'][2]\");\n expect(steps[0]).toMatchObject({\n tag: \"div\",\n predicates: [\n { type: \"attrEquals\", name: \"class\", value: \"item\" },\n { type: \"index\", index: 2 },\n ],\n });\n });\n\n it(\"parses attribute with hyphenated name\", () => {\n const steps = parseXPathSteps(\"//div[@data-testid='submit']\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"data-testid\", value: \"submit\" },\n ]);\n });\n\n it(\"parses attribute with empty value\", () => {\n const steps = parseXPathSteps(\"//input[@value='']\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"value\", value: \"\" },\n ]);\n });\n\n it(\"parses attribute value containing closing bracket\", () => {\n const steps = parseXPathSteps(\"//div[@title='array[0]']\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"title\", value: \"array[0]\" },\n ]);\n });\n\n it(\"parses attribute value containing multiple brackets\", () => {\n const steps = parseXPathSteps(\"//div[@data-json='[1,2,3]']\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrEquals\", name: \"data-json\", value: \"[1,2,3]\" },\n ]);\n });\n\n it(\"parses attribute value containing a closing bracket\", () => {\n // The step splitter should ignore ] characters inside quotes.\n const steps = parseXPathSteps(\"//div[@title='a]b']/span\");\n expect(steps).toEqual([\n {\n axis: \"desc\",\n tag: \"div\",\n predicates: [{ type: \"attrEquals\", name: \"title\", value: \"a]b\" }],\n },\n { axis: \"child\", tag: \"span\", predicates: [] },\n ]);\n });\n\n it(\"parses attribute existence predicates\", () => {\n const steps = parseXPathSteps(\"//iframe[@data-test]\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrExists\", name: \"data-test\" },\n ]);\n });\n\n it(\"parses attribute contains predicates\", () => {\n const steps = parseXPathSteps(\"//iframe[contains(@src,'checkout')]\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrContains\", name: \"src\", value: \"checkout\" },\n ]);\n });\n\n it(\"parses attribute starts-with predicates\", () => {\n const steps = parseXPathSteps(\"//button[starts-with(@id,'save-')]\");\n expect(steps[0].predicates).toEqual([\n { type: \"attrStartsWith\", name: \"id\", value: \"save-\" },\n ]);\n });\n });\n\n describe(\"text predicates\", () => {\n it(\"parses text equality\", () => {\n const steps = parseXPathSteps(\"//button[text()='Submit']\");\n expect(steps[0].predicates).toEqual([\n { type: \"textEquals\", value: \"Submit\" },\n ]);\n });\n\n it(\"parses text contains\", () => {\n const steps = parseXPathSteps(\"//div[contains(text(),'Welcome')]\");\n expect(steps[0].predicates).toEqual([\n { type: \"textContains\", value: \"Welcome\" },\n ]);\n });\n\n it(\"parses normalize-space on text\", () => {\n const steps = parseXPathSteps(\n \"//div[normalize-space(text())='Hello world']\",\n );\n expect(steps[0].predicates).toEqual([\n { type: \"textEquals\", value: \"Hello world\", normalize: true },\n ]);\n });\n });\n\n describe(\"boolean predicates\", () => {\n it(\"parses and predicates\", () => {\n const steps = parseXPathSteps(\"//div[@a='x' and @b='y']\");\n expect(steps[0].predicates).toEqual([\n {\n type: \"and\",\n predicates: [\n { type: \"attrEquals\", name: \"a\", value: \"x\" },\n { type: \"attrEquals\", name: \"b\", value: \"y\" },\n ],\n },\n ]);\n });\n\n it(\"parses operators without surrounding whitespace\", () => {\n const steps = parseXPathSteps(\"//div[not(@x)and@y='z']\");\n expect(steps[0].predicates).toEqual([\n {\n type: \"and\",\n predicates: [\n { type: \"not\", predicate: { type: \"attrExists\", name: \"x\" } },\n { type: \"attrEquals\", name: \"y\", value: \"z\" },\n ],\n },\n ]);\n });\n\n it(\"parses or predicates\", () => {\n const steps = parseXPathSteps(\"//div[@a='x' or @b='y']\");\n expect(steps[0].predicates).toEqual([\n {\n type: \"or\",\n predicates: [\n { type: \"attrEquals\", name: \"a\", value: \"x\" },\n { type: \"attrEquals\", name: \"b\", value: \"y\" },\n ],\n },\n ]);\n });\n\n it(\"parses not predicates\", () => {\n const steps = parseXPathSteps(\"//button[not(@disabled)]\");\n expect(steps[0].predicates).toEqual([\n { type: \"not\", predicate: { type: \"attrExists\", name: \"disabled\" } },\n ]);\n });\n\n it(\"does not treat @and as a boolean operator\", () => {\n const steps = parseXPathSteps(\"//div[@and='x' and @y='z']\");\n expect(steps[0].predicates).toEqual([\n {\n type: \"and\",\n predicates: [\n { type: \"attrEquals\", name: \"and\", value: \"x\" },\n { type: \"attrEquals\", name: \"y\", value: \"z\" },\n ],\n },\n ]);\n });\n });\n\n describe(\"multi-step with predicates\", () => {\n it(\"parses complex path with mixed predicates\", () => {\n const steps = parseXPathSteps(\n \"/html/body//div[@class='container']/ul/li[3]\",\n );\n expect(steps).toEqual([\n { axis: \"child\", tag: \"html\", predicates: [] },\n { axis: \"child\", tag: \"body\", predicates: [] },\n {\n axis: \"desc\",\n tag: \"div\",\n predicates: [\n { type: \"attrEquals\", name: \"class\", value: \"container\" },\n ],\n },\n { axis: \"child\", tag: \"ul\", predicates: [] },\n { axis: \"child\", tag: \"li\", predicates: [{ type: \"index\", index: 3 }] },\n ]);\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"returns empty array for empty string\", () => {\n expect(parseXPathSteps(\"\")).toEqual([]);\n });\n\n it(\"strips xpath= prefix\", () => {\n const steps = parseXPathSteps(\"xpath=//div\");\n expect(steps).toEqual([{ axis: \"desc\", tag: \"div\", predicates: [] }]);\n });\n\n it(\"strips XPATH= prefix (case-insensitive)\", () => {\n const steps = parseXPathSteps(\"XPATH=//div\");\n expect(steps).toEqual([{ axis: \"desc\", tag: \"div\", predicates: [] }]);\n });\n\n it(\"handles forward slashes inside attribute values\", () => {\n const steps = parseXPathSteps(\"//a[@href='/api/endpoint']\");\n expect(steps).toEqual([\n {\n axis: \"desc\",\n tag: \"a\",\n predicates: [\n { type: \"attrEquals\", name: \"href\", value: \"/api/endpoint\" },\n ],\n },\n ]);\n });\n\n it(\"handles URL attribute values with multiple slashes\", () => {\n const steps = parseXPathSteps(\n \"//a[@data-url='http://example.com/path/to/page']\",\n );\n expect(steps).toEqual([\n {\n axis: \"desc\",\n tag: \"a\",\n predicates: [\n {\n type: \"attrEquals\",\n name: \"data-url\",\n value: \"http://example.com/path/to/page\",\n },\n ],\n },\n ]);\n });\n\n it(\"handles whitespace\", () => {\n const steps = parseXPathSteps(\" //div \");\n expect(steps.length).toBe(1);\n expect(steps[0].tag).toBe(\"div\");\n });\n });\n});\n\ndescribe(\"applyPredicates\", () => {\n const makeElement = (id: string): Element => {\n return {\n localName: \"div\",\n getAttribute: (name: string) => (name === \"id\" ? id : null),\n } as unknown as Element;\n };\n\n it(\"applies positional predicates sequentially\", () => {\n const elements = [\"a\", \"b\", \"c\", \"d\"].map(makeElement);\n const predicates: XPathPredicate[] = [\n { type: \"index\", index: 2 },\n { type: \"index\", index: 3 },\n ];\n expect(applyPredicates(elements, predicates)).toEqual([]);\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,oBAAqC;AACrC,yBAIO;AAAA,IAEP,wBAAS,mBAAmB,MAAM;AAChC,8BAAS,qBAAqB,MAAM;AAClC,0BAAG,iCAAiC,MAAM;AACxC,oCAAO,oCAAgB,gBAAgB,CAAC,EAAE,QAAQ;AAAA,QAChD,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,QAC7C,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,QAC7C,EAAE,MAAM,SAAS,KAAK,OAAO,YAAY,CAAC,EAAE;AAAA,MAC9C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wBAAwB,MAAM;AAC/B,YAAM,YAAQ,oCAAgB,YAAY;AAC1C,gCAAO,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM;AAChC,gCAAO,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,MAAM;AAAA,IAClC,CAAC;AAED,0BAAG,6BAA6B,MAAM;AACpC,YAAM,YAAQ,oCAAgB,KAAK;AACnC,gCAAO,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,QAAQ,KAAK,KAAK,YAAY,CAAC,EAAE,CAAC,CAAC;AAAA,IACpE,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,QAAQ,MAAM;AACrB,0BAAG,gDAAgD,MAAM;AACvD,YAAM,YAAQ,oCAAgB,iBAAiB;AAC/C,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,QAC7C,EAAE,MAAM,QAAQ,KAAK,OAAO,YAAY,CAAC,EAAE;AAAA,QAC3C,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,MAC/C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,sBAAsB,MAAM;AAC7B,YAAM,YAAQ,oCAAgB,OAAO;AACrC,gCAAO,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,MAAM;AAAA,IACnC,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,sBAAsB,MAAM;AACnC,0BAAG,2BAA2B,MAAM;AAClC,YAAM,YAAQ,oCAAgB,iBAAiB;AAC/C,gCAAO,MAAM,CAAC,CAAC,EAAE,cAAc;AAAA,QAC7B,KAAK;AAAA,QACL,YAAY,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,CAAC;AAAA,MAC1C,CAAC;AACD,gCAAO,MAAM,CAAC,CAAC,EAAE,cAAc;AAAA,QAC7B,KAAK;AAAA,QACL,YAAY,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,CAAC;AAAA,MAC1C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,6BAA6B,MAAM;AACpC,YAAM,YAAQ,oCAAgB,SAAS;AACvC,gCAAO,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,cAAc;AAAA,QAC3C,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,iDAAiD,MAAM;AACxD,YAAM,YAAQ,oCAAgB,aAAa;AAC3C,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,QAC1B,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,wBAAwB,MAAM;AACrC,0BAAG,wDAAwD,MAAM;AAC/D,YAAM,YAAQ,oCAAgB,yBAAyB;AACvD,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,YAAY,CAAC,EAAE,MAAM,cAAc,MAAM,OAAO,OAAO,YAAY,CAAC;AAAA,QACtE;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wDAAwD,MAAM;AAC/D,YAAM,YAAQ,oCAAgB,yBAAyB;AACvD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,OAAO,OAAO,YAAY;AAAA,MACxD,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wCAAwC,MAAM;AAC/C,YAAM,YAAQ,oCAAgB,gCAAgC;AAC9D,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,MAAM;AAAA,QAClD,EAAE,MAAM,cAAc,MAAM,MAAM,OAAO,MAAM;AAAA,MACjD,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,6DAA6D,MAAM;AACpE,YAAM,YAAQ,oCAAgB,yBAAyB;AACvD,gCAAO,MAAM,CAAC,CAAC,EAAE,cAAc;AAAA,QAC7B,KAAK;AAAA,QACL,YAAY;AAAA,UACV,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,OAAO;AAAA,UACnD,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,yCAAyC,MAAM;AAChD,YAAM,YAAQ,oCAAgB,8BAA8B;AAC5D,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,eAAe,OAAO,SAAS;AAAA,MAC7D,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,qCAAqC,MAAM;AAC5C,YAAM,YAAQ,oCAAgB,oBAAoB;AAClD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,GAAG;AAAA,MACjD,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,qDAAqD,MAAM;AAC5D,YAAM,YAAQ,oCAAgB,0BAA0B;AACxD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,WAAW;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,uDAAuD,MAAM;AAC9D,YAAM,YAAQ,oCAAgB,6BAA6B;AAC3D,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,aAAa,OAAO,UAAU;AAAA,MAC5D,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,uDAAuD,MAAM;AAE9D,YAAM,YAAQ,oCAAgB,0BAA0B;AACxD,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,YAAY,CAAC,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,MAAM,CAAC;AAAA,QAClE;AAAA,QACA,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,MAC/C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,yCAAyC,MAAM;AAChD,YAAM,YAAQ,oCAAgB,sBAAsB;AACpD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,MAAM,YAAY;AAAA,MAC1C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wCAAwC,MAAM;AAC/C,YAAM,YAAQ,oCAAgB,qCAAqC;AACnE,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,gBAAgB,MAAM,OAAO,OAAO,WAAW;AAAA,MACzD,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,2CAA2C,MAAM;AAClD,YAAM,YAAQ,oCAAgB,oCAAoC;AAClE,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,kBAAkB,MAAM,MAAM,OAAO,QAAQ;AAAA,MACvD,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,mBAAmB,MAAM;AAChC,0BAAG,wBAAwB,MAAM;AAC/B,YAAM,YAAQ,oCAAgB,2BAA2B;AACzD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,OAAO,SAAS;AAAA,MACxC,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wBAAwB,MAAM;AAC/B,YAAM,YAAQ,oCAAgB,mCAAmC;AACjE,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,gBAAgB,OAAO,UAAU;AAAA,MAC3C,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,kCAAkC,MAAM;AACzC,YAAM,YAAQ;AAAA,QACZ;AAAA,MACF;AACA,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,cAAc,OAAO,eAAe,WAAW,KAAK;AAAA,MAC9D,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,sBAAsB,MAAM;AACnC,0BAAG,yBAAyB,MAAM;AAChC,YAAM,YAAQ,oCAAgB,0BAA0B;AACxD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,YAC5C,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,mDAAmD,MAAM;AAC1D,YAAM,YAAQ,oCAAgB,yBAAyB;AACvD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,cAAc,MAAM,IAAI,EAAE;AAAA,YAC5D,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,wBAAwB,MAAM;AAC/B,YAAM,YAAQ,oCAAgB,yBAAyB;AACvD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,YAC5C,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,yBAAyB,MAAM;AAChC,YAAM,YAAQ,oCAAgB,0BAA0B;AACxD,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC,EAAE,MAAM,OAAO,WAAW,EAAE,MAAM,cAAc,MAAM,WAAW,EAAE;AAAA,MACrE,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,6CAA6C,MAAM;AACpD,YAAM,YAAQ,oCAAgB,4BAA4B;AAC1D,gCAAO,MAAM,CAAC,EAAE,UAAU,EAAE,QAAQ;AAAA,QAClC;AAAA,UACE,MAAM;AAAA,UACN,YAAY;AAAA,YACV,EAAE,MAAM,cAAc,MAAM,OAAO,OAAO,IAAI;AAAA,YAC9C,EAAE,MAAM,cAAc,MAAM,KAAK,OAAO,IAAI;AAAA,UAC9C;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,8BAA8B,MAAM;AAC3C,0BAAG,6CAA6C,MAAM;AACpD,YAAM,YAAQ;AAAA,QACZ;AAAA,MACF;AACA,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,QAC7C,EAAE,MAAM,SAAS,KAAK,QAAQ,YAAY,CAAC,EAAE;AAAA,QAC7C;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,YAAY;AAAA,YACV,EAAE,MAAM,cAAc,MAAM,SAAS,OAAO,YAAY;AAAA,UAC1D;AAAA,QACF;AAAA,QACA,EAAE,MAAM,SAAS,KAAK,MAAM,YAAY,CAAC,EAAE;AAAA,QAC3C,EAAE,MAAM,SAAS,KAAK,MAAM,YAAY,CAAC,EAAE,MAAM,SAAS,OAAO,EAAE,CAAC,EAAE;AAAA,MACxE,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AAED,8BAAS,cAAc,MAAM;AAC3B,0BAAG,wCAAwC,MAAM;AAC/C,oCAAO,oCAAgB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,IACxC,CAAC;AAED,0BAAG,wBAAwB,MAAM;AAC/B,YAAM,YAAQ,oCAAgB,aAAa;AAC3C,gCAAO,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,QAAQ,KAAK,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;AAAA,IACtE,CAAC;AAED,0BAAG,2CAA2C,MAAM;AAClD,YAAM,YAAQ,oCAAgB,aAAa;AAC3C,gCAAO,KAAK,EAAE,QAAQ,CAAC,EAAE,MAAM,QAAQ,KAAK,OAAO,YAAY,CAAC,EAAE,CAAC,CAAC;AAAA,IACtE,CAAC;AAED,0BAAG,mDAAmD,MAAM;AAC1D,YAAM,YAAQ,oCAAgB,4BAA4B;AAC1D,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,YAAY;AAAA,YACV,EAAE,MAAM,cAAc,MAAM,QAAQ,OAAO,gBAAgB;AAAA,UAC7D;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,sDAAsD,MAAM;AAC7D,YAAM,YAAQ;AAAA,QACZ;AAAA,MACF;AACA,gCAAO,KAAK,EAAE,QAAQ;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,UACL,YAAY;AAAA,YACV;AAAA,cACE,MAAM;AAAA,cACN,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,0BAAG,sBAAsB,MAAM;AAC7B,YAAM,YAAQ,oCAAgB,WAAW;AACzC,gCAAO,MAAM,MAAM,EAAE,KAAK,CAAC;AAC3B,gCAAO,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,KAAK;AAAA,IACjC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAAA,IAED,wBAAS,mBAAmB,MAAM;AAChC,QAAM,cAAc,CAAC,OAAwB;AAC3C,WAAO;AAAA,MACL,WAAW;AAAA,MACX,cAAc,CAAC,SAAkB,SAAS,OAAO,KAAK;AAAA,IACxD;AAAA,EACF;AAEA,wBAAG,8CAA8C,MAAM;AACrD,UAAM,WAAW,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,WAAW;AACrD,UAAM,aAA+B;AAAA,MACnC,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,MAC1B,EAAE,MAAM,SAAS,OAAO,EAAE;AAAA,IAC5B;AACA,kCAAO,oCAAgB,UAAU,UAAU,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC1D,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
var import_jsdom = require("jsdom");
|
|
2
|
+
var import_vitest = require("vitest");
|
|
3
|
+
var import_xpathResolver = require("../lib/v3/dom/locatorScripts/xpathResolver.js");
|
|
4
|
+
const globalRef = globalThis;
|
|
5
|
+
const originalGlobals = {
|
|
6
|
+
window: globalRef.window,
|
|
7
|
+
document: globalRef.document,
|
|
8
|
+
Node: globalRef.Node,
|
|
9
|
+
NodeFilter: globalRef.NodeFilter,
|
|
10
|
+
Element: globalRef.Element,
|
|
11
|
+
HTMLElement: globalRef.HTMLElement,
|
|
12
|
+
Document: globalRef.Document,
|
|
13
|
+
DocumentFragment: globalRef.DocumentFragment,
|
|
14
|
+
ShadowRoot: globalRef.ShadowRoot,
|
|
15
|
+
XPathResult: globalRef.XPathResult
|
|
16
|
+
};
|
|
17
|
+
let dom;
|
|
18
|
+
const installDomGlobals = () => {
|
|
19
|
+
const win = dom.window;
|
|
20
|
+
globalRef.window = win;
|
|
21
|
+
globalRef.document = win.document;
|
|
22
|
+
globalRef.Node = win.Node;
|
|
23
|
+
globalRef.NodeFilter = win.NodeFilter;
|
|
24
|
+
globalRef.Element = win.Element;
|
|
25
|
+
globalRef.HTMLElement = win.HTMLElement;
|
|
26
|
+
globalRef.Document = win.Document;
|
|
27
|
+
globalRef.DocumentFragment = win.DocumentFragment;
|
|
28
|
+
globalRef.ShadowRoot = win.ShadowRoot;
|
|
29
|
+
globalRef.XPathResult = win.XPathResult;
|
|
30
|
+
};
|
|
31
|
+
const restoreDomGlobals = () => {
|
|
32
|
+
for (const [key, value] of Object.entries(originalGlobals)) {
|
|
33
|
+
if (value === void 0) {
|
|
34
|
+
delete globalRef[key];
|
|
35
|
+
} else {
|
|
36
|
+
globalRef[key] = value;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
(0, import_vitest.describe)("xpathResolver composed traversal", () => {
|
|
41
|
+
(0, import_vitest.beforeAll)(() => {
|
|
42
|
+
dom = new import_jsdom.JSDOM("<!doctype html><html><body></body></html>");
|
|
43
|
+
installDomGlobals();
|
|
44
|
+
});
|
|
45
|
+
(0, import_vitest.afterAll)(() => {
|
|
46
|
+
dom.window.close();
|
|
47
|
+
restoreDomGlobals();
|
|
48
|
+
});
|
|
49
|
+
(0, import_vitest.beforeEach)(() => {
|
|
50
|
+
document.body.innerHTML = "";
|
|
51
|
+
});
|
|
52
|
+
(0, import_vitest.it)("counts matches across light + shadow DOM without double counting", () => {
|
|
53
|
+
document.body.innerHTML = '<div id="light-1"></div><shadow-host id="host"></shadow-host><div id="light-2"></div>';
|
|
54
|
+
const host = document.getElementById("host");
|
|
55
|
+
const shadow = host.attachShadow({ mode: "open" });
|
|
56
|
+
shadow.innerHTML = '<div id="shadow-1"></div><div id="shadow-2"></div>';
|
|
57
|
+
(0, import_vitest.expect)((0, import_xpathResolver.countXPathMatches)("//div")).toBe(4);
|
|
58
|
+
});
|
|
59
|
+
(0, import_vitest.it)("resolves nth over composed tree in document-order DFS", () => {
|
|
60
|
+
document.body.innerHTML = '<div id="light-1"></div><shadow-host id="host"></shadow-host><div id="light-2"></div>';
|
|
61
|
+
const host = document.getElementById("host");
|
|
62
|
+
const shadow = host.attachShadow({ mode: "open" });
|
|
63
|
+
shadow.innerHTML = '<div id="shadow-1"></div><div id="shadow-2"></div>';
|
|
64
|
+
(0, import_vitest.expect)((0, import_xpathResolver.resolveXPathAtIndex)("//div", 0)?.id).toBe("light-1");
|
|
65
|
+
(0, import_vitest.expect)((0, import_xpathResolver.resolveXPathAtIndex)("//div", 1)?.id).toBe("shadow-1");
|
|
66
|
+
(0, import_vitest.expect)((0, import_xpathResolver.resolveXPathAtIndex)("//div", 2)?.id).toBe("shadow-2");
|
|
67
|
+
(0, import_vitest.expect)((0, import_xpathResolver.resolveXPathAtIndex)("//div", 3)?.id).toBe("light-2");
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=xpath-resolver.test.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../tests/xpath-resolver.test.ts"],
|
|
4
|
+
"sourcesContent": ["import { JSDOM } from \"jsdom\";\nimport { afterAll, beforeAll, beforeEach, describe, expect, it } from \"vitest\";\nimport {\n countXPathMatches,\n resolveXPathAtIndex,\n} from \"../lib/v3/dom/locatorScripts/xpathResolver.js\";\n\ntype DomGlobals = {\n window: Window;\n document: Document;\n Node: typeof Node;\n NodeFilter: typeof NodeFilter;\n Element: typeof Element;\n HTMLElement: typeof HTMLElement;\n Document: typeof Document;\n DocumentFragment: typeof DocumentFragment;\n ShadowRoot: typeof ShadowRoot;\n XPathResult: typeof XPathResult;\n};\n\nconst globalRef = globalThis as typeof globalThis & Partial<DomGlobals>;\nconst originalGlobals: Partial<DomGlobals> = {\n window: globalRef.window,\n document: globalRef.document,\n Node: globalRef.Node,\n NodeFilter: globalRef.NodeFilter,\n Element: globalRef.Element,\n HTMLElement: globalRef.HTMLElement,\n Document: globalRef.Document,\n DocumentFragment: globalRef.DocumentFragment,\n ShadowRoot: globalRef.ShadowRoot,\n XPathResult: globalRef.XPathResult,\n};\n\nlet dom: JSDOM;\n\nconst installDomGlobals = () => {\n const win = dom.window;\n globalRef.window = win as unknown as Window;\n globalRef.document = win.document;\n globalRef.Node = win.Node as unknown as typeof Node;\n globalRef.NodeFilter = win.NodeFilter as unknown as typeof NodeFilter;\n globalRef.Element = win.Element as unknown as typeof Element;\n globalRef.HTMLElement = win.HTMLElement as unknown as typeof HTMLElement;\n globalRef.Document = win.Document as unknown as typeof Document;\n globalRef.DocumentFragment =\n win.DocumentFragment as unknown as typeof DocumentFragment;\n globalRef.ShadowRoot = win.ShadowRoot as unknown as typeof ShadowRoot;\n globalRef.XPathResult = win.XPathResult as unknown as typeof XPathResult;\n};\n\nconst restoreDomGlobals = () => {\n for (const [key, value] of Object.entries(originalGlobals)) {\n if (value === undefined) {\n delete (globalRef as Record<string, unknown>)[key];\n } else {\n (globalRef as Record<string, unknown>)[key] = value;\n }\n }\n};\n\ndescribe(\"xpathResolver composed traversal\", () => {\n beforeAll(() => {\n dom = new JSDOM(\"<!doctype html><html><body></body></html>\");\n installDomGlobals();\n });\n\n afterAll(() => {\n dom.window.close();\n restoreDomGlobals();\n });\n\n beforeEach(() => {\n document.body.innerHTML = \"\";\n });\n\n it(\"counts matches across light + shadow DOM without double counting\", () => {\n document.body.innerHTML =\n '<div id=\"light-1\"></div>' +\n '<shadow-host id=\"host\"></shadow-host>' +\n '<div id=\"light-2\"></div>';\n\n const host = document.getElementById(\"host\") as HTMLElement;\n const shadow = host.attachShadow({ mode: \"open\" });\n shadow.innerHTML = '<div id=\"shadow-1\"></div><div id=\"shadow-2\"></div>';\n\n expect(countXPathMatches(\"//div\")).toBe(4);\n });\n\n it(\"resolves nth over composed tree in document-order DFS\", () => {\n document.body.innerHTML =\n '<div id=\"light-1\"></div>' +\n '<shadow-host id=\"host\"></shadow-host>' +\n '<div id=\"light-2\"></div>';\n\n const host = document.getElementById(\"host\") as HTMLElement;\n const shadow = host.attachShadow({ mode: \"open\" });\n shadow.innerHTML = '<div id=\"shadow-1\"></div><div id=\"shadow-2\"></div>';\n\n expect(resolveXPathAtIndex(\"//div\", 0)?.id).toBe(\"light-1\");\n expect(resolveXPathAtIndex(\"//div\", 1)?.id).toBe(\"shadow-1\");\n expect(resolveXPathAtIndex(\"//div\", 2)?.id).toBe(\"shadow-2\");\n expect(resolveXPathAtIndex(\"//div\", 3)?.id).toBe(\"light-2\");\n });\n});\n"],
|
|
5
|
+
"mappings": "AAAA,mBAAsB;AACtB,oBAAsE;AACtE,2BAGO;AAeP,MAAM,YAAY;AAClB,MAAM,kBAAuC;AAAA,EAC3C,QAAQ,UAAU;AAAA,EAClB,UAAU,UAAU;AAAA,EACpB,MAAM,UAAU;AAAA,EAChB,YAAY,UAAU;AAAA,EACtB,SAAS,UAAU;AAAA,EACnB,aAAa,UAAU;AAAA,EACvB,UAAU,UAAU;AAAA,EACpB,kBAAkB,UAAU;AAAA,EAC5B,YAAY,UAAU;AAAA,EACtB,aAAa,UAAU;AACzB;AAEA,IAAI;AAEJ,MAAM,oBAAoB,MAAM;AAC9B,QAAM,MAAM,IAAI;AAChB,YAAU,SAAS;AACnB,YAAU,WAAW,IAAI;AACzB,YAAU,OAAO,IAAI;AACrB,YAAU,aAAa,IAAI;AAC3B,YAAU,UAAU,IAAI;AACxB,YAAU,cAAc,IAAI;AAC5B,YAAU,WAAW,IAAI;AACzB,YAAU,mBACR,IAAI;AACN,YAAU,aAAa,IAAI;AAC3B,YAAU,cAAc,IAAI;AAC9B;AAEA,MAAM,oBAAoB,MAAM;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,eAAe,GAAG;AAC1D,QAAI,UAAU,QAAW;AACvB,aAAQ,UAAsC,GAAG;AAAA,IACnD,OAAO;AACL,MAAC,UAAsC,GAAG,IAAI;AAAA,IAChD;AAAA,EACF;AACF;AAAA,IAEA,wBAAS,oCAAoC,MAAM;AACjD,+BAAU,MAAM;AACd,UAAM,IAAI,mBAAM,2CAA2C;AAC3D,sBAAkB;AAAA,EACpB,CAAC;AAED,8BAAS,MAAM;AACb,QAAI,OAAO,MAAM;AACjB,sBAAkB;AAAA,EACpB,CAAC;AAED,gCAAW,MAAM;AACf,aAAS,KAAK,YAAY;AAAA,EAC5B,CAAC;AAED,wBAAG,oEAAoE,MAAM;AAC3E,aAAS,KAAK,YACZ;AAIF,UAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAM,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,WAAO,YAAY;AAEnB,kCAAO,wCAAkB,OAAO,CAAC,EAAE,KAAK,CAAC;AAAA,EAC3C,CAAC;AAED,wBAAG,yDAAyD,MAAM;AAChE,aAAS,KAAK,YACZ;AAIF,UAAM,OAAO,SAAS,eAAe,MAAM;AAC3C,UAAM,SAAS,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AACjD,WAAO,YAAY;AAEnB,kCAAO,0CAAoB,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,SAAS;AAC1D,kCAAO,0CAAoB,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,UAAU;AAC3D,kCAAO,0CAAoB,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,UAAU;AAC3D,kCAAO,0CAAoB,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,SAAS;AAAA,EAC5D,CAAC;AACH,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|