testdriverai 6.2.2 → 7.0.0

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 (264) hide show
  1. package/.github/workflows/acceptance-linux.yml +75 -0
  2. package/.github/workflows/acceptance-sdk-tests.yml +133 -0
  3. package/.vscode/settings.json +5 -1
  4. package/MIGRATION.md +389 -0
  5. package/PLUGIN_MIGRATION.md +222 -0
  6. package/PROMPT_CACHE.md +200 -0
  7. package/SDK_LOGGING.md +222 -0
  8. package/SDK_MIGRATION.md +474 -0
  9. package/SDK_README.md +1122 -0
  10. package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
  11. package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
  12. package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
  13. package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
  14. package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
  15. package/_testdriver/lifecycle/prerun.yaml +15 -0
  16. package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
  17. package/agent/index.js +258 -68
  18. package/agent/interface.js +15 -0
  19. package/agent/lib/cache.js +142 -0
  20. package/agent/lib/commander.js +1 -39
  21. package/agent/lib/commands.js +143 -188
  22. package/agent/lib/redraw.js +6 -3
  23. package/agent/lib/sandbox.js +19 -5
  24. package/agent/lib/sdk.js +1 -0
  25. package/agent/lib/system.js +0 -3
  26. package/agent/lib/validation.js +1 -7
  27. package/debug-locate-response.js +82 -0
  28. package/debug-screenshot-1763401388589.png +0 -0
  29. package/debugger/index.html +15 -4
  30. package/docs/ARCHITECTURE.md +424 -0
  31. package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
  32. package/docs/QUICK_START_TEST_RECORDING.md +215 -0
  33. package/docs/SDK_AWESOME_LOGS.md +468 -0
  34. package/docs/TEST_RECORDING.md +388 -0
  35. package/docs/docs.json +232 -152
  36. package/docs/sdk-browser-rendering.md +167 -0
  37. package/docs/v6/getting-started/self-hosting.mdx +407 -0
  38. package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
  39. package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
  40. package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
  41. package/docs/v6/overview/comparison.mdx +101 -0
  42. package/docs/v7/README.md +135 -0
  43. package/docs/v7/api/ai.mdx +205 -0
  44. package/docs/v7/api/assert.mdx +285 -0
  45. package/docs/v7/api/assertions.mdx +403 -0
  46. package/docs/v7/api/click.mdx +287 -0
  47. package/docs/v7/api/client.mdx +322 -0
  48. package/docs/v7/api/elements.mdx +479 -0
  49. package/docs/v7/api/exec.mdx +346 -0
  50. package/docs/v7/api/find.mdx +316 -0
  51. package/docs/v7/api/focusApplication.mdx +294 -0
  52. package/docs/v7/api/hover.mdx +279 -0
  53. package/docs/v7/api/pressKeys.mdx +349 -0
  54. package/docs/v7/api/sandbox.mdx +404 -0
  55. package/docs/v7/api/scroll.mdx +300 -0
  56. package/docs/v7/api/type.mdx +314 -0
  57. package/docs/v7/commands/assert.mdx +45 -0
  58. package/docs/v7/commands/exec.mdx +282 -0
  59. package/docs/v7/commands/focus-application.mdx +44 -0
  60. package/docs/v7/commands/hover-image.mdx +69 -0
  61. package/docs/v7/commands/hover-text.mdx +47 -0
  62. package/docs/v7/commands/if.mdx +53 -0
  63. package/docs/v7/commands/match-image.mdx +67 -0
  64. package/docs/v7/commands/press-keys.mdx +87 -0
  65. package/docs/v7/commands/remember.mdx +49 -0
  66. package/docs/v7/commands/run.mdx +44 -0
  67. package/docs/v7/commands/scroll-until-image.mdx +66 -0
  68. package/docs/v7/commands/scroll-until-text.mdx +60 -0
  69. package/docs/v7/commands/scroll.mdx +69 -0
  70. package/docs/v7/commands/type.mdx +45 -0
  71. package/docs/v7/commands/wait-for-image.mdx +54 -0
  72. package/docs/v7/commands/wait-for-text.mdx +48 -0
  73. package/docs/v7/commands/wait.mdx +45 -0
  74. package/docs/v7/getting-started/quickstart.mdx +199 -0
  75. package/docs/v7/guides/migration.mdx +562 -0
  76. package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
  77. package/docs/v7/playwright.mdx +342 -0
  78. package/eslint.config.js +19 -1
  79. package/examples/run-tests-with-recording.sh +70 -0
  80. package/examples/screenshot-example.js +63 -0
  81. package/examples/sdk-awesome-logs-demo.js +177 -0
  82. package/examples/sdk-cache-thresholds.js +96 -0
  83. package/examples/sdk-element-properties.js +155 -0
  84. package/examples/sdk-simple-example.js +65 -0
  85. package/examples/test-recording-example.test.js +166 -0
  86. package/interfaces/cli/lib/base.js +10 -4
  87. package/interfaces/logger.js +2 -1
  88. package/interfaces/shared-test-state.mjs +69 -0
  89. package/interfaces/vitest-plugin.mjs +744 -0
  90. package/mcp-server/AI_GUIDELINES.md +57 -0
  91. package/package.json +18 -5
  92. package/schema.json +8 -29
  93. package/scripts/view-test-results.mjs +96 -0
  94. package/sdk-log-formatter.js +714 -0
  95. package/sdk.d.ts +735 -0
  96. package/sdk.js +1906 -0
  97. package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
  98. package/setup/aws/cloudformation.yaml +9 -2
  99. package/test/mcp-example-test.yaml +27 -0
  100. package/test-find-api.js +73 -0
  101. package/test-prompt-cache.js +96 -0
  102. package/test-sandbox-render.js +28 -0
  103. package/test-sdk-methods.js +15 -0
  104. package/test-sdk-refactor.js +53 -0
  105. package/test-stack-trace.mjs +57 -0
  106. package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
  107. package/testdriver/acceptance-sdk/README.md +128 -0
  108. package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
  109. package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
  110. package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
  111. package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
  112. package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
  113. package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
  114. package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
  115. package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
  116. package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
  117. package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
  118. package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
  119. package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
  120. package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
  121. package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
  122. package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
  123. package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
  124. package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
  125. package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
  126. package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
  127. package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
  128. package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
  129. package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
  130. package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
  131. package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
  132. package/testdriver/acceptance-sdk/type.test.mjs +84 -0
  133. package/verify-element-api.js +89 -0
  134. package/verify-types.js +0 -0
  135. package/vitest.config.example.js +19 -0
  136. package/vitest.config.mjs +65 -0
  137. package/vitest.config.mjs.bak +44 -0
  138. package/.github/workflows/acceptance-v6.yml +0 -169
  139. package/docs/overview/comparison.mdx +0 -82
  140. package/testdriver/lifecycle/prerun.yaml +0 -17
  141. /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
  142. /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
  143. /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
  144. /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
  145. /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
  146. /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
  147. /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
  148. /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
  149. /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
  150. /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
  151. /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
  152. /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
  153. /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
  154. /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
  155. /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
  156. /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
  157. /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
  158. /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
  159. /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
  160. /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
  161. /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
  162. /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
  163. /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
  164. /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
  165. /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
  166. /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
  167. /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
  168. /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
  169. /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
  170. /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
  171. /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
  172. /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
  173. /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
  174. /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
  175. /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
  176. /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
  177. /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
  178. /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
  179. /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
  180. /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
  181. /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
  182. /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
  183. /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
  184. /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
  185. /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
  186. /package/docs/{account → v6/account}/dashboard.mdx +0 -0
  187. /package/docs/{account → v6/account}/enterprise.mdx +0 -0
  188. /package/docs/{account → v6/account}/pricing.mdx +0 -0
  189. /package/docs/{account → v6/account}/projects.mdx +0 -0
  190. /package/docs/{account → v6/account}/team.mdx +0 -0
  191. /package/docs/{action → v6/action}/ami.mdx +0 -0
  192. /package/docs/{action → v6/action}/performance.mdx +0 -0
  193. /package/docs/{action → v6/action}/secrets.mdx +0 -0
  194. /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
  195. /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
  196. /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
  197. /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
  198. /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
  199. /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
  200. /package/docs/{cli → v6/cli}/overview.mdx +0 -0
  201. /package/docs/{commands → v6/commands}/assert.mdx +0 -0
  202. /package/docs/{commands → v6/commands}/exec.mdx +0 -0
  203. /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
  204. /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
  205. /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
  206. /package/docs/{commands → v6/commands}/if.mdx +0 -0
  207. /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
  208. /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
  209. /package/docs/{commands → v6/commands}/remember.mdx +0 -0
  210. /package/docs/{commands → v6/commands}/run.mdx +0 -0
  211. /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
  212. /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
  213. /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
  214. /package/docs/{commands → v6/commands}/type.mdx +0 -0
  215. /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
  216. /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
  217. /package/docs/{commands → v6/commands}/wait.mdx +0 -0
  218. /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
  219. /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
  220. /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
  221. /package/docs/{features → v6/features}/generation.mdx +0 -0
  222. /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
  223. /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
  224. /package/docs/{features → v6/features}/selectorless.mdx +0 -0
  225. /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
  226. /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
  227. /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
  228. /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
  229. /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
  230. /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
  231. /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
  232. /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
  233. /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
  234. /package/docs/{guide → v6/guide}/code.mdx +0 -0
  235. /package/docs/{guide → v6/guide}/locating.mdx +0 -0
  236. /package/docs/{guide → v6/guide}/protips.mdx +0 -0
  237. /package/docs/{guide → v6/guide}/variables.mdx +0 -0
  238. /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
  239. /package/docs/{importing → v6/importing}/csv.mdx +0 -0
  240. /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
  241. /package/docs/{importing → v6/importing}/jira.mdx +0 -0
  242. /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
  243. /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
  244. /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
  245. /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
  246. /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
  247. /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
  248. /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
  249. /package/docs/{overview → v6/overview}/faq.mdx +0 -0
  250. /package/docs/{overview → v6/overview}/performance.mdx +0 -0
  251. /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
  252. /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
  253. /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
  254. /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
  255. /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
  256. /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
  257. /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
  258. /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
  259. /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
  260. /package/docs/{security → v6/security}/action.mdx +0 -0
  261. /package/docs/{security → v6/security}/agent.mdx +0 -0
  262. /package/docs/{security → v6/security}/platform.mdx +0 -0
  263. /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
  264. /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
