testdriverai 7.1.0 → 7.1.2
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/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/agent/index.js +18 -45
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +1 -1
- package/agent/lib/redraw.js +1 -1
- package/agent/lib/sandbox.js +30 -2
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +140 -131
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/plugin-migration.mdx +222 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-logging.mdx +222 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
- package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +2 -2
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +1 -1
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +51 -5
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome.mdx +16 -0
- package/docs/v7/presets/electron.mdx +18 -0
- package/docs/v7/presets/vscode.mdx +19 -0
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +214 -10
- package/{src → lib}/core/Dashcam.js +41 -4
- package/{src → lib}/vitest/hooks.mjs +118 -100
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +9 -10
- package/sdk.d.ts +15 -2
- package/sdk.js +72 -17
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +96 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +28 -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/testdriver/assert.test.mjs +41 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
- package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
- package/test/testdriver/setup/testHelpers.mjs +653 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
- package/vitest.config.mjs +8 -59
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/settings.json +0 -14
- package/AGENTS.md +0 -550
- package/CODEOWNERS +0 -2
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/docs/v7/guides/ci-cd/azure.mdx +0 -587
- package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
- package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
- package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
- package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
- package/docs/v7/guides/ci-cd/travis.mdx +0 -438
- package/scripts/view-test-results.mjs +0 -96
- package/src/vitest/extended.mjs +0 -108
- package/src/vitest/index.mjs +0 -64
- package/src/vitest/utils.mjs +0 -150
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/dashcam.test.js +0 -137
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
- package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
- /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
- /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
- /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{src → lib}/core/index.d.ts +0 -0
- /package/{src → lib}/core/index.js +0 -0
- /package/{src → lib}/presets/index.mjs +0 -0
- /package/{src → lib}/vitest/hooks.d.ts +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -0,0 +1,424 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Fast Performance"
|
|
3
|
+
description: "1.7x faster test execution with intelligent caching and optimization"
|
|
4
|
+
icon: "bolt"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Speed matters when you're running hundreds or thousands of tests. TestDriver is engineered for performance with intelligent caching that delivers up to **1.7x faster** test execution.
|
|
8
|
+
|
|
9
|
+
## Test Caching Performance
|
|
10
|
+
|
|
11
|
+
Selector caching dramatically reduces test execution time by skipping redundant AI vision analysis:
|
|
12
|
+
|
|
13
|
+
<Card title="Real Performance Results" icon="chart-line">
|
|
14
|
+
**First run (no cache):**
|
|
15
|
+
```
|
|
16
|
+
⏱️ Test duration: 45.2s
|
|
17
|
+
🔍 AI vision calls: 12
|
|
18
|
+
💰 Cost: $0.048
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Cached run:**
|
|
22
|
+
```
|
|
23
|
+
⚡ Test duration: 26.6s (1.7x faster)
|
|
24
|
+
✅ Cache hits: 11/12
|
|
25
|
+
💰 Cost: $0.004 (92% savings)
|
|
26
|
+
```
|
|
27
|
+
</Card>
|
|
28
|
+
|
|
29
|
+
The more you run your tests, the faster they get. Cache hits are nearly instant, turning slow AI analysis into millisecond lookups.
|
|
30
|
+
|
|
31
|
+
## Intelligent Cache Strategy
|
|
32
|
+
|
|
33
|
+
TestDriver uses a sophisticated three-tier matching system to maximize cache hits while maintaining accuracy:
|
|
34
|
+
|
|
35
|
+
<Steps>
|
|
36
|
+
<Step title="Exact Hash Match (Fastest)">
|
|
37
|
+
Perceptual hash comparison for identical screenshots.
|
|
38
|
+
|
|
39
|
+
- **Speed:** Instant (< 1ms)
|
|
40
|
+
- **Accuracy:** 100%
|
|
41
|
+
- **Use case:** Repeat test runs
|
|
42
|
+
|
|
43
|
+
```javascript
|
|
44
|
+
// First run: builds cache
|
|
45
|
+
await testdriver.find('submit button'); // 2.3s (AI analysis)
|
|
46
|
+
|
|
47
|
+
// Second run: exact match
|
|
48
|
+
await testdriver.find('submit button'); // 8ms (cache hit) ⚡
|
|
49
|
+
```
|
|
50
|
+
</Step>
|
|
51
|
+
|
|
52
|
+
<Step title="Pixel Diff Match (Fast)">
|
|
53
|
+
Pixel-by-pixel comparison for similar screenshots.
|
|
54
|
+
|
|
55
|
+
- **Speed:** Very fast (< 50ms)
|
|
56
|
+
- **Accuracy:** 95%+ similarity threshold
|
|
57
|
+
- **Use case:** Minor UI changes (hover states, animations)
|
|
58
|
+
|
|
59
|
+
```javascript
|
|
60
|
+
// Cache works even with small visual changes
|
|
61
|
+
await testdriver.find('button', {
|
|
62
|
+
cacheThreshold: 0.05 // Allow 5% difference
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
</Step>
|
|
66
|
+
|
|
67
|
+
<Step title="Template Match (Fallback)">
|
|
68
|
+
Edge detection and template matching for structural similarity.
|
|
69
|
+
|
|
70
|
+
- **Speed:** Fast (< 200ms)
|
|
71
|
+
- **Accuracy:** 75%+ confidence
|
|
72
|
+
- **Use case:** Layout changes, responsive design
|
|
73
|
+
|
|
74
|
+
```javascript
|
|
75
|
+
// Still uses cache even when layout shifts
|
|
76
|
+
await testdriver.find('submit button', {
|
|
77
|
+
cacheThreshold: 0.10 // More lenient
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
</Step>
|
|
81
|
+
</Steps>
|
|
82
|
+
|
|
83
|
+
## Automatic Caching
|
|
84
|
+
|
|
85
|
+
Caching is enabled automatically with zero configuration:
|
|
86
|
+
|
|
87
|
+
```javascript
|
|
88
|
+
import { test } from 'vitest';
|
|
89
|
+
import { chrome } from 'testdriverai/presets';
|
|
90
|
+
|
|
91
|
+
test('auto-cached test', async (context) => {
|
|
92
|
+
const { testdriver } = await chrome(context, {
|
|
93
|
+
url: 'https://example.com'
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
// First call: AI analyzes screen, saves to cache
|
|
97
|
+
await testdriver.find('More information link'); // 2.1s
|
|
98
|
+
|
|
99
|
+
// Second call: cache hit, instant response
|
|
100
|
+
await testdriver.find('More information link'); // 12ms ⚡
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
<Tip>
|
|
105
|
+
TestDriver automatically generates cache keys based on your test file hash. Each file has isolated caching, preventing cross-test pollution.
|
|
106
|
+
</Tip>
|
|
107
|
+
|
|
108
|
+
## Cache Hit Monitoring
|
|
109
|
+
|
|
110
|
+
Track cache performance in real-time:
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
test('monitor cache performance', async (context) => {
|
|
114
|
+
const { testdriver } = await chrome(context, { url });
|
|
115
|
+
|
|
116
|
+
const element = await testdriver.find('submit button');
|
|
117
|
+
|
|
118
|
+
if (element.cacheHit) {
|
|
119
|
+
console.log('✅ Cache hit - instant response');
|
|
120
|
+
console.log('Strategy:', element.cacheStrategy); // 'exact', 'pixeldiff', or 'template'
|
|
121
|
+
console.log('Similarity:', `${(element.similarity * 100).toFixed(1)}%`);
|
|
122
|
+
console.log('Cache age:', element.cacheCreatedAt);
|
|
123
|
+
} else {
|
|
124
|
+
console.log('⏱️ Cache miss - AI analysis performed');
|
|
125
|
+
console.log('New cache entry created');
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Example output:
|
|
131
|
+
```
|
|
132
|
+
✅ Cache hit - instant response
|
|
133
|
+
Strategy: pixeldiff
|
|
134
|
+
Similarity: 97.3%
|
|
135
|
+
Cache age: 2024-12-02T10:15:30Z
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Configurable Thresholds
|
|
139
|
+
|
|
140
|
+
Fine-tune cache behavior for your application:
|
|
141
|
+
|
|
142
|
+
<Tabs>
|
|
143
|
+
<Tab title="Strict (Default)">
|
|
144
|
+
```javascript
|
|
145
|
+
// Default: 95% similarity required
|
|
146
|
+
await testdriver.find('submit button');
|
|
147
|
+
|
|
148
|
+
// Explicit strict threshold
|
|
149
|
+
await testdriver.find('submit button', {
|
|
150
|
+
cacheThreshold: 0.01 // 99% similarity
|
|
151
|
+
});
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**Best for:**
|
|
155
|
+
- Static content
|
|
156
|
+
- Stable UI elements
|
|
157
|
+
- Critical interactions
|
|
158
|
+
</Tab>
|
|
159
|
+
|
|
160
|
+
<Tab title="Lenient">
|
|
161
|
+
```javascript
|
|
162
|
+
// Allow more variance
|
|
163
|
+
await testdriver.find('dynamic content', {
|
|
164
|
+
cacheThreshold: 0.10 // 90% similarity
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Best for:**
|
|
169
|
+
- Dynamic content (timestamps, user data)
|
|
170
|
+
- Animated elements
|
|
171
|
+
- Responsive layouts
|
|
172
|
+
- A/B testing scenarios
|
|
173
|
+
</Tab>
|
|
174
|
+
|
|
175
|
+
<Tab title="Bypass Cache">
|
|
176
|
+
```javascript
|
|
177
|
+
// Force fresh AI analysis
|
|
178
|
+
await testdriver.find('always fresh element', {
|
|
179
|
+
cacheThreshold: -1 // Disable cache
|
|
180
|
+
});
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Best for:**
|
|
184
|
+
- Highly dynamic content
|
|
185
|
+
- Real-time data
|
|
186
|
+
- First-time debugging
|
|
187
|
+
</Tab>
|
|
188
|
+
</Tabs>
|
|
189
|
+
|
|
190
|
+
## Parallel Execution
|
|
191
|
+
|
|
192
|
+
Run tests concurrently for maximum throughput:
|
|
193
|
+
|
|
194
|
+
```javascript vitest.config.mjs
|
|
195
|
+
import { defineConfig } from 'vitest/config';
|
|
196
|
+
|
|
197
|
+
export default defineConfig({
|
|
198
|
+
test: {
|
|
199
|
+
testTimeout: 120000,
|
|
200
|
+
maxConcurrency: 10, // Run 10 tests simultaneously
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
<CardGroup cols={2}>
|
|
206
|
+
<Card title="Sequential Execution" icon="arrow-right">
|
|
207
|
+
```
|
|
208
|
+
Test 1: 30s
|
|
209
|
+
Test 2: 30s
|
|
210
|
+
Test 3: 30s
|
|
211
|
+
Total: 90s
|
|
212
|
+
```
|
|
213
|
+
</Card>
|
|
214
|
+
|
|
215
|
+
<Card title="Parallel Execution (3x)" icon="arrows-split-up-and-left">
|
|
216
|
+
```
|
|
217
|
+
Test 1: 30s
|
|
218
|
+
Test 2: 30s } concurrent
|
|
219
|
+
Test 3: 30s
|
|
220
|
+
Total: 30s
|
|
221
|
+
```
|
|
222
|
+
</Card>
|
|
223
|
+
</CardGroup>
|
|
224
|
+
|
|
225
|
+
With caching + parallelization:
|
|
226
|
+
```
|
|
227
|
+
✅ Cache-accelerated parallel execution:
|
|
228
|
+
Total: 15s (6x faster than sequential, no cache)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## Cache Persistence
|
|
232
|
+
|
|
233
|
+
Cache entries are stored server-side with intelligent expiration:
|
|
234
|
+
|
|
235
|
+
| Property | Value |
|
|
236
|
+
|----------|-------|
|
|
237
|
+
| **Location** | Server (MongoDB + S3) |
|
|
238
|
+
| **Persistence** | 7 days rolling window |
|
|
239
|
+
| **Scope** | Per-team, per-test-file |
|
|
240
|
+
| **Matching** | Screenshot similarity + prompt + OS |
|
|
241
|
+
| **Invalidation** | Automatic on file changes |
|
|
242
|
+
|
|
243
|
+
The cache automatically invalidates when your test code changes, ensuring accuracy while maximizing performance.
|
|
244
|
+
|
|
245
|
+
## Cache Analytics
|
|
246
|
+
|
|
247
|
+
View cache performance in the TestDriver console:
|
|
248
|
+
|
|
249
|
+
<Steps>
|
|
250
|
+
<Step title="Access Console">
|
|
251
|
+
Visit [console.testdriver.ai](https://console.testdriver.ai)
|
|
252
|
+
</Step>
|
|
253
|
+
|
|
254
|
+
<Step title="View Cache Metrics">
|
|
255
|
+
See detailed cache statistics:
|
|
256
|
+
- Cache hit rate per test
|
|
257
|
+
- Most frequently cached selectors
|
|
258
|
+
- Cache age distribution
|
|
259
|
+
- Cost savings from caching
|
|
260
|
+
</Step>
|
|
261
|
+
|
|
262
|
+
<Step title="Manage Cache">
|
|
263
|
+
Delete stale entries or clear cache for specific tests.
|
|
264
|
+
</Step>
|
|
265
|
+
</Steps>
|
|
266
|
+
|
|
267
|
+
## Performance Best Practices
|
|
268
|
+
|
|
269
|
+
<AccordionGroup>
|
|
270
|
+
<Accordion title="1. Use Consistent Prompts">
|
|
271
|
+
```javascript
|
|
272
|
+
// ✅ Good - consistent wording
|
|
273
|
+
await testdriver.find('submit button');
|
|
274
|
+
await testdriver.find('submit button'); // Cache hit
|
|
275
|
+
|
|
276
|
+
// ❌ Bad - different wording
|
|
277
|
+
await testdriver.find('submit button');
|
|
278
|
+
await testdriver.find('the submit button'); // Cache miss
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
Cache matching is prompt-specific. Use the exact same description for maximum cache hits.
|
|
282
|
+
</Accordion>
|
|
283
|
+
|
|
284
|
+
<Accordion title="2. Choose Appropriate Thresholds">
|
|
285
|
+
```javascript
|
|
286
|
+
// Stable elements: strict threshold
|
|
287
|
+
await testdriver.find('navigation logo', {
|
|
288
|
+
cacheThreshold: 0.01
|
|
289
|
+
});
|
|
290
|
+
|
|
291
|
+
// Dynamic elements: lenient threshold
|
|
292
|
+
await testdriver.find('live feed item', {
|
|
293
|
+
cacheThreshold: 0.10
|
|
294
|
+
});
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Match your threshold to element stability.
|
|
298
|
+
</Accordion>
|
|
299
|
+
|
|
300
|
+
<Accordion title="3. Leverage Automatic Cache Keys">
|
|
301
|
+
```javascript
|
|
302
|
+
// ✅ Recommended - per-file automatic caching
|
|
303
|
+
await testdriver.find('button');
|
|
304
|
+
|
|
305
|
+
// ⚠️ Advanced - custom cache key for shared cache
|
|
306
|
+
await testdriver.find('button', {
|
|
307
|
+
cacheKey: 'global-buttons'
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Automatic file-based cache keys prevent cross-test issues while enabling caching.
|
|
312
|
+
</Accordion>
|
|
313
|
+
|
|
314
|
+
<Accordion title="4. Monitor Cache Hit Rates">
|
|
315
|
+
```javascript
|
|
316
|
+
test('track cache performance', async (context) => {
|
|
317
|
+
const { testdriver } = await chrome(context, { url });
|
|
318
|
+
|
|
319
|
+
let cacheHits = 0;
|
|
320
|
+
let cacheMisses = 0;
|
|
321
|
+
|
|
322
|
+
const selectors = ['button 1', 'button 2', 'button 3'];
|
|
323
|
+
|
|
324
|
+
for (const selector of selectors) {
|
|
325
|
+
const element = await testdriver.find(selector);
|
|
326
|
+
if (element.cacheHit) cacheHits++;
|
|
327
|
+
else cacheMisses++;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
console.log(`Cache hit rate: ${(cacheHits / selectors.length * 100).toFixed(0)}%`);
|
|
331
|
+
});
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
Track your cache hit rates to optimize threshold settings.
|
|
335
|
+
</Accordion>
|
|
336
|
+
</AccordionGroup>
|
|
337
|
+
|
|
338
|
+
## Real-World Performance
|
|
339
|
+
|
|
340
|
+
Here's a real test suite performance comparison:
|
|
341
|
+
|
|
342
|
+
<CodeGroup>
|
|
343
|
+
```bash No Caching
|
|
344
|
+
$ npx vitest run
|
|
345
|
+
|
|
346
|
+
✓ test/login.test.js (3 tests) 87.4s
|
|
347
|
+
✓ test/checkout.test.js (5 tests) 142.6s
|
|
348
|
+
✓ test/profile.test.js (4 tests) 98.2s
|
|
349
|
+
|
|
350
|
+
Test Files: 3 passed (3)
|
|
351
|
+
Tests: 12 passed (12)
|
|
352
|
+
Duration: 328.2s
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
```bash With Caching
|
|
356
|
+
$ npx vitest run
|
|
357
|
+
|
|
358
|
+
✓ test/login.test.js (3 tests) 31.2s [cache: 92%]
|
|
359
|
+
✓ test/checkout.test.js (5 tests) 58.7s [cache: 87%]
|
|
360
|
+
✓ test/profile.test.js (4 tests) 35.1s [cache: 94%]
|
|
361
|
+
|
|
362
|
+
Test Files: 3 passed (3)
|
|
363
|
+
Tests: 12 passed (12)
|
|
364
|
+
Duration: 125.0s (2.6x faster ⚡)
|
|
365
|
+
```
|
|
366
|
+
</CodeGroup>
|
|
367
|
+
|
|
368
|
+
<Check>
|
|
369
|
+
**Performance improvement: 2.6x faster** with an average 91% cache hit rate across all tests.
|
|
370
|
+
</Check>
|
|
371
|
+
|
|
372
|
+
## Advanced: Custom Cache Configuration
|
|
373
|
+
|
|
374
|
+
For advanced use cases, configure caching globally:
|
|
375
|
+
|
|
376
|
+
```javascript
|
|
377
|
+
import { TestDriver } from 'testdriverai';
|
|
378
|
+
|
|
379
|
+
const testdriver = new TestDriver({
|
|
380
|
+
apiKey: process.env.TD_API_KEY,
|
|
381
|
+
cacheKey: 'my-test-suite',
|
|
382
|
+
cacheDefaults: {
|
|
383
|
+
threshold: 0.05, // 95% similarity
|
|
384
|
+
enabled: true,
|
|
385
|
+
ttl: 604800, // 7 days (in seconds)
|
|
386
|
+
}
|
|
387
|
+
});
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
## Learn More
|
|
391
|
+
|
|
392
|
+
<CardGroup cols={2}>
|
|
393
|
+
<Card
|
|
394
|
+
title="Selector Caching Guide"
|
|
395
|
+
icon="crosshairs"
|
|
396
|
+
href="/v7/guides/caching-selectors"
|
|
397
|
+
>
|
|
398
|
+
Deep dive into caching strategies
|
|
399
|
+
</Card>
|
|
400
|
+
|
|
401
|
+
<Card
|
|
402
|
+
title="AI Prompt Caching"
|
|
403
|
+
icon="brain"
|
|
404
|
+
href="/v7/guides/caching-ai"
|
|
405
|
+
>
|
|
406
|
+
Cache AI-generated test code
|
|
407
|
+
</Card>
|
|
408
|
+
|
|
409
|
+
<Card
|
|
410
|
+
title="Performance Guide"
|
|
411
|
+
icon="gauge-high"
|
|
412
|
+
href="/v7/guides/performance"
|
|
413
|
+
>
|
|
414
|
+
Optimize test suite performance
|
|
415
|
+
</Card>
|
|
416
|
+
|
|
417
|
+
<Card
|
|
418
|
+
title="Console Dashboard"
|
|
419
|
+
icon="chart-simple"
|
|
420
|
+
href="https://console.testdriver.ai"
|
|
421
|
+
>
|
|
422
|
+
View cache analytics
|
|
423
|
+
</Card>
|
|
424
|
+
</CardGroup>
|