@testdriverai/agent 7.8.0-test.38
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/.claude/settings.local.json +7 -0
- package/.env.example +4 -0
- package/.prettierignore +4 -0
- package/.prettierrc +1 -0
- package/CHANGELOG.md +953 -0
- package/README.md +81 -0
- package/agent/events.js +135 -0
- package/agent/index.js +2450 -0
- package/agent/interface.js +35 -0
- package/agent/lib/analytics.js +22 -0
- package/agent/lib/censorship.js +75 -0
- package/agent/lib/commander.js +246 -0
- package/agent/lib/commands.js +1684 -0
- package/agent/lib/config.js +60 -0
- package/agent/lib/generator.js +91 -0
- package/agent/lib/http.js +144 -0
- package/agent/lib/logger.js +56 -0
- package/agent/lib/outputs.js +29 -0
- package/agent/lib/parser.js +209 -0
- package/agent/lib/redraw.js +386 -0
- package/agent/lib/resources/cursor-2.png +0 -0
- package/agent/lib/sandbox.js +1104 -0
- package/agent/lib/sdk.js +633 -0
- package/agent/lib/session.js +25 -0
- package/agent/lib/source-mapper.js +342 -0
- package/agent/lib/subimage/index.js +77 -0
- package/agent/lib/subimage/opencv.js +69 -0
- package/agent/lib/system.js +204 -0
- package/agent/lib/theme.js +14 -0
- package/agent/lib/valid-version.js +21 -0
- package/agent/lib/validation.js +169 -0
- package/ai/.claude-plugin/plugin.json +9 -0
- package/ai/agents/testdriver.md +638 -0
- package/ai/skills/testdriver-ai/SKILL.md +204 -0
- package/ai/skills/testdriver-assert/SKILL.md +315 -0
- package/ai/skills/testdriver-aws-setup/SKILL.md +448 -0
- package/ai/skills/testdriver-cache/SKILL.md +221 -0
- package/ai/skills/testdriver-caching/SKILL.md +124 -0
- package/ai/skills/testdriver-captcha/SKILL.md +158 -0
- package/ai/skills/testdriver-ci-cd/SKILL.md +602 -0
- package/ai/skills/testdriver-click/SKILL.md +286 -0
- package/ai/skills/testdriver-client/SKILL.md +477 -0
- package/ai/skills/testdriver-cloud/SKILL.md +119 -0
- package/ai/skills/testdriver-customizing-devices/SKILL.md +319 -0
- package/ai/skills/testdriver-dashcam/SKILL.md +418 -0
- package/ai/skills/testdriver-debugging-with-screenshots/SKILL.md +401 -0
- package/ai/skills/testdriver-device-config/SKILL.md +317 -0
- package/ai/skills/testdriver-double-click/SKILL.md +102 -0
- package/ai/skills/testdriver-elements/SKILL.md +605 -0
- package/ai/skills/testdriver-enterprise/SKILL.md +114 -0
- package/ai/skills/testdriver-errors/SKILL.md +246 -0
- package/ai/skills/testdriver-events/SKILL.md +356 -0
- package/ai/skills/testdriver-examples/SKILL.md +7 -0
- package/ai/skills/testdriver-exec/SKILL.md +317 -0
- package/ai/skills/testdriver-find/SKILL.md +829 -0
- package/ai/skills/testdriver-focus-application/SKILL.md +293 -0
- package/ai/skills/testdriver-generating-tests/SKILL.md +36 -0
- package/ai/skills/testdriver-hover/SKILL.md +278 -0
- package/ai/skills/testdriver-locating-elements/SKILL.md +71 -0
- package/ai/skills/testdriver-making-assertions/SKILL.md +32 -0
- package/ai/skills/testdriver-mcp/SKILL.md +7 -0
- package/ai/skills/testdriver-mcp-workflow/SKILL.md +410 -0
- package/ai/skills/testdriver-mouse-down/SKILL.md +161 -0
- package/ai/skills/testdriver-mouse-up/SKILL.md +164 -0
- package/ai/skills/testdriver-parse/SKILL.md +236 -0
- package/ai/skills/testdriver-performing-actions/SKILL.md +54 -0
- package/ai/skills/testdriver-press-keys/SKILL.md +348 -0
- package/ai/skills/testdriver-provision/SKILL.md +331 -0
- package/ai/skills/testdriver-quickstart/SKILL.md +144 -0
- package/ai/skills/testdriver-redraw/SKILL.md +214 -0
- package/ai/skills/testdriver-reusable-code/SKILL.md +249 -0
- package/ai/skills/testdriver-right-click/SKILL.md +123 -0
- package/ai/skills/testdriver-running-tests/SKILL.md +185 -0
- package/ai/skills/testdriver-screenshot/SKILL.md +248 -0
- package/ai/skills/testdriver-screenshots/SKILL.md +184 -0
- package/ai/skills/testdriver-scroll/SKILL.md +335 -0
- package/ai/skills/testdriver-secrets/SKILL.md +115 -0
- package/ai/skills/testdriver-self-hosted/SKILL.md +65 -0
- package/ai/skills/testdriver-test-writer/SKILL.md +448 -0
- package/ai/skills/testdriver-testdriver/SKILL.md +628 -0
- package/ai/skills/testdriver-testdriver-mechanic/SKILL.md +165 -0
- package/ai/skills/testdriver-type/SKILL.md +357 -0
- package/ai/skills/testdriver-variables/SKILL.md +111 -0
- package/ai/skills/testdriver-wait/SKILL.md +50 -0
- package/ai/skills/testdriver-waiting-for-elements/SKILL.md +90 -0
- package/ai/skills/testdriver-what-is-testdriver/SKILL.md +54 -0
- package/bin/testdriverai.js +22 -0
- package/debugger/bg.png +0 -0
- package/debugger/icon.png +0 -0
- package/debugger/index.html +469 -0
- package/debugger/td.png +0 -0
- package/debugger/tray-buffered.png +0 -0
- package/debugger/tray.png +0 -0
- package/docs/GITHUB_COMMENTS.md +330 -0
- package/docs/GITHUB_COMMENTS_ANNOUNCEMENT.md +167 -0
- package/docs/QUICK-START-GITHUB-COMMENTS.md +84 -0
- package/docs/TEST-GITHUB-COMMENTS.md +129 -0
- package/docs/_data/examples-manifest.json +177 -0
- package/docs/_data/examples-manifest.schema.json +41 -0
- package/docs/_scripts/extract-example-urls.js +165 -0
- package/docs/_scripts/generate-examples.js +560 -0
- package/docs/_scripts/generate-skills.js +154 -0
- package/docs/_scripts/link-replacer.js +164 -0
- package/docs/_scripts/upload-docs-to-openai.js +284 -0
- package/docs/changelog.mdx +161 -0
- package/docs/claude-mcp-plugin.mdx +160 -0
- package/docs/docs.json +442 -0
- package/docs/github-integration-setup.md +266 -0
- package/docs/guide/best-practices-polling.mdx +174 -0
- package/docs/images/content/account/newprojectsettings.png +0 -0
- package/docs/images/content/account/projectpage.png +0 -0
- package/docs/images/content/account/projectreplays.png +0 -0
- package/docs/images/content/account/team-manage.png +0 -0
- package/docs/images/content/account/teampage.png +0 -0
- package/docs/images/content/extension/cursor.svg +1 -0
- package/docs/images/content/extension/vscode.svg +57 -0
- package/docs/images/content/extension/windsurf.svg +3 -0
- package/docs/images/content/parse/output.png +0 -0
- package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
- package/docs/images/content/side-by-side.png +0 -0
- package/docs/images/content/vscode/ide-full.png +0 -0
- package/docs/images/content/vscode/running.png +0 -0
- package/docs/images/content/vscode/v7-chat.png +0 -0
- package/docs/images/content/vscode/v7-choose-agent.png +0 -0
- package/docs/images/content/vscode/v7-full.png +0 -0
- package/docs/images/content/vscode/v7-onboarding.png +0 -0
- package/docs/images/content/vscode/vscode-2-assert.png +0 -0
- package/docs/images/content/vscode/vscode-agent-preview.png +0 -0
- package/docs/images/content/vscode/vscode-copilot-ask.png +0 -0
- package/docs/images/content/vscode/vscode-file-creation.png +0 -0
- package/docs/images/content/vscode/vscode-install.png +0 -0
- package/docs/images/content/vscode/vscode-overview.png +0 -0
- package/docs/images/content/vscode/vscode-setup-walkthrough.png +0 -0
- package/docs/images/content/vscode/vscode-stopchat.png +0 -0
- package/docs/images/content/vscode/vscode-stoptest.png +0 -0
- package/docs/images/content/vscode/vscode-tdservice.png +0 -0
- package/docs/images/content/vscode/vscode-test-output.png +0 -0
- package/docs/images/content/vscode/vscode-testhistory.png +0 -0
- package/docs/images/content/vscode/vscode-testpane-runtests.png +0 -0
- package/docs/images/content/vscode/vscode-testpane.png +0 -0
- package/docs/images/template/dark.png +0 -0
- package/docs/images/template/icon.png +0 -0
- package/docs/images/template/light.png +0 -0
- package/docs/snippets/calendar-link.mdx +4 -0
- package/docs/snippets/gitignore-warning.mdx +7 -0
- package/docs/snippets/lifecycle-warning.mdx +6 -0
- package/docs/snippets/test-prereqs.mdx +12 -0
- package/docs/snippets/tests/assert-replay.mdx +7 -0
- package/docs/snippets/tests/assert-yaml.mdx +8 -0
- package/docs/snippets/tests/exec-js-replay.mdx +7 -0
- package/docs/snippets/tests/exec-js-yaml.mdx +32 -0
- package/docs/snippets/tests/exec-shell-replay.mdx +7 -0
- package/docs/snippets/tests/exec-shell-yaml.mdx +15 -0
- package/docs/snippets/tests/hover-image-replay.mdx +7 -0
- package/docs/snippets/tests/hover-image-yaml.mdx +17 -0
- package/docs/snippets/tests/hover-text-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-replay.mdx +7 -0
- package/docs/snippets/tests/hover-text-with-description-yaml.mdx +24 -0
- package/docs/snippets/tests/hover-text-yaml.mdx +14 -0
- package/docs/snippets/tests/match-image-replay.mdx +7 -0
- package/docs/snippets/tests/match-image-yaml.mdx +17 -0
- package/docs/snippets/tests/press-keys-replay.mdx +7 -0
- package/docs/snippets/tests/press-keys-yaml.mdx +36 -0
- package/docs/snippets/tests/remember-replay.mdx +7 -0
- package/docs/snippets/tests/remember-yaml.mdx +28 -0
- package/docs/snippets/tests/scroll-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-image-yaml.mdx +14 -0
- package/docs/snippets/tests/scroll-until-text-replay.mdx +7 -0
- package/docs/snippets/tests/scroll-until-text-yaml.mdx +17 -0
- package/docs/snippets/tests/scroll-yaml.mdx +30 -0
- package/docs/snippets/tests/type-repeated-replay.mdx +7 -0
- package/docs/snippets/tests/type-repeated-yaml.mdx +22 -0
- package/docs/snippets/tests/type-replay.mdx +7 -0
- package/docs/snippets/tests/type-yaml.mdx +28 -0
- package/docs/snippets/tests/wait-for-image-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-image-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-for-text-replay.mdx +7 -0
- package/docs/snippets/tests/wait-for-text-yaml.mdx +18 -0
- package/docs/snippets/tests/wait-replay.mdx +7 -0
- package/docs/snippets/tests/wait-yaml.mdx +13 -0
- package/docs/styles.css +65 -0
- package/docs/v6/account/dashboard.mdx +16 -0
- package/docs/v6/account/enterprise.mdx +110 -0
- package/docs/v6/account/pricing.mdx +33 -0
- package/docs/v6/account/projects.mdx +33 -0
- package/docs/v6/account/team.mdx +35 -0
- package/docs/v6/action/ami.mdx +109 -0
- package/docs/v6/action/performance.mdx +105 -0
- package/docs/v6/action/secrets.mdx +93 -0
- package/docs/v6/apps/chrome-extensions.mdx +48 -0
- package/docs/v6/apps/desktop-apps.mdx +93 -0
- package/docs/v6/apps/mobile-apps.mdx +26 -0
- package/docs/v6/apps/static-websites.mdx +54 -0
- package/docs/v6/apps/tauri-apps.mdx +361 -0
- package/docs/v6/bugs/jira.mdx +232 -0
- package/docs/v6/cli/overview.mdx +66 -0
- package/docs/v6/commands/assert.mdx +45 -0
- package/docs/v6/commands/exec.mdx +276 -0
- package/docs/v6/commands/focus-application.mdx +44 -0
- package/docs/v6/commands/hover-image.mdx +69 -0
- package/docs/v6/commands/hover-text.mdx +47 -0
- package/docs/v6/commands/if.mdx +53 -0
- package/docs/v6/commands/match-image.mdx +67 -0
- package/docs/v6/commands/press-keys.mdx +87 -0
- package/docs/v6/commands/remember.mdx +49 -0
- package/docs/v6/commands/run.mdx +44 -0
- package/docs/v6/commands/scroll-until-image.mdx +66 -0
- package/docs/v6/commands/scroll-until-text.mdx +60 -0
- package/docs/v6/commands/scroll.mdx +69 -0
- package/docs/v6/commands/type.mdx +45 -0
- package/docs/v6/commands/wait-for-image.mdx +54 -0
- package/docs/v6/commands/wait-for-text.mdx +48 -0
- package/docs/v6/commands/wait.mdx +45 -0
- package/docs/v6/exporting/junit.mdx +218 -0
- package/docs/v6/exporting/playwright.mdx +197 -0
- package/docs/v6/features/auto-healing.mdx +144 -0
- package/docs/v6/features/generation.mdx +116 -0
- package/docs/v6/features/parallel-testing.mdx +151 -0
- package/docs/v6/features/reusable-snippets.mdx +131 -0
- package/docs/v6/features/selectorless.mdx +80 -0
- package/docs/v6/features/visual-assertions.mdx +139 -0
- package/docs/v6/getting-started/ci.mdx +146 -0
- package/docs/v6/getting-started/cli.mdx +91 -0
- package/docs/v6/getting-started/editing.mdx +100 -0
- package/docs/v6/getting-started/playwright.mdx +342 -0
- package/docs/v6/getting-started/running.mdx +48 -0
- package/docs/v6/getting-started/self-hosting.mdx +408 -0
- package/docs/v6/getting-started/vscode.mdx +88 -0
- package/docs/v6/guide/assertions.mdx +189 -0
- package/docs/v6/guide/authentication.mdx +136 -0
- package/docs/v6/guide/code.mdx +65 -0
- package/docs/v6/guide/dashcam.mdx +118 -0
- package/docs/v6/guide/environment-variables.mdx +26 -0
- package/docs/v6/guide/lifecycle.mdx +242 -0
- package/docs/v6/guide/locating.mdx +141 -0
- package/docs/v6/guide/protips.mdx +43 -0
- package/docs/v6/guide/variables.mdx +143 -0
- package/docs/v6/guide/waiting.mdx +130 -0
- package/docs/v6/importing/csv.mdx +196 -0
- package/docs/v6/importing/gherkin.mdx +143 -0
- package/docs/v6/importing/jira.mdx +164 -0
- package/docs/v6/importing/testrail.mdx +162 -0
- package/docs/v6/integrations/electron.mdx +146 -0
- package/docs/v6/integrations/netlify.mdx +100 -0
- package/docs/v6/integrations/vercel.mdx +125 -0
- package/docs/v6/interactive/explore.mdx +99 -0
- package/docs/v6/interactive/run.mdx +52 -0
- package/docs/v6/interactive/save.mdx +63 -0
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v6/overview/faq.mdx +162 -0
- package/docs/v6/overview/performance.mdx +52 -0
- package/docs/v6/overview/quickstart.mdx +137 -0
- package/docs/v6/overview/what-is-testdriver.mdx +85 -0
- package/docs/v6/scenarios/ai-chatbot.mdx +28 -0
- package/docs/v6/scenarios/cookie-banner.mdx +32 -0
- package/docs/v6/scenarios/file-upload.mdx +33 -0
- package/docs/v6/scenarios/form-filling.mdx +32 -0
- package/docs/v6/scenarios/log-in.mdx +75 -0
- package/docs/v6/scenarios/pdf-generation.mdx +25 -0
- package/docs/v6/scenarios/spell-check.mdx +22 -0
- package/docs/v6/security/action.mdx +84 -0
- package/docs/v6/security/agent.mdx +73 -0
- package/docs/v6/security/platform.mdx +77 -0
- package/docs/v6/tutorials/advanced-test.mdx +81 -0
- package/docs/v6/tutorials/basic-test.mdx +45 -0
- package/docs/v7/_drafts/agents.mdx +843 -0
- package/docs/v7/_drafts/architecture.mdx +399 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/_drafts/awesome-logs-quick-ref.mdx +100 -0
- package/docs/v7/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +424 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/commands/assert.mdx +45 -0
- package/docs/v7/_drafts/commands/exec.mdx +276 -0
- package/docs/v7/_drafts/commands/focus-application.mdx +44 -0
- package/docs/v7/_drafts/commands/hover-image.mdx +69 -0
- package/docs/v7/_drafts/commands/hover-text.mdx +47 -0
- package/docs/v7/_drafts/commands/if.mdx +53 -0
- package/docs/v7/_drafts/commands/match-image.mdx +67 -0
- package/docs/v7/_drafts/commands/press-keys.mdx +87 -0
- package/docs/v7/_drafts/commands/remember.mdx +49 -0
- package/docs/v7/_drafts/commands/run.mdx +44 -0
- package/docs/v7/_drafts/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/_drafts/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/_drafts/commands/scroll.mdx +69 -0
- package/docs/v7/_drafts/commands/type.mdx +45 -0
- package/docs/v7/_drafts/commands/wait-for-image.mdx +54 -0
- package/docs/v7/_drafts/commands/wait-for-text.mdx +48 -0
- package/docs/v7/_drafts/commands/wait.mdx +45 -0
- package/docs/v7/_drafts/configuration.mdx +378 -0
- package/docs/v7/_drafts/contributing.mdx +174 -0
- package/docs/v7/_drafts/core.mdx +458 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/installation.mdx +420 -0
- package/docs/v7/_drafts/migration.mdx +562 -0
- package/docs/v7/_drafts/observable.mdx +604 -0
- package/docs/v7/_drafts/playwright.mdx +342 -0
- package/docs/v7/_drafts/plugin-migration.mdx +220 -0
- package/docs/v7/_drafts/powerful.mdx +419 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/v7/_drafts/provision.mdx +390 -0
- package/docs/v7/_drafts/quick-start-test-recording.mdx +214 -0
- package/docs/v7/_drafts/readme.mdx +135 -0
- package/docs/v7/_drafts/reports.mdx +414 -0
- package/docs/v7/_drafts/scalable.mdx +763 -0
- package/docs/v7/_drafts/screenshot.mdx +155 -0
- package/docs/v7/_drafts/sdk-awesome-logs.mdx +468 -0
- package/docs/v7/_drafts/sdk-browser-rendering.mdx +167 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/_drafts/self-hosting.mdx +369 -0
- package/docs/v7/_drafts/test-recording.mdx +382 -0
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/_drafts/writing-tests.mdx +25 -0
- package/docs/v7/ai.mdx +205 -0
- package/docs/v7/assert.mdx +316 -0
- package/docs/v7/aws-setup.mdx +449 -0
- package/docs/v7/cache.mdx +223 -0
- package/docs/v7/caching.mdx +128 -0
- package/docs/v7/captcha.mdx +159 -0
- package/docs/v7/ci-cd.mdx +603 -0
- package/docs/v7/click.mdx +287 -0
- package/docs/v7/client.mdx +478 -0
- package/docs/v7/copilot/auto-healing.mdx +265 -0
- package/docs/v7/copilot/creating-tests.mdx +156 -0
- package/docs/v7/copilot/github.mdx +143 -0
- package/docs/v7/copilot/running-tests.mdx +149 -0
- package/docs/v7/copilot/setup.mdx +143 -0
- package/docs/v7/customizing-devices.mdx +319 -0
- package/docs/v7/dashcam.mdx +419 -0
- package/docs/v7/debugging-with-screenshots.mdx +402 -0
- package/docs/v7/device-config.mdx +317 -0
- package/docs/v7/double-click.mdx +102 -0
- package/docs/v7/elements.mdx +606 -0
- package/docs/v7/enterprise.mdx +9 -0
- package/docs/v7/errors.mdx +248 -0
- package/docs/v7/events.mdx +358 -0
- package/docs/v7/examples/ai.mdx +72 -0
- package/docs/v7/examples/assert.mdx +72 -0
- package/docs/v7/examples/captcha-api.mdx +92 -0
- package/docs/v7/examples/chrome-extension.mdx +132 -0
- package/docs/v7/examples/drag-and-drop.mdx +100 -0
- package/docs/v7/examples/element-not-found.mdx +67 -0
- package/docs/v7/examples/exec-output.mdx +85 -0
- package/docs/v7/examples/exec-pwsh.mdx +83 -0
- package/docs/v7/examples/focus-window.mdx +62 -0
- package/docs/v7/examples/hover-image.mdx +94 -0
- package/docs/v7/examples/hover-text.mdx +69 -0
- package/docs/v7/examples/installer.mdx +91 -0
- package/docs/v7/examples/launch-vscode-linux.mdx +101 -0
- package/docs/v7/examples/match-image.mdx +96 -0
- package/docs/v7/examples/press-keys.mdx +92 -0
- package/docs/v7/examples/scroll-keyboard.mdx +79 -0
- package/docs/v7/examples/scroll-until-image.mdx +81 -0
- package/docs/v7/examples/scroll-until-text.mdx +109 -0
- package/docs/v7/examples/scroll.mdx +81 -0
- package/docs/v7/examples/type.mdx +92 -0
- package/docs/v7/examples/windows-installer.mdx +89 -0
- package/docs/v7/exec.mdx +318 -0
- package/docs/v7/find.mdx +830 -0
- package/docs/v7/focus-application.mdx +294 -0
- package/docs/v7/generating-tests.mdx +36 -0
- package/docs/v7/hosted.mdx +158 -0
- package/docs/v7/hover.mdx +279 -0
- package/docs/v7/locating-elements.mdx +71 -0
- package/docs/v7/making-assertions.mdx +32 -0
- package/docs/v7/mcp.mdx +9 -0
- package/docs/v7/mouse-down.mdx +161 -0
- package/docs/v7/mouse-up.mdx +164 -0
- package/docs/v7/parse.mdx +237 -0
- package/docs/v7/performing-actions.mdx +54 -0
- package/docs/v7/press-keys.mdx +349 -0
- package/docs/v7/provision.mdx +333 -0
- package/docs/v7/quickstart.mdx +173 -0
- package/docs/v7/redraw.mdx +216 -0
- package/docs/v7/reusable-code.mdx +249 -0
- package/docs/v7/right-click.mdx +123 -0
- package/docs/v7/running-tests.mdx +185 -0
- package/docs/v7/screenshot.mdx +249 -0
- package/docs/v7/screenshots.mdx +186 -0
- package/docs/v7/scroll.mdx +336 -0
- package/docs/v7/secrets.mdx +115 -0
- package/docs/v7/self-hosted.mdx +149 -0
- package/docs/v7/type.mdx +358 -0
- package/docs/v7/variables.mdx +111 -0
- package/docs/v7/wait.mdx +52 -0
- package/docs/v7/waiting-for-elements.mdx +90 -0
- package/docs/v7/what-is-testdriver.mdx +54 -0
- package/eslint.config.js +67 -0
- package/examples/ai.test.mjs +31 -0
- package/examples/assert.test.mjs +47 -0
- package/examples/chrome-extension.test.mjs +97 -0
- package/examples/config.mjs +5 -0
- package/examples/element-not-found.test.mjs +27 -0
- package/examples/exec-output.test.mjs +60 -0
- package/examples/exec-pwsh.test.mjs +58 -0
- package/examples/findall-coffee-icons.test.mjs +42 -0
- package/examples/focus-window.test.mjs +37 -0
- package/examples/formatted-logging.test.mjs +27 -0
- package/examples/hover-image.test.mjs +53 -0
- package/examples/hover-text-with-description.test.mjs +57 -0
- package/examples/hover-text.test.mjs +28 -0
- package/examples/installer.test.mjs +50 -0
- package/examples/launch-vscode-linux.test.mjs +55 -0
- package/examples/match-image.test.mjs +55 -0
- package/examples/parse.test.mjs +19 -0
- package/examples/press-keys.test.mjs +44 -0
- package/examples/prompt.test.mjs +34 -0
- package/examples/scroll-keyboard.test.mjs +38 -0
- package/examples/scroll-until-image.test.mjs +40 -0
- package/examples/scroll.test.mjs +42 -0
- package/examples/type.test.mjs +46 -0
- package/examples/windows-installer.test.mjs +54 -0
- package/index.js +2 -0
- package/interfaces/cli/commands/init.js +438 -0
- package/interfaces/cli/commands/setup.js +382 -0
- package/interfaces/cli/lib/base.js +285 -0
- package/interfaces/cli.js +20 -0
- package/interfaces/junit-reporter.js +290 -0
- package/interfaces/logger.js +388 -0
- package/interfaces/readline.js +234 -0
- package/interfaces/shared-test-state.mjs +64 -0
- package/interfaces/vitest-plugin.d.ts +115 -0
- package/interfaces/vitest-plugin.mjs +1698 -0
- package/lib/captcha/solver.js +358 -0
- package/lib/core/Dashcam.js +533 -0
- package/lib/core/index.d.ts +172 -0
- package/lib/core/index.js +12 -0
- package/lib/environments.json +18 -0
- package/lib/github-comment-formatter.js +263 -0
- package/lib/github-comment.mjs +452 -0
- package/lib/init-project.js +575 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/resolve-channel.js +46 -0
- package/lib/sentry.js +417 -0
- package/lib/vitest/hooks.d.ts +57 -0
- package/lib/vitest/hooks.mjs +674 -0
- package/lib/vitest/setup-aws.mjs +247 -0
- package/lib/vitest/setup-self-hosted.mjs +151 -0
- package/lib/vitest/setup.mjs +46 -0
- package/manual/captcha-api.test.mjs +51 -0
- package/manual/drag-and-drop.test.mjs +59 -0
- package/manual/flake-diffthreshold-001.test.mjs +9 -0
- package/manual/flake-diffthreshold-01.test.mjs +9 -0
- package/manual/flake-diffthreshold-05.test.mjs +9 -0
- package/manual/flake-noredraw-cache.test.mjs +9 -0
- package/manual/flake-noredraw-nocache.test.mjs +9 -0
- package/manual/flake-redraw-cache.test.mjs +9 -0
- package/manual/flake-redraw-nocache.test.mjs +9 -0
- package/manual/flake-rocket-match.test.mjs +30 -0
- package/manual/flake-shared.mjs +51 -0
- package/manual/no-provision.test.mjs +31 -0
- package/manual/packer-hover-image.test.mjs +176 -0
- package/manual/scroll-until-text.test.mjs +68 -0
- package/manual/test-init-command.js +223 -0
- package/mcp-server/README.md +322 -0
- package/mcp-server/dist/codegen.d.ts +9 -0
- package/mcp-server/dist/codegen.js +165 -0
- package/mcp-server/dist/mcp-app.html +114 -0
- package/mcp-server/dist/package.json +1 -0
- package/mcp-server/dist/provision-types.d.ts +290 -0
- package/mcp-server/dist/provision-types.js +174 -0
- package/mcp-server/dist/server.d.ts +6 -0
- package/mcp-server/dist/server.mjs +1925 -0
- package/mcp-server/dist/session.d.ts +85 -0
- package/mcp-server/dist/session.js +152 -0
- package/mcp-server/mcp-app.html +28 -0
- package/mcp-server/mcp-config.example.json +19 -0
- package/mcp-server/package-lock.json +4027 -0
- package/mcp-server/package.json +31 -0
- package/mcp-server/src/codegen.ts +189 -0
- package/mcp-server/src/mcp-app.css +360 -0
- package/mcp-server/src/mcp-app.ts +547 -0
- package/mcp-server/src/provision-types.ts +209 -0
- package/mcp-server/src/server.ts +2391 -0
- package/mcp-server/src/session.ts +194 -0
- package/mcp-server/tsconfig.json +16 -0
- package/mcp-server/vite.config.ts +23 -0
- package/package.json +158 -0
- package/schema.json +1046 -0
- package/scripts/generate-skills.js +94 -0
- package/sdk-log-formatter.js +1157 -0
- package/sdk.d.ts +1486 -0
- package/sdk.js +4336 -0
- package/setup/aws/cloudformation.yaml +463 -0
- package/setup/aws/disable-defender.sh +42 -0
- package/setup/aws/install-dev-runner.sh +79 -0
- package/setup/aws/spawn-runner.sh +289 -0
- package/test/captcha-solver.test.mjs +152 -0
- package/test/chrome-remote-debugging.test.mjs +66 -0
- package/test/duckduckgo/experiment.test.mjs +28 -0
- package/test/duckduckgo/setup.test.mjs +29 -0
- package/test/manual/debug-locate-response.js +82 -0
- package/test/manual/reconnect-provision.test.mjs +49 -0
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +97 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +29 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/manual/verify-element-api.js +89 -0
- package/test/manual/verify-types.js +0 -0
- package/test/manual-unawaited-promise.test.mjs +31 -0
- package/vitest.config.mjs +58 -0
- package/vitest.runner.config.mjs +33 -0
- package/vscode-extension/.vscodeignore +12 -0
- package/vscode-extension/README.md +94 -0
- package/vscode-extension/media/icon.png +0 -0
- package/vscode-extension/package-lock.json +4126 -0
- package/vscode-extension/package.json +86 -0
- package/vscode-extension/src/extension.ts +829 -0
- package/vscode-extension/testdriverai-0.1.0.vsix +0 -0
- package/vscode-extension/tsconfig.json +16 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Selector Caching"
|
|
3
|
+
sidebarTitle: "Selector Caching"
|
|
4
|
+
description: "How TestDriver caches element locations for faster tests"
|
|
5
|
+
icon: "crosshairs"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
The Selector Cache stores element locations on the server, so `.find()` calls can skip the AI vision analysis.
|
|
11
|
+
|
|
12
|
+
**Important:** Selector caching is **disabled by default** as of v7.1. You must provide a `cacheKey` to enable caching.
|
|
13
|
+
|
|
14
|
+
This provides:
|
|
15
|
+
- ⚡ **Up to 10x faster** - Skip AI vision analysis
|
|
16
|
+
- 💰 **Lower AI costs** - Fewer vision API calls
|
|
17
|
+
- 🎯 **Consistent results** - Same UI = same coordinates
|
|
18
|
+
- 📊 **Metrics tracking** - See cache hit rates in console
|
|
19
|
+
|
|
20
|
+
## Enabling the Cache
|
|
21
|
+
|
|
22
|
+
### Auto-Generated Cache Keys (Recommended)
|
|
23
|
+
|
|
24
|
+
TestDriver automatically generates cache keys based on your test file:
|
|
25
|
+
|
|
26
|
+
```javascript
|
|
27
|
+
// Cache automatically enabled - uses file hash as cache key
|
|
28
|
+
const button = await testdriver.find('submit button');
|
|
29
|
+
// Cache key: "a1b2c3d4e5f6..." (first 16 chars of file SHA-256)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
**Benefits:**
|
|
33
|
+
- ✅ **Per-file isolation** - Each test file has its own cache
|
|
34
|
+
- ✅ **Auto-invalidation** - Cache updates when test code changes
|
|
35
|
+
- ✅ **Zero configuration** - Works out of the box
|
|
36
|
+
- ✅ **Safe** - No cross-test pollution
|
|
37
|
+
|
|
38
|
+
### Custom Cache Keys
|
|
39
|
+
|
|
40
|
+
Provide your own cache key for more control:
|
|
41
|
+
|
|
42
|
+
```javascript
|
|
43
|
+
// Custom cache key
|
|
44
|
+
const button = await testdriver.find('submit button', {
|
|
45
|
+
cacheKey: 'my-test-key'
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Share cache across tests
|
|
49
|
+
const button = await testdriver.find('submit button', {
|
|
50
|
+
cacheKey: 'shared-submit-button'
|
|
51
|
+
});
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Use Case - Variables in Test Steps:**
|
|
55
|
+
|
|
56
|
+
Custom cache keys are especially useful when you use variables in your test steps, ensuring consistent caching regardless of the variable values:
|
|
57
|
+
|
|
58
|
+
```javascript
|
|
59
|
+
// Without custom cache key - each variable value creates a new cache entry
|
|
60
|
+
const userName = 'john.doe@example.com';
|
|
61
|
+
await testdriver.find(`input field for ${userName}`); // Cache miss every time
|
|
62
|
+
|
|
63
|
+
// With custom cache key - all values share the same cache
|
|
64
|
+
const userName = 'john.doe@example.com';
|
|
65
|
+
await testdriver.find(`input field for ${userName}`, {
|
|
66
|
+
cacheKey: 'email-input-field' // Same cache key regardless of userName value
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Another example with dynamic data
|
|
70
|
+
const productId = '12345';
|
|
71
|
+
await testdriver.find(`product card for ${productId}`, {
|
|
72
|
+
cacheKey: 'product-card' // Reuses cache for any productId
|
|
73
|
+
});
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
This prevents cache pollution and improves cache hit rates when your prompts include dynamic values.
|
|
77
|
+
|
|
78
|
+
### Global Cache Key
|
|
79
|
+
|
|
80
|
+
Enable caching for all finds in your test:
|
|
81
|
+
|
|
82
|
+
```javascript
|
|
83
|
+
const client = new TestDriver(apiKey, {
|
|
84
|
+
cacheKey: 'my-global-key' // All finds will use this cache
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
// Now all finds are cached
|
|
88
|
+
await testdriver.find('button 1'); // Uses 'my-global-key'
|
|
89
|
+
await testdriver.find('button 2'); // Uses 'my-global-key'
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Disable Auto-Cache
|
|
93
|
+
|
|
94
|
+
If you don't want automatic caching:
|
|
95
|
+
|
|
96
|
+
```javascript
|
|
97
|
+
// Disable cache for this find
|
|
98
|
+
await testdriver.find('button', { cacheThreshold: -1 });
|
|
99
|
+
|
|
100
|
+
// Or use a threshold of -1 globally
|
|
101
|
+
const client = new TestDriver(apiKey, {
|
|
102
|
+
cacheThreshold: { find: -1, findAll: -1 }
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## How It Works
|
|
107
|
+
|
|
108
|
+
```mermaid
|
|
109
|
+
sequenceDiagram
|
|
110
|
+
participant Test as Your Test
|
|
111
|
+
participant SDK as TestDriver SDK
|
|
112
|
+
participant API as TestDriver API
|
|
113
|
+
participant AI as Claude Vision
|
|
114
|
+
participant Cache as Selector Cache DB
|
|
115
|
+
|
|
116
|
+
Test->>SDK: testdriver.find('submit button')
|
|
117
|
+
SDK->>API: POST /locate (screenshot + prompt)
|
|
118
|
+
|
|
119
|
+
API->>Cache: Check for matching cache entry
|
|
120
|
+
|
|
121
|
+
alt Cache Hit (95%+ similar screenshot)
|
|
122
|
+
Cache-->>API: Return cached coordinates
|
|
123
|
+
API-->>SDK: {x, y, cacheHit: true}
|
|
124
|
+
SDK-->>Test: Element found (instant)
|
|
125
|
+
else Cache Miss
|
|
126
|
+
API->>AI: Analyze screenshot
|
|
127
|
+
AI-->>API: Element coordinates
|
|
128
|
+
API->>Cache: Save new cache entry
|
|
129
|
+
API-->>SDK: {x, y, cacheHit: false}
|
|
130
|
+
SDK-->>Test: Element found
|
|
131
|
+
end
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Cache Matching Strategy
|
|
135
|
+
|
|
136
|
+
The selector cache uses a three-tier matching system:
|
|
137
|
+
|
|
138
|
+
1. **Exact Hash Match** (Fastest)
|
|
139
|
+
- Perceptual hash comparison
|
|
140
|
+
- Same screenshot = instant match
|
|
141
|
+
- 0% difference threshold
|
|
142
|
+
|
|
143
|
+
2. **Pixel Diff Match** (Fast)
|
|
144
|
+
- 80%+ perceptual hash similarity
|
|
145
|
+
- Pixel-by-pixel comparison
|
|
146
|
+
- Default 5% difference threshold (95% similarity)
|
|
147
|
+
- Configurable per call
|
|
148
|
+
|
|
149
|
+
3. **Template Match** (Fallback)
|
|
150
|
+
- Edge detection + template matching
|
|
151
|
+
- Finds visually similar UI elements
|
|
152
|
+
- 75%+ confidence threshold
|
|
153
|
+
|
|
154
|
+
## Controlling Cache Threshold
|
|
155
|
+
|
|
156
|
+
Adjust similarity threshold when cache is enabled:
|
|
157
|
+
|
|
158
|
+
```javascript
|
|
159
|
+
// Default: 95% similarity (5% difference allowed)
|
|
160
|
+
await testdriver.find('submit button', { cacheKey: 'test-1' });
|
|
161
|
+
|
|
162
|
+
// Stricter: 99% similarity (1% difference allowed)
|
|
163
|
+
await testdriver.find('submit button', {
|
|
164
|
+
cacheKey: 'test-1',
|
|
165
|
+
cacheThreshold: 0.01
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
// More lenient: 90% similarity (10% difference allowed)
|
|
169
|
+
await testdriver.find('submit button', {
|
|
170
|
+
cacheKey: 'test-1',
|
|
171
|
+
cacheThreshold: 0.10
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// Disable cache: force fresh AI analysis
|
|
175
|
+
await testdriver.find('submit button', { cacheThreshold: -1 });
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
<Note>
|
|
179
|
+
`cacheThreshold` only works when caching is enabled via `cacheKey` or global config.
|
|
180
|
+
</Note>
|
|
181
|
+
|
|
182
|
+
## Cache Filtering
|
|
183
|
+
|
|
184
|
+
The selector cache automatically filters by:
|
|
185
|
+
|
|
186
|
+
- **Prompt** - Exact text match (case-insensitive)
|
|
187
|
+
- **Team** - Your team ID
|
|
188
|
+
- **OS** - Operating system (if specified)
|
|
189
|
+
- **Resolution** - Screen resolution (if specified)
|
|
190
|
+
- **Time Window** - Last 7 days by default
|
|
191
|
+
|
|
192
|
+
## Viewing Cache Entries
|
|
193
|
+
|
|
194
|
+
View all cached selectors at [console.testdriver.ai](https://console.testdriver.ai)
|
|
195
|
+
|
|
196
|
+
The console shows:
|
|
197
|
+
- Cached screenshots with green circles on found elements
|
|
198
|
+
- Original prompts
|
|
199
|
+
- Hit count (how many times cache was used)
|
|
200
|
+
- Similarity scores
|
|
201
|
+
- Cache age and last accessed time
|
|
202
|
+
|
|
203
|
+
## Cache Statistics
|
|
204
|
+
|
|
205
|
+
Each cache entry tracks:
|
|
206
|
+
|
|
207
|
+
- **Hit Count** - Number of times cache was used
|
|
208
|
+
- **Last Hit** - When cache was last accessed
|
|
209
|
+
- **Similarity** - Percentage match to original
|
|
210
|
+
- **Created At** - When entry was created
|
|
211
|
+
- **Element Type** - button, input, link, etc.
|
|
212
|
+
- **Element Bounds** - Bounding box coordinates
|
|
213
|
+
|
|
214
|
+
## Usage Examples
|
|
215
|
+
|
|
216
|
+
### Basic Selector Caching
|
|
217
|
+
|
|
218
|
+
```javascript
|
|
219
|
+
import { test } from 'vitest';
|
|
220
|
+
import { chrome } from 'testdriverai/presets';
|
|
221
|
+
|
|
222
|
+
test('find element', async (context) => {
|
|
223
|
+
const { testdriver } = await chrome(context, {
|
|
224
|
+
url: 'https://example.com'
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// Auto-cache enabled (uses file hash as cache key)
|
|
228
|
+
// First call: AI vision analysis, saves to cache
|
|
229
|
+
const button = await testdriver.find('More information link');
|
|
230
|
+
console.log('Cache hit:', button.cacheHit); // false (first run)
|
|
231
|
+
|
|
232
|
+
// Second call: uses cache (instant)
|
|
233
|
+
const button2 = await testdriver.find('More information link');
|
|
234
|
+
console.log('Cache hit:', button2.cacheHit); // true (cache hit)
|
|
235
|
+
|
|
236
|
+
// Custom cache key
|
|
237
|
+
const button3 = await testdriver.find('submit button', {
|
|
238
|
+
cacheKey: 'my-button'
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Dynamic Threshold Example
|
|
244
|
+
|
|
245
|
+
```javascript
|
|
246
|
+
test('strict vs lenient matching', async (context) => {
|
|
247
|
+
const { testdriver } = await chrome(context, { url });
|
|
248
|
+
|
|
249
|
+
// Strict: 99% similarity required (auto-cache key)
|
|
250
|
+
const elem1 = await testdriver.find('button', { cacheThreshold: 0.01 });
|
|
251
|
+
|
|
252
|
+
// Lenient: 90% similarity acceptable
|
|
253
|
+
const elem2 = await testdriver.find('button', { cacheThreshold: 0.10 });
|
|
254
|
+
|
|
255
|
+
// Bypass cache entirely (no cacheKey needed)
|
|
256
|
+
const elem3 = await testdriver.find('button', { cacheThreshold: -1 });
|
|
257
|
+
|
|
258
|
+
// Custom cache key with threshold
|
|
259
|
+
const elem4 = await testdriver.find('button', {
|
|
260
|
+
cacheKey: 'my-button',
|
|
261
|
+
cacheThreshold: 0.05
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### Checking Cache Hits
|
|
267
|
+
|
|
268
|
+
```javascript
|
|
269
|
+
test('monitor cache performance', async (context) => {
|
|
270
|
+
const { testdriver } = await chrome(context, { url });
|
|
271
|
+
|
|
272
|
+
// Auto-cache enabled
|
|
273
|
+
const element = await testdriver.find('submit button');
|
|
274
|
+
|
|
275
|
+
if (element.cacheHit) {
|
|
276
|
+
console.log('✅ Cache hit - instant response');
|
|
277
|
+
console.log('Cache strategy:', element.cacheStrategy);
|
|
278
|
+
console.log('Cache age:', element.cacheCreatedAt);
|
|
279
|
+
} else {
|
|
280
|
+
console.log('⏱️ Cache miss - AI analysis performed');
|
|
281
|
+
console.log('New cache entry created');
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Check similarity score
|
|
285
|
+
if (element.similarity) {
|
|
286
|
+
console.log(`Similarity: ${(element.similarity * 100).toFixed(1)}%`);
|
|
287
|
+
}
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
## Best Practices
|
|
292
|
+
|
|
293
|
+
### 1. Use Appropriate Thresholds
|
|
294
|
+
|
|
295
|
+
```javascript
|
|
296
|
+
// Stable UI: strict threshold (auto-cache)
|
|
297
|
+
await testdriver.find('logo', { cacheThreshold: 0.01 });
|
|
298
|
+
|
|
299
|
+
// Dynamic UI: lenient threshold
|
|
300
|
+
await testdriver.find('news feed item', { cacheThreshold: 0.10 });
|
|
301
|
+
|
|
302
|
+
// Always fresh: disable cache
|
|
303
|
+
await testdriver.find('timestamp', { cacheThreshold: -1 });
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### 2. Choose Cache Key Strategy
|
|
307
|
+
|
|
308
|
+
```javascript
|
|
309
|
+
// Auto-cache (recommended) - per-file isolation
|
|
310
|
+
await testdriver.find('button');
|
|
311
|
+
|
|
312
|
+
// Custom key - share across tests
|
|
313
|
+
await testdriver.find('button', { cacheKey: 'global-submit' });
|
|
314
|
+
|
|
315
|
+
// Global key - all finds in test
|
|
316
|
+
const testdriver = new TestDriver(apiKey, {
|
|
317
|
+
cacheKey: 'test-suite-1'
|
|
318
|
+
});
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Check [console.testdriver.ai](https://console.testdriver.ai) regularly to:
|
|
322
|
+
- See cache hit rates
|
|
323
|
+
- Identify frequently used selectors
|
|
324
|
+
- Remove stale cache entries
|
|
325
|
+
- Optimize threshold settings
|
|
326
|
+
|
|
327
|
+
### 3. Clear Cache When UI Changes
|
|
328
|
+
|
|
329
|
+
If your UI changes significantly, delete cache entries through the console dashboard.
|
|
330
|
+
|
|
331
|
+
### 4. Use Consistent Prompts
|
|
332
|
+
|
|
333
|
+
```javascript
|
|
334
|
+
// ✅ Good - consistent prompt
|
|
335
|
+
await testdriver.find('submit button');
|
|
336
|
+
await testdriver.find('submit button'); // Cache hit
|
|
337
|
+
|
|
338
|
+
// ❌ Bad - different prompts
|
|
339
|
+
await testdriver.find('submit button');
|
|
340
|
+
await testdriver.find('the submit button'); // Cache miss
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Cache Storage Details
|
|
344
|
+
|
|
345
|
+
| Property | Value |
|
|
346
|
+
|----------|-------|
|
|
347
|
+
| Location | Server (MongoDB + S3) |
|
|
348
|
+
| Persistence | 7 days default |
|
|
349
|
+
| Scope | Per-team |
|
|
350
|
+
| Matching | Screenshot similarity + prompt |
|
|
351
|
+
| Expiration | 7-day rolling window |
|
|
352
|
+
|
|
353
|
+
## Troubleshooting
|
|
354
|
+
|
|
355
|
+
### Cache Not Working
|
|
356
|
+
|
|
357
|
+
Check:
|
|
358
|
+
1. Threshold isn't too strict (try 0.10 for 90% similarity)
|
|
359
|
+
2. Screenshot hasn't changed significantly
|
|
360
|
+
3. OS/resolution matches cached entry
|
|
361
|
+
4. Cache entry isn't older than 7 days
|
|
362
|
+
5. Prompt matches exactly (case-insensitive)
|
|
363
|
+
|
|
364
|
+
### Low Cache Hit Rate
|
|
365
|
+
|
|
366
|
+
If you're seeing low cache hit rates:
|
|
367
|
+
|
|
368
|
+
1. **Increase threshold** - Try 0.10 (90% similarity) for dynamic UIs
|
|
369
|
+
2. **Stabilize UI** - Minimize animations, random data, timestamps
|
|
370
|
+
3. **Use consistent prompts** - Same wording every time
|
|
371
|
+
4. **Check console** - View similarity scores in dashboard
|
|
372
|
+
|
|
373
|
+
### Stale Cache Data
|
|
374
|
+
|
|
375
|
+
Delete selector cache entries at [console.testdriver.ai](https://console.testdriver.ai)
|
|
376
|
+
|
|
377
|
+
- Find the cached entry by prompt or screenshot
|
|
378
|
+
- Click delete to remove stale entries
|
|
379
|
+
- Run test again to create fresh cache
|
|
380
|
+
|
|
381
|
+
### Cache Misses on Identical UI
|
|
382
|
+
|
|
383
|
+
If cache misses occur on seemingly identical screens:
|
|
384
|
+
|
|
385
|
+
1. **Check resolution** - Cache is resolution-specific
|
|
386
|
+
2. **Check OS** - Cache is platform-specific
|
|
387
|
+
3. **Check pixel differences** - Even 1px changes can cause misses with strict thresholds
|
|
388
|
+
4. **Increase threshold** - Allow more similarity variance
|
|
389
|
+
|
|
390
|
+
## Advanced Configuration
|
|
391
|
+
|
|
392
|
+
### Environment Variables
|
|
393
|
+
|
|
394
|
+
```bash
|
|
395
|
+
# Disable selector cache entirely
|
|
396
|
+
TD_NO_SELECTOR_CACHE=1
|
|
397
|
+
|
|
398
|
+
# Set default threshold globally
|
|
399
|
+
TD_DEFAULT_THRESHOLD=0.10
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Per-Test Configuration
|
|
403
|
+
|
|
404
|
+
```javascript
|
|
405
|
+
test('custom cache settings', async (context) => {
|
|
406
|
+
const { testdriver } = await chrome(context, {
|
|
407
|
+
url,
|
|
408
|
+
cacheDefaults: {
|
|
409
|
+
threshold: 0.10, // 90% similarity
|
|
410
|
+
enabled: true
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
|
|
414
|
+
// Uses custom defaults
|
|
415
|
+
await testdriver.find('button');
|
|
416
|
+
});
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
## See Also
|
|
420
|
+
|
|
421
|
+
- [AI Prompt Caching](/v7/guides/caching-ai) - Cache AI-generated YAML
|
|
422
|
+
- [Console Dashboard](https://console.testdriver.ai) - View and manage selector cache
|
|
423
|
+
- [`.find()` Method](/v7/api/find) - Element location
|
|
424
|
+
- [Vitest Integration](/v7/guides/vitest) - Testing with TestDriver
|