@@ -0,0 +1,54 @@
1
+ ---
2
+ title: "wait-for-image"
3
+ sidebarTitle: "wait-for-image"
4
+ description: "Wait until an image matching the description is detected on the screen."
5
+ icon: "clock-three-thirty"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/wait-for-image-replay.mdx";
10
+ import Example from "/snippets/tests/wait-for-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `wait-for-image` command waits until the specified image is detected on the screen. This is useful for ensuring that visual elements are present before proceeding with the next steps in a test.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-----------: | :-------: | :---------------------------------------------------------------------------------------------------------------- |
23
+ | `description` | `string` | A description of the image. |
24
+ | `timeout` | `number` | (Optional) The duration in milliseconds to wait for the image to appear. Default is `10000` (10 seconds). |
25
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will wait until the specified image is NOT detected. Default is `false`. |
26
+
27
+ ## Example usage
28
+
29
+ ```yaml
30
+ command: wait-for-image
31
+ description: trash icon
32
+ timeout: 5000
33
+ ```
34
+
35
+ ## Protips
36
+
37
+ - Use clear and concise descriptions for the image to improve detection accuracy.
38
+ - Adjust the `timeout` value based on the expected load time of the image to avoid unnecessary delays.
39
+
40
+ <Tip>
41
+ If you are unable to land on an accurate description or experiencing flaky
42
+ results, try to upload the image to [chatgpt](https://chatgpt.com) and ask it
43
+ to describe the image and use the generated `description` to get better
44
+ accuracy and determinism.
45
+ </Tip>
46
+
47
+ ## Gotchas
48
+
49
+ - If the image doesn't appear within the specified `timeout`, the command will fail.
50
+ - Ensure the description accurately represents the image to avoid detection issues.
51
+
52
+ ---
53
+
54
+ The `wait-for-image` command is ideal for synchronizing tests with visual elements that may take time to load.
@@ -0,0 +1,48 @@
1
+ ---
2
+ title: "wait-for-text"
3
+ sidebarTitle: "wait-for-text"
4
+ description: "Wait until the specified text is detected on the screen."
5
+ icon: "clock-nine"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/wait-for-text-replay.mdx";
10
+ import Example from "/snippets/tests/wait-for-text-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `wait-for-text` command waits until the specified text is detected on the screen. This is useful for ensuring that textual elements are present before proceeding with the next steps in a test.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-------: | :-------: | :--------------------------------------------------------------------------------------------------------------- |
23
+ | `text` | `string` | The text to find on the screen. |
24
+ | `timeout` | `number` | (Optional) The duration in milliseconds to wait for the text to appear. Default is `5000` (5 seconds). |
25
+ | `method` | `enum` | (Optional) The matching algorithm to use. Possible values are `ai` and `turbo`. Default is `turbo` |
26
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will wait until the specified text is NOT detected. Default is `false`. |
27
+
28
+ ## Example usage
29
+
30
+ ```yaml
31
+ command: wait-for-text
32
+ text: Copyright 2024
33
+ timeout: 5000
34
+ ```
35
+
36
+ ## Protips
37
+
38
+ - Use unique and specific text to improve detection accuracy.
39
+ - Adjust the `timeout` value based on the expected load time of the text to avoid unnecessary delays.
40
+
41
+ ## Gotchas
42
+
43
+ - If the text doesn't appear within the specified `timeout`, the command will fail.
44
+ - Ensure the text matches exactly, as variations in font size, style, or screen resolution may affect detection accuracy.
45
+
46
+ ---
47
+
48
+ The `wait-for-text` command is ideal for synchronizing tests with textual elements that may take time to load.
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: "wait"
3
+ sidebarTitle: "wait"
4
+ description: "Pause the execution of the script for a specified duration."
5
+ icon: "clock"
6
+ "mode": "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/wait-replay.mdx";
10
+ import Example from "/snippets/tests/wait-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `wait` command pauses the execution of the script for a specified number of milliseconds before continuing. This is useful for adding delays between commands or waiting for certain conditions to stabilize.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | --------- | -------- | ------------------------------------- |
23
+ | `timeout` | `number` | The duration in milliseconds to wait. |
24
+
25
+ ## Example usage
26
+
27
+ ```yaml
28
+ command: wait
29
+ timeout: 5000
30
+ ```
31
+
32
+ ## Protips
33
+
34
+ - Use the `wait` command to handle timing issues, such as waiting for animations to complete or elements to load.
35
+ - Avoid using excessively long timeouts to keep tests efficient.
36
+
37
+ ## Gotchas
38
+
39
+ - Overusing the `wait` command can slow down test execution. Use it only when necessary.
40
+ - Ensure the timeout value is appropriate for the scenario to avoid unnecessary delays.
41
+
42
+ ## Notes
43
+
44
+ - The `wait` command is ideal for introducing controlled pauses in your test scripts.
45
+ - Whenever you are waiting for something to load, use the [wait-for-text](/commands/wait-for-text) or [wait-for-image](/commands/wait-for-image) commands instead to make the test more efficient.
@@ -0,0 +1,199 @@
1
+ ---
2
+ title: "SDK Quickstart"
3
+ sidebarTitle: "Quickstart"
4
+ description: "Get started with the TestDriver JavaScript SDK in minutes."
5
+ icon: "gauge-high"
6
+ mode: "wide"
7
+ ---
8
+
9
+ TestDriver v7 introduces a powerful JavaScript SDK that lets you write tests in JavaScript/TypeScript instead of YAML. This gives you full programmatic control over your tests with IDE autocomplete, type safety, and all the benefits of modern development tooling.
10
+
11
+ <Steps>
12
+ <Step title="Create a TestDriver Account">
13
+
14
+ You will need a [TestDriver Pro](https://app.testdriver.ai/team) account ($20/month) to get an API key.
15
+
16
+ <Card
17
+ title="Sign Up for TestDriver"
18
+ icon="user-plus"
19
+ href="https://app.testdriver.ai/team"
20
+ />
21
+
22
+ </Step>
23
+
24
+ <Step title="Install TestDriver SDK">
25
+
26
+ Install the TestDriver SDK package in your project:
27
+
28
+ ```bash
29
+ npm install testdriverai
30
+ ```
31
+
32
+ Or using other package managers:
33
+
34
+ <Tabs>
35
+ <Tab title="npm">
36
+ ```bash
37
+ npm install testdriverai
38
+ ```
39
+ </Tab>
40
+ <Tab title="yarn">
41
+ ```bash
42
+ yarn add testdriverai
43
+ ```
44
+ </Tab>
45
+ <Tab title="pnpm">
46
+ ```bash
47
+ pnpm add testdriverai
48
+ ```
49
+ </Tab>
50
+ </Tabs>
51
+
52
+ </Step>
53
+
54
+ <Step title="Set up your environment">
55
+
56
+ Copy your API key from [the TestDriver dashboard](https://app.testdriver.ai/team), and set it as an environment variable.
57
+
58
+ <Tabs>
59
+ <Tab title="macOS / Linux">
60
+ ```bash
61
+ export TD_API_KEY="your_api_key_here"
62
+ ```
63
+ </Tab>
64
+ <Tab title="Windows (PowerShell)">
65
+ ```powershell
66
+ $env:TD_API_KEY="your_api_key_here"
67
+ ```
68
+ </Tab>
69
+ <Tab title="Windows (CMD)">
70
+ ```cmd
71
+ set TD_API_KEY=your_api_key_here
72
+ ```
73
+ </Tab>
74
+ </Tabs>
75
+
76
+ </Step>
77
+
78
+ <Step title="Write your first test">
79
+
80
+ Create a new test file (e.g., `login.test.mjs`):
81
+
82
+ ```javascript login.test.mjs
83
+ import { beforeAll, afterAll, describe, it, expect } from 'vitest';
84
+ import TestDriver from 'testdriverai';
85
+
86
+ describe('Login Test', () => {
87
+ let testdriver;
88
+
89
+ beforeAll(async () => {
90
+ // Create a new TestDriver client
91
+ client = new TestDriver(process.env.TD_API_KEY, {
92
+ os: 'windows', // 'windows' or 'linux'
93
+ resolution: '1366x768'
94
+ });
95
+
96
+ // Authenticate and connect to a sandbox
97
+ await testdriver.auth();
98
+ await testdriver.connect({ newSandbox: true });
99
+ });
100
+
101
+ afterAll(async () => {
102
+ // Clean up after tests
103
+ await testdriver.disconnect();
104
+ });
105
+
106
+ it('should verify the login page is displayed', async () => {
107
+ // Use AI to assert the login page is visible
108
+ const result = await testdriver.assert('the TestDriver.ai Sandbox login page is displayed');
109
+ expect(result).toBeTruthy();
110
+ });
111
+
112
+ it('should enter username and password', async () => {
113
+ // Focus the browser
114
+ await testdriver.focusApplication('Google Chrome');
115
+
116
+ // Find and click the username field
117
+ const usernameField = await testdriver.find('Username input field');
118
+ await usernameField.click();
119
+ await testdriver.type('standard_user');
120
+
121
+ // Tab to password field and enter password
122
+ await testdriver.pressKeys(['tab']);
123
+ await testdriver.type('secret_sauce');
124
+
125
+ // Verify the credentials were entered
126
+ const result = await testdriver.assert('username field contains "standard_user"');
127
+ expect(result).toBeTruthy();
128
+ });
129
+ });
130
+ ```
131
+
132
+ </Step>
133
+
134
+ <Step title="Run your test">
135
+
136
+ Run your test using Vitest (or your preferred test runner):
137
+
138
+ ```bash
139
+ npx vitest run login.test.mjs
140
+ ```
141
+
142
+ TestDriver will:
143
+ 1. Authenticate with the API
144
+ 2. Spin up a virtual machine sandbox
145
+ 3. Execute your test steps
146
+ 4. Return results to your test runner
147
+
148
+ <Tip>
149
+ The SDK automatically connects to TestDriver's cloud infrastructure. You can also [self-host](/getting-started/self-hosting) the sandbox environment.
150
+ </Tip>
151
+
152
+ </Step>
153
+ </Steps>
154
+
155
+ ## Next Steps
156
+
157
+ <CardGroup cols={2}>
158
+ <Card
159
+ title="API Reference"
160
+ icon="book"
161
+ href="/v7/api/client"
162
+ >
163
+ Explore all available SDK methods and options
164
+ </Card>
165
+
166
+ <Card
167
+ title="Element Finding"
168
+ icon="search"
169
+ href="/v7/api/elements"
170
+ >
171
+ Learn how to locate and interact with UI elements
172
+ </Card>
173
+
174
+ <Card
175
+ title="Sandbox Management"
176
+ icon="server"
177
+ href="/v7/api/sandbox"
178
+ >
179
+ Manage sandbox lifecycle and connections
180
+ </Card>
181
+
182
+ <Card
183
+ title="Assertions & Testing"
184
+ icon="check"
185
+ href="/v7/api/assertions"
186
+ >
187
+ Use AI-powered assertions in your tests
188
+ </Card>
189
+ </CardGroup>
190
+
191
+ ## Key Differences from v6
192
+
193
+ The v7 SDK offers several advantages over the YAML-based approach:
194
+
195
+ - **Type Safety**: Full TypeScript support with IntelliSense
196
+ - **Programmatic Control**: Use variables, loops, and functions
197
+ - **Better Debugging**: Stack traces point to your actual code
198
+ - **Integration**: Works with any JavaScript test framework (Vitest, Jest, Mocha, etc.)
199
+ - **Flexibility**: Combine TestDriver with other testing tools seamlessly