testdriverai 7.0.0 → 7.1.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.
Files changed (324) hide show
  1. package/.env.example +2 -0
  2. package/.github/workflows/linux-tests.yml +28 -0
  3. package/README.md +126 -0
  4. package/agent/index.js +7 -9
  5. package/agent/interface.js +13 -2
  6. package/agent/lib/commands.js +795 -136
  7. package/agent/lib/redraw.js +124 -39
  8. package/agent/lib/sandbox.js +40 -3
  9. package/agent/lib/sdk.js +21 -0
  10. package/agent/lib/valid-version.js +2 -2
  11. package/debugger/index.html +1 -1
  12. package/docs/docs.json +86 -71
  13. package/docs/guide/best-practices-polling.mdx +154 -0
  14. package/docs/v6/getting-started/self-hosting.mdx +3 -2
  15. package/docs/v7/_drafts/agents.mdx +852 -0
  16. package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
  17. package/docs/v7/_drafts/best-practices.mdx +486 -0
  18. package/docs/v7/_drafts/caching-ai.mdx +215 -0
  19. package/docs/v7/_drafts/caching-selectors.mdx +400 -0
  20. package/docs/v7/_drafts/caching.mdx +366 -0
  21. package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
  22. package/docs/v7/_drafts/core.mdx +459 -0
  23. package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
  24. package/docs/v7/_drafts/debugging.mdx +349 -0
  25. package/docs/v7/_drafts/error-handling.mdx +501 -0
  26. package/docs/v7/_drafts/faq.mdx +393 -0
  27. package/docs/v7/_drafts/hooks.mdx +360 -0
  28. package/docs/v7/_drafts/implementation-plan.mdx +994 -0
  29. package/docs/v7/_drafts/init-command.mdx +95 -0
  30. package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
  31. package/docs/v7/_drafts/performance.mdx +517 -0
  32. package/docs/v7/_drafts/presets.mdx +210 -0
  33. package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
  34. package/docs/v7/_drafts/provision.mdx +266 -0
  35. package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
  36. package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
  37. package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
  38. package/docs/v7/_drafts/troubleshooting.mdx +526 -0
  39. package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
  40. package/docs/v7/_drafts/vitest.mdx +535 -0
  41. package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
  42. package/docs/v7/api/client.mdx +1 -1
  43. package/docs/v7/api/dashcam.mdx +497 -0
  44. package/docs/v7/api/doubleClick.mdx +102 -0
  45. package/docs/v7/api/elements.mdx +143 -41
  46. package/docs/v7/api/find.mdx +258 -0
  47. package/docs/v7/api/mouseDown.mdx +161 -0
  48. package/docs/v7/api/mouseUp.mdx +164 -0
  49. package/docs/v7/api/rightClick.mdx +123 -0
  50. package/docs/v7/api/type.mdx +51 -7
  51. package/docs/v7/features/ai-native.mdx +427 -0
  52. package/docs/v7/features/easy-to-write.mdx +351 -0
  53. package/docs/v7/features/enterprise.mdx +540 -0
  54. package/docs/v7/features/fast.mdx +424 -0
  55. package/docs/v7/features/observable.mdx +623 -0
  56. package/docs/v7/features/powerful.mdx +531 -0
  57. package/docs/v7/features/scalable.mdx +417 -0
  58. package/docs/v7/features/stable.mdx +514 -0
  59. package/docs/v7/getting-started/configuration.mdx +380 -0
  60. package/docs/v7/getting-started/generating-tests.mdx +525 -0
  61. package/docs/v7/getting-started/installation.mdx +486 -0
  62. package/docs/v7/getting-started/quickstart.mdx +320 -141
  63. package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
  64. package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
  65. package/docs/v7/getting-started/writing-tests.mdx +535 -0
  66. package/docs/v7/overview/what-is-testdriver.mdx +398 -0
  67. package/docs/v7/platforms/linux.mdx +308 -0
  68. package/docs/v7/platforms/macos.mdx +433 -0
  69. package/docs/v7/platforms/windows.mdx +430 -0
  70. package/docs/v7/playwright.mdx +3 -3
  71. package/docs/v7/presets/chrome-extension.mdx +223 -0
  72. package/docs/v7/presets/chrome.mdx +303 -0
  73. package/docs/v7/presets/electron.mdx +453 -0
  74. package/docs/v7/presets/vscode.mdx +417 -0
  75. package/docs/v7/presets/webapp.mdx +396 -0
  76. package/examples/run-tests-with-recording.sh +2 -2
  77. package/interfaces/cli/commands/init.js +358 -0
  78. package/interfaces/vitest-plugin.mjs +393 -103
  79. package/lib/core/Dashcam.js +506 -0
  80. package/lib/core/index.d.ts +150 -0
  81. package/lib/core/index.js +12 -0
  82. package/lib/presets/index.mjs +331 -0
  83. package/lib/vitest/hooks.d.ts +119 -0
  84. package/lib/vitest/hooks.mjs +316 -0
  85. package/lib/vitest/setup.mjs +44 -0
  86. package/package.json +13 -3
  87. package/sdk.d.ts +350 -44
  88. package/sdk.js +818 -105
  89. package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
  90. package/test/manual/test-console-logs.test.mjs +42 -0
  91. package/test/manual/test-init.sh +54 -0
  92. package/test/manual/test-provision-auth.mjs +22 -0
  93. package/test/testdriver/assert.test.mjs +41 -0
  94. package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
  95. package/test/testdriver/chrome-extension.test.mjs +89 -0
  96. package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
  97. package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
  98. package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
  99. package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
  100. package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
  101. package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
  102. package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
  103. package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
  104. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
  105. package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
  106. package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
  107. package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
  108. package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
  109. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
  110. package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
  111. package/test/testdriver/scroll-until-text.test.mjs +28 -0
  112. package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
  113. package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
  114. package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
  115. package/test/testdriver/type.test.mjs +45 -0
  116. package/vitest.config.mjs +11 -56
  117. package/.github/dependabot.yml +0 -11
  118. package/.github/workflows/acceptance-linux.yml +0 -75
  119. package/.github/workflows/acceptance-sdk-tests.yml +0 -133
  120. package/.github/workflows/acceptance-tests.yml +0 -130
  121. package/.github/workflows/lint.yml +0 -27
  122. package/.github/workflows/publish-canary.yml +0 -40
  123. package/.github/workflows/publish-latest.yml +0 -61
  124. package/.github/workflows/test-install.yml +0 -29
  125. package/.vscode/extensions.json +0 -3
  126. package/.vscode/launch.json +0 -22
  127. package/.vscode/mcp.json +0 -9
  128. package/.vscode/settings.json +0 -14
  129. package/CODEOWNERS +0 -3
  130. package/MIGRATION.md +0 -389
  131. package/SDK_README.md +0 -1122
  132. package/_testdriver/acceptance/assert.yaml +0 -7
  133. package/_testdriver/acceptance/dashcam.yaml +0 -9
  134. package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
  135. package/_testdriver/acceptance/embed.yaml +0 -9
  136. package/_testdriver/acceptance/exec-js.yaml +0 -29
  137. package/_testdriver/acceptance/exec-output.yaml +0 -43
  138. package/_testdriver/acceptance/exec-shell.yaml +0 -40
  139. package/_testdriver/acceptance/focus-window.yaml +0 -16
  140. package/_testdriver/acceptance/hover-image.yaml +0 -18
  141. package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
  142. package/_testdriver/acceptance/hover-text.yaml +0 -14
  143. package/_testdriver/acceptance/if-else.yaml +0 -31
  144. package/_testdriver/acceptance/match-image.yaml +0 -15
  145. package/_testdriver/acceptance/press-keys.yaml +0 -35
  146. package/_testdriver/acceptance/prompt.yaml +0 -11
  147. package/_testdriver/acceptance/remember.yaml +0 -27
  148. package/_testdriver/acceptance/screenshots/cart.png +0 -0
  149. package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
  150. package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
  151. package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
  152. package/_testdriver/acceptance/scroll.yaml +0 -33
  153. package/_testdriver/acceptance/snippets/login.yaml +0 -29
  154. package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
  155. package/_testdriver/acceptance/type.yaml +0 -29
  156. package/_testdriver/behavior/failure.yaml +0 -7
  157. package/_testdriver/behavior/hover-text.yaml +0 -13
  158. package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
  159. package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
  160. package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
  161. package/_testdriver/behavior/secrets.yaml +0 -7
  162. package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
  163. package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
  164. package/_testdriver/edge-cases/js-exception.yaml +0 -8
  165. package/_testdriver/edge-cases/js-promise.yaml +0 -19
  166. package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  167. package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
  168. package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
  169. package/_testdriver/edge-cases/success-test.yaml +0 -9
  170. package/_testdriver/examples/android/example.yaml +0 -12
  171. package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
  172. package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
  173. package/_testdriver/examples/android/readme.md +0 -7
  174. package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
  175. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  176. package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
  177. package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
  178. package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  179. package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
  180. package/_testdriver/lifecycle/postrun.yaml +0 -8
  181. package/_testdriver/lifecycle/prerun.yaml +0 -15
  182. package/_testdriver/lifecycle/provision.yaml +0 -25
  183. package/debug-screenshot-1763401388589.png +0 -0
  184. package/mcp-server/AI_GUIDELINES.md +0 -57
  185. package/scripts/view-test-results.mjs +0 -96
  186. package/styles/.vale-config/2-MDX.ini +0 -5
  187. package/styles/Microsoft/AMPM.yml +0 -9
  188. package/styles/Microsoft/Accessibility.yml +0 -30
  189. package/styles/Microsoft/Acronyms.yml +0 -64
  190. package/styles/Microsoft/Adverbs.yml +0 -272
  191. package/styles/Microsoft/Auto.yml +0 -11
  192. package/styles/Microsoft/Avoid.yml +0 -14
  193. package/styles/Microsoft/Contractions.yml +0 -50
  194. package/styles/Microsoft/Dashes.yml +0 -13
  195. package/styles/Microsoft/DateFormat.yml +0 -8
  196. package/styles/Microsoft/DateNumbers.yml +0 -40
  197. package/styles/Microsoft/DateOrder.yml +0 -8
  198. package/styles/Microsoft/Ellipses.yml +0 -9
  199. package/styles/Microsoft/FirstPerson.yml +0 -16
  200. package/styles/Microsoft/Foreign.yml +0 -13
  201. package/styles/Microsoft/Gender.yml +0 -8
  202. package/styles/Microsoft/GenderBias.yml +0 -42
  203. package/styles/Microsoft/GeneralURL.yml +0 -11
  204. package/styles/Microsoft/HeadingAcronyms.yml +0 -7
  205. package/styles/Microsoft/HeadingColons.yml +0 -8
  206. package/styles/Microsoft/HeadingPunctuation.yml +0 -13
  207. package/styles/Microsoft/Headings.yml +0 -28
  208. package/styles/Microsoft/Hyphens.yml +0 -14
  209. package/styles/Microsoft/Negative.yml +0 -13
  210. package/styles/Microsoft/Ordinal.yml +0 -13
  211. package/styles/Microsoft/OxfordComma.yml +0 -8
  212. package/styles/Microsoft/Passive.yml +0 -183
  213. package/styles/Microsoft/Percentages.yml +0 -7
  214. package/styles/Microsoft/Plurals.yml +0 -7
  215. package/styles/Microsoft/Quotes.yml +0 -7
  216. package/styles/Microsoft/RangeTime.yml +0 -13
  217. package/styles/Microsoft/Semicolon.yml +0 -8
  218. package/styles/Microsoft/SentenceLength.yml +0 -6
  219. package/styles/Microsoft/Spacing.yml +0 -8
  220. package/styles/Microsoft/Suspended.yml +0 -7
  221. package/styles/Microsoft/Terms.yml +0 -42
  222. package/styles/Microsoft/URLFormat.yml +0 -9
  223. package/styles/Microsoft/Units.yml +0 -16
  224. package/styles/Microsoft/Vocab.yml +0 -25
  225. package/styles/Microsoft/We.yml +0 -11
  226. package/styles/Microsoft/Wordiness.yml +0 -127
  227. package/styles/Microsoft/meta.json +0 -4
  228. package/styles/alex/Ablist.yml +0 -274
  229. package/styles/alex/Condescending.yml +0 -16
  230. package/styles/alex/Gendered.yml +0 -110
  231. package/styles/alex/LGBTQ.yml +0 -55
  232. package/styles/alex/OCD.yml +0 -10
  233. package/styles/alex/Press.yml +0 -12
  234. package/styles/alex/ProfanityLikely.yml +0 -1289
  235. package/styles/alex/ProfanityMaybe.yml +0 -282
  236. package/styles/alex/ProfanityUnlikely.yml +0 -251
  237. package/styles/alex/README.md +0 -27
  238. package/styles/alex/Race.yml +0 -85
  239. package/styles/alex/Suicide.yml +0 -26
  240. package/styles/alex/meta.json +0 -4
  241. package/styles/config/vocabularies/Docs/accept.txt +0 -47
  242. package/styles/config/vocabularies/Docs/reject.txt +0 -4
  243. package/styles/proselint/Airlinese.yml +0 -8
  244. package/styles/proselint/AnimalLabels.yml +0 -48
  245. package/styles/proselint/Annotations.yml +0 -9
  246. package/styles/proselint/Apologizing.yml +0 -8
  247. package/styles/proselint/Archaisms.yml +0 -52
  248. package/styles/proselint/But.yml +0 -8
  249. package/styles/proselint/Cliches.yml +0 -782
  250. package/styles/proselint/CorporateSpeak.yml +0 -30
  251. package/styles/proselint/Currency.yml +0 -5
  252. package/styles/proselint/Cursing.yml +0 -15
  253. package/styles/proselint/DateCase.yml +0 -7
  254. package/styles/proselint/DateMidnight.yml +0 -7
  255. package/styles/proselint/DateRedundancy.yml +0 -10
  256. package/styles/proselint/DateSpacing.yml +0 -7
  257. package/styles/proselint/DenizenLabels.yml +0 -52
  258. package/styles/proselint/Diacritical.yml +0 -95
  259. package/styles/proselint/GenderBias.yml +0 -45
  260. package/styles/proselint/GroupTerms.yml +0 -39
  261. package/styles/proselint/Hedging.yml +0 -8
  262. package/styles/proselint/Hyperbole.yml +0 -6
  263. package/styles/proselint/Jargon.yml +0 -11
  264. package/styles/proselint/LGBTOffensive.yml +0 -13
  265. package/styles/proselint/LGBTTerms.yml +0 -15
  266. package/styles/proselint/Malapropisms.yml +0 -8
  267. package/styles/proselint/Needless.yml +0 -358
  268. package/styles/proselint/Nonwords.yml +0 -38
  269. package/styles/proselint/Oxymorons.yml +0 -22
  270. package/styles/proselint/P-Value.yml +0 -6
  271. package/styles/proselint/RASSyndrome.yml +0 -30
  272. package/styles/proselint/README.md +0 -12
  273. package/styles/proselint/Skunked.yml +0 -13
  274. package/styles/proselint/Spelling.yml +0 -17
  275. package/styles/proselint/Typography.yml +0 -11
  276. package/styles/proselint/Uncomparables.yml +0 -50
  277. package/styles/proselint/Very.yml +0 -6
  278. package/styles/proselint/meta.json +0 -15
  279. package/styles/write-good/Cliches.yml +0 -702
  280. package/styles/write-good/E-Prime.yml +0 -32
  281. package/styles/write-good/Illusions.yml +0 -11
  282. package/styles/write-good/Passive.yml +0 -183
  283. package/styles/write-good/README.md +0 -27
  284. package/styles/write-good/So.yml +0 -5
  285. package/styles/write-good/ThereIs.yml +0 -6
  286. package/styles/write-good/TooWordy.yml +0 -221
  287. package/styles/write-good/Weasel.yml +0 -29
  288. package/styles/write-good/meta.json +0 -4
  289. package/test/mcp-example-test.yaml +0 -27
  290. package/test/test_parser.js +0 -47
  291. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
  292. package/testdriver/acceptance-sdk/README.md +0 -128
  293. package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
  294. package/testdriver/acceptance-sdk/assert.test.mjs +0 -44
  295. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
  296. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
  297. package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
  298. package/testdriver/acceptance-sdk/type.test.mjs +0 -84
  299. package/vale.ini +0 -18
  300. package/vitest.config.example.js +0 -19
  301. package/vitest.config.mjs.bak +0 -44
  302. /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
  303. /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
  304. /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
  305. /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
  306. /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
  307. /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.mdx} +0 -0
  308. /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
  309. /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
  310. /package/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
  311. /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
  312. /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
  313. /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
  314. /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
  315. /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
  316. /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
  317. /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
  318. /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
  319. /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
  320. /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +0 -0
  321. /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
  322. /package/{verify-types.js → test/manual/verify-types.js} +0 -0
  323. /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
  324. /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>