testdriverai 6.2.1 → 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 +16 -5
  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,69 @@
1
+ ---
2
+ title: "hover-image"
3
+ sidebarTitle: "hover-image"
4
+ description: "Locate an image on the screen and perform an action."
5
+ icon: "image"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/hover-image-replay.mdx";
10
+ import Example from "/snippets/tests/hover-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `hover-image` command is used to locate an image on the screen based on a description and perform an action on it. This can include hovering, clicking, double-clicking or dragging the image.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `description` | `string` | A description of the image and what it represents. Don't include the image itself here. |
24
+ | `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for dragging images |
25
+
26
+ The `hover-image` command is useful for interacting with visual elements that can't be identified using text-based selectors.
27
+
28
+ ---
29
+
30
+ ## Drag functionality
31
+
32
+ - The `drag-start` and `drag-end` actions are used to drag an image to a specific location. `drag-start` could be the image (or inner text element, in which case using `hover-text` is preferred) to drag and `drag-end` is the location is supposed to be dragged to. This could be coupled with [`hover-text`](/commands/hover-text) or [`match-image`](/commands/match-image) or just `hover-image`.
33
+
34
+ ### Example: Drag and Drop to upload an image
35
+
36
+ ```yaml drag-and-drop.yaml
37
+ version: 6.0.0
38
+ steps:
39
+ - prompt: click on the image of a shopping cart
40
+ commands:
41
+ - command: hover-image
42
+ description: a pink tree image in the file explorer
43
+ action: drag-start
44
+ - command: hover-text
45
+ text: Upload
46
+ description: The drop zone of the application
47
+ action: drag-end
48
+ ```
49
+
50
+ ---
51
+
52
+ ## Example usage
53
+
54
+ ```yaml
55
+ command: hover-image
56
+ description: search icon in the webpage content
57
+ action: click
58
+ ```
59
+
60
+ ## Protips
61
+
62
+ - Use clear and concise descriptions for the image to improve detection accuracy.
63
+ - Ensure the action specified matches the intended interaction with the image.
64
+ - If the hover-image command fails to locate an image based on the provided description, consider using the match-image command instead. The match-image command is specifically designed for scenarios where precise image matching is required, such as when the visual element can't be reliably described with text. It works by directly comparing the image on the screen with a reference image file.
65
+
66
+ ## Gotchas
67
+
68
+ - If the image can't be located based on the description, the command will fail.
69
+ - Ensure the screen resolution and scaling settings are consistent to avoid detection issues.
@@ -0,0 +1,47 @@
1
+ ---
2
+ title: "hover-text"
3
+ sidebarTitle: "hover-text"
4
+ description: "Hover or click on text elements based on a description."
5
+ icon: "text"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/hover-text-replay.mdx";
10
+ import Example from "/snippets/tests/hover-text-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `hover-text` command is used to locate text on the screen based on a description and perform an action on it. This can include hovering, clicking, right-clicking, or double-clicking the text.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-----------: | :------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `text` | `string` | The text to find on the screen. Longer and unique is better. |
24
+ | `description` | `string` | A description of the text and what it represents. The actual text itself shouldn't be included here. |
25
+ | `action` | `string` | The action to take when the text is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging text](/commands/hover-image#drag-functionality). |
26
+ | `method` | `enum` | The matching algorithm to use. Possible values are `turbo` (default) and `ai`. |
27
+ | `timeout` | `number` | **(Optional)** The duration in milliseconds to wait for the text to appear. Default is `5000` (5 seconds). |
28
+
29
+ ## Example usage
30
+
31
+ ```yaml
32
+ command: hover-text
33
+ text: Sign Up
34
+ description: link in the header
35
+ action: click
36
+ timeout: 10000 # 10 seconds
37
+ ```
38
+
39
+ ## Gotchas
40
+
41
+ - If the text can't be located, it will internally call the [wait-for-text](/commands/wait-for-text) command and wait for the text to appear. The wait `timeout` is 5 seconds by default, and the command fails if the text is not found.
42
+ - Variations in font size, style, or screen resolution may affect detection accuracy.
43
+
44
+ ## Notes
45
+
46
+ - The `hover-text` command is ideal for interacting with textual elements that can't be identified using other selectors.
47
+ - Supported actions allow flexibility in how the text is interacted with during the test.
@@ -0,0 +1,53 @@
1
+ ---
2
+ title: "if"
3
+ sidebarTitle: "if"
4
+ description: "Conditionally execute commands based on a specified condition."
5
+ icon: "split"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Description
10
+
11
+ The `if` command is used to conditionally execute a set of commands based on whether a specified condition evaluates to true or false. If the condition is true, the commands in the `then` block are executed. Otherwise, the commands in the `else` block are executed.
12
+
13
+ ## Arguments
14
+
15
+ | Argument | Type | Description |
16
+ | :---------: | :----------------: | :---------------------------------------------------------------------------- |
17
+ | `condition` | `string` | The condition to evaluate. |
18
+ | `then` | `list of commands` | The commands to run if the condition is true. |
19
+ | `else` | `list of commands` | The commands to run if the condition is false. It is an **optional command**. |
20
+
21
+ ## Example usage
22
+
23
+ ```yaml
24
+ - prompt: click on sign up, if cookie banner appears close it
25
+ commands:
26
+ - command: if
27
+ condition: the text "Accept Cookies" is visible
28
+ then:
29
+ - command: hover-text
30
+ text: Accept Cookies
31
+ description: cookie banner button
32
+ action: click
33
+ else:
34
+ - command: hover-text
35
+ text: Sign Up
36
+ description: link in the header
37
+ action: click
38
+ ```
39
+
40
+ ## Protips
41
+
42
+ - Ensure the `condition` is clearly defined and evaluates correctly to avoid unexpected behavior.
43
+ - Use descriptive `then` and `else` blocks to handle both outcomes effectively.
44
+
45
+ ## Gotchas
46
+
47
+ - The else block is optional, if the `condition` fails and there is no `else` block, the execution will continue from the next available command.
48
+ - If the `condition` is invalid or can't be evaluated, the command will fail.
49
+ - Ensure all commands in the `then` and `else` blocks are valid and properly formatted.
50
+
51
+ ---
52
+
53
+ The `if` command is useful for creating conditional logic in your tests, allowing for more dynamic and flexible workflows.
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: "match-image"
3
+ sidebarTitle: "match-image"
4
+ description: "Locate an image on the screen and perform an action."
5
+ icon: "images"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/match-image-replay.mdx";
10
+ import Example from "/snippets/tests/match-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `match-image` command is used to locate an image on the screen by matching it with a reference image file and performing an action (For example, click or hover) at its center. This command is particularly useful for interacting with elements that the AI has difficulty locating using descriptions or other methods.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | -------- | --------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | `path` | `string` | The path to the image that needs to be matched. The path needs to be relative to the current test file |
24
+ | `action` | `string` | The action to take when the image is found. Available actions are: `click`, `right-click`, `double-click`, `hover`. Also supports `drag-start` and `drag-end` for [dragging images](/commands/hover-image#drag-functionality) |
25
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will pass when the specified image is NOT detected. Default is `false`. |
26
+
27
+ ## Example usage
28
+
29
+ ```yaml
30
+ command: match-image
31
+ path: screenshots/button.png
32
+ action: click
33
+ ```
34
+
35
+ ## How it works
36
+
37
+ - The `match-image` command takes a screenshot of the desktop and searches for the location of the reference image within the screenshot.
38
+ - The matching logic looks for the most similar image within the screenshot, not an exact match. If the similarity is below ~80%, it will search additional scales. If no match is found, the command will fail.
39
+ - Screenshots should be stored in the `testdriver/screenshots/` directory.
40
+
41
+ ## Protips
42
+
43
+ - To create high-quality screenshots for matching:
44
+ - Download the video of the test and open it at **full or actual size** on your computer.
45
+ - Use a screenshot tool (like Cleanshot X) to capture the target element.
46
+ - Center the clickable element as much as possible within the screenshot.
47
+ - Ensure the image file is clear and free of unnecessary visual noise to improve matching accuracy.
48
+
49
+ ## Gotchas
50
+
51
+ - The screenshot image should be of the actual size of the image that's being match against.
52
+ - If the image match is below ~80% similarity, the program tries to match will different scales, its recommended to have an actual size image.
53
+ - Variations in screen resolution, scaling settings, or platform-specific UI differences may affect matching accuracy.
54
+ - Ensure the image file is stored in the correct directory structure (`testdriver/screenshots/`) for dynamic resolution.
55
+ - The `path`needs to be relative to the current test file's directory. For example, if the test file is at `testdriver/onboarding/login.yaml` and the image is present at the conventional `testdriver/screenshots/nepal-flag.png` it should be referrenced as
56
+
57
+ ```yaml highlight={2}
58
+ command: match-image
59
+ path: ../screenshots/nepal-flag.png
60
+ action: click
61
+ ```
62
+
63
+ ## Notes
64
+
65
+ - The `match-image` command is ideal for interacting with visual elements that can't be reliably described or located using other commands like `hover-image`.
66
+ - This command supports flexible scaling to account for minor differences in image size or resolution.
67
+ - Use this command as a fallback when other methods fail to locate the desired element.
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: "press-keys"
3
+ sidebarTitle: "press-keys"
4
+ description: "Simulate typing a keyboard combination."
5
+ icon: "keyboard"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/press-keys-replay.mdx";
10
+ import Example from "/snippets/tests/press-keys-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `press-keys` command is used to simulate typing a keyboard combination. This is useful for triggering shortcuts or interacting with applications via keyboard input.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | -------- | ------------------------ | :-------------------------------- |
23
+ | `keys` | YAML sequence of strings | A list of keys to press together. |
24
+
25
+ ---
26
+
27
+ The keys supported are the standard [Windows keys](https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.keys?view=windowsdesktop-9.0). Supported values:
28
+
29
+ <Tabs>
30
+ <Tab title="Modifiers">
31
+ - `ctrl`, `shift`, `alt`, `command`, `option`, `win` - Left/right variants:
32
+ `ctrlleft`, `ctrlright`, `shiftleft`, `shiftright`, `altleft`, `altright`,
33
+ `optionleft`, `optionright`, `winleft`, `winright`
34
+ </Tab>
35
+ <Tab title="Printable">
36
+ - All ASCII printable characters: letters `a`–`z`, digits `0`–`9`, common
37
+ punctuation, and `space`.
38
+ </Tab>
39
+ <Tab title="Function keys">- `f1`–`f24`</Tab>
40
+ <Tab title="Navigation">
41
+ - `up`, `down`, `left`, `right`, `home`, `end`, `pageup`, `pagedown`,
42
+ `pgup`, `pgdn`
43
+ </Tab>
44
+ <Tab title="Editing">
45
+ - `backspace`, `delete`, `del`, `insert`, `enter`, `return`, `tab`,
46
+ `escape`, `esc`
47
+ </Tab>
48
+ <Tab title="Locks & Print">
49
+ - `capslock`, `numlock`, `scrolllock`, `printscreen`, `prntscrn`, `prtsc`,
50
+ `prtscr`, `print`
51
+ </Tab>
52
+ <Tab title="Numpad">
53
+ - `num0`–`num9`, `add`, `subtract`, `multiply`, `divide`, `decimal`,
54
+ `separator`
55
+ </Tab>
56
+ <Tab title="Media & Browser">
57
+ - `playpause`, `stop`, `nexttrack`, `prevtrack`, `volumedown`, `volumeup`,
58
+ `volumemute` - `browserback`, `browserforward`, `browserrefresh`,
59
+ `browsersearch`, `browserstop`, `browserfavorites`, `browserhome` -
60
+ `launchapp1`, `launchapp2`, `launchmail`, `launchmediaselect`
61
+ </Tab>
62
+ <Tab title="IME / International">
63
+ - `hangul`, `hanguel`, `hanja`, `junja`, `kana`, `kanji`, `modechange`,
64
+ `nonconvert`, `convert`, `final`, `yen`
65
+ </Tab>
66
+ <Tab title="Other">- `help`, `select`, `sleep`, `space`</Tab>
67
+ </Tabs>
68
+
69
+ ---
70
+
71
+ ## Example usage
72
+
73
+ ```yaml
74
+ command: press-keys
75
+ keys:
76
+ - ctrl
77
+ - space
78
+ ```
79
+
80
+ ## Protips
81
+
82
+ - Use this command to trigger system-wide or application-specific shortcuts, such as the Start menu or the browser elements.
83
+ - Ensure the application or system is in focus when using this command to avoid unexpected behavior.
84
+
85
+ ## Notes
86
+
87
+ - The `press-keys` command is ideal for automating workflows that rely on keyboard shortcuts.
@@ -0,0 +1,49 @@
1
+ ---
2
+ title: "remember"
3
+ sidebarTitle: "remember"
4
+ description: "Save a variable to use later."
5
+ icon: "brain"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/remember-replay.mdx";
10
+ import Example from "/snippets/tests/remember-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `remember` command is used to save a variable for later use. This is useful for storing values that you want to reference in subsequent commands or steps, **especially for things that are dynamic or change frequently from run to run**.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-----------: | :------: | :-------------------------------------------------------- |
23
+ | `output` | `string` | The variable name you will use to recall the value later. |
24
+ | `description` | `string` | A prompt describing the value you want to store. |
25
+
26
+ ---
27
+
28
+ ## Example usage
29
+
30
+ ```yaml
31
+ - command: remember
32
+ description: The date value shown to the right of 'Order Date'
33
+ output: my_variable
34
+ ```
35
+
36
+ ## Protips
37
+
38
+ - Use the output later with this syntax `${OUTPUT.my_variable}`.
39
+ - The `remember` command does not persist variables across different test runs. If you need to store values for later use in different test runs, consider using external storage solutions or environment variables.
40
+ - For now, the `remember` command only supports string values. If you need to store complex data types, you may use `remember` multiple times for the values. This may change in a later version.
41
+
42
+ ## Gotchas
43
+
44
+ - Ensure the variable name is unique to avoid overwriting existing variables.
45
+ - The variable name is case-sensitive, so `my_variable` and `My_Variable` would be treated as different variables.
46
+
47
+ ## Notes
48
+
49
+ - The `remember` command is ideal for storing values that are generated during the test run, such as timestamps, IDs, the text value of a link you might click later, or any other dynamic data.
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: "run"
3
+ sidebarTitle: "run"
4
+ description: "Embed and execute another file within the current script."
5
+ icon: "play"
6
+ mode: "wide"
7
+ ---
8
+
9
+ ## Description
10
+
11
+ The `run` command is used to embed and execute another file within the current script. This is **useful for reusing common sequences of commands or modularizing your scripts** for better organization and maintainability.
12
+
13
+ ## Arguments
14
+
15
+ | Argument | Type | Description |
16
+ | -------- | -------- | :-------------------------------------------------------------------------------------------- |
17
+ | `file` | `string` | The path to the file to embed and run. Should be relative to the root of your git repository. |
18
+
19
+ ## Example usage
20
+
21
+ ```yaml
22
+ command: run
23
+ file: relative/path/to/another-script.yaml
24
+ ```
25
+
26
+ ## Protips
27
+
28
+ - Use the `run` command to centralize reusable logic, such as login flows or setup steps, into separate files.
29
+ - Ensure the file path is relative to the current test file's directory. For example, if the test file is at `testdriver/homepage/chat-functionalities.yaml` and say the login snippet is present at the conventional `testdriver/snippets/login.yaml` it should be referrenced as :
30
+
31
+ ```yaml highlight={2}
32
+ command: run
33
+ file: ../snippets/login.yaml
34
+ ```
35
+
36
+ ## Gotchas
37
+
38
+ - If the specified file doesn't exist or contains errors, the command will fail.
39
+ - Ensure the embedded file is compatible with the current script's context, such as variable dependencies or session requirements.
40
+
41
+ ## Notes
42
+
43
+ - The `run` command is ideal for creating modular and maintainable test scripts by reusing common workflows.
44
+ - This command supports nesting, allowing you to call scripts that themselves use the `run` command.
@@ -0,0 +1,66 @@
1
+ ---
2
+ title: "scroll-until-image"
3
+ sidebarTitle: "scroll-until-image"
4
+ description: "Scroll the screen until an image matching the description is found."
5
+ icon: "film-simple"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/scroll-until-image-replay.mdx";
10
+ import Example from "/snippets/tests/scroll-until-image-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `scroll-until-image` command is used to scroll the screen in a specified direction until an image matching the given description is found. This is useful for navigating to visual elements that aren't initially visible on the screen.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :-----------: | :-------: | :---------------------------------------------------------------------------------------------------------------------- |
23
+ | `description` | `string` | A description of the image and what it represents. |
24
+ | `direction` | `string` | (Optional) The direction to scroll. Available directions are: `up`, `down`, `left`, `right`. Defaults to `down`. |
25
+ | `distance` | `number` | (Optional) The maximum number of pixels to scroll before giving up. Default is `10000`. |
26
+ | `method` | `string` | (Optional) The method to use to scroll the page. Available methods are: `mouse` and `keyboard`. Defaults to `keyboard`. |
27
+ | `path` | `string` | (Optional) The relative path to the image file that needs to be matched on the screen. |
28
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will scroll until the specified image is NOT detected. Default is `false`. |
29
+
30
+ <Note>
31
+ Use either the `description` or `path` argument to match an image on the
32
+ screen. If you are using `path` argument, make sure to upload an accurate
33
+ representation of the actual image and reference it relative to the current
34
+ test path.
35
+ </Note>
36
+
37
+ ## Example usage
38
+
39
+ ```yaml
40
+ command: scroll-until-image
41
+ description: Submit at the bottom of the form
42
+ direction: down
43
+ ```
44
+
45
+ Or, you can use the `path` argument to match an image on the screen (similar to [`match-image`](./match-image)):
46
+
47
+ ```yaml testdriver/scroll-until-image.yaml
48
+ command: scroll-until-image
49
+ path: screenshots/button.png
50
+ direction: down
51
+ ```
52
+
53
+ ## Protips
54
+
55
+ - Use clear and concise descriptions for the image to improve detection accuracy.
56
+ - Adjust the `distance` value to control how far the command scrolls before giving up.
57
+ - Combine this command with other commands like `hover-image` or `match-image` to interact with the located image.
58
+
59
+ ## Gotchas
60
+
61
+ - If the image can't be located within the specified `distance`, the command will fail.
62
+ - Ensure the description accurately represents the image to avoid detection issues.
63
+
64
+ ---
65
+
66
+ The `scroll-until-image` command is ideal for navigating to visual elements that are off-screen and can't be located using text-based commands.
@@ -0,0 +1,60 @@
1
+ ---
2
+ title: "scroll-until-text"
3
+ sidebarTitle: "scroll-until-text"
4
+ description: "Scroll the screen until the specified text is found."
5
+ icon: "scroll"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/scroll-until-text-replay.mdx";
10
+ import Example from "/snippets/tests/scroll-until-text-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `scroll-until-text` command is used to scroll the screen in a specified direction until the specified text is found. This is useful for navigating to elements that aren't initially visible on the screen.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :---------: | :-------: | :---------------------------------------------------------------------------------------------------------------------- |
23
+ | `text` | `string` | The text to find on the screen. Longer and unique are better. Note this is **case sensitive** |
24
+ | `direction` | `string` | (Optional) The direction to scroll. Available directions are: `up`, `down`, `left`, `right`. Defaults to `down`. |
25
+ | `method` | `string` | (Optional) The method to use to scroll the page. Available methods are: `mouse` and `keyboard`. Defaults to `keyboard`. |
26
+ | `distance` | `number` | (Optional) The maximum number of pixels to scroll before giving up. Default is `10000`. |
27
+ | `invert` | `boolean` | (Optional) If set to `true`, the command will scroll until the specified text is NOT detected. Default is `false`. |
28
+
29
+ <Note>
30
+ If the method is `keyboard` it just searches for the string by doing `ctrl + f`.
31
+ This is helpful if there is a single string match that you want to operate with.
32
+
33
+ If you are using `mouse` method, the command will manually scroll the page (based on the `distance`) until the text is found.
34
+
35
+ </Note>
36
+
37
+ ## Example usage
38
+
39
+ ```yaml
40
+ command: scroll-until-text
41
+ text: Sign Up
42
+ direction: down
43
+ distance: 1000
44
+ ```
45
+
46
+ ## Protips
47
+
48
+ - Use unique and specific text to improve detection accuracy.
49
+ - Adjust the `distance` value to control how far the command scrolls before giving up.
50
+ - If you don't specify a `distance`, the command will scroll 300 pixels at a time, giving up after 5 attempts.
51
+
52
+ ## Gotchas
53
+
54
+ - If the text can't be located within the specified `distance`, the command will fail.
55
+ - Ensure the text is visible and matches exactly, as variations in font size, style, or screen resolution may affect detection accuracy.
56
+ - Note that `text` is case-sensitive, so **Sign Up** and **sign up** would be treated as different strings.
57
+
58
+ ---
59
+
60
+ The `scroll-until-text` command is ideal for navigating to elements that are off-screen and can't be located using other commands.
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: "scroll"
3
+ sidebarTitle: "scroll"
4
+ description: "Scroll the screen in a specified direction using the mouse wheel."
5
+ icon: "computer-mouse"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/scroll-replay.mdx";
10
+ import Example from "/snippets/tests/scroll-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `scroll` command is used to scroll the screen in a specified direction using the mouse wheel. This is useful for navigating through content that extends beyond the visible area.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :---------: | :------: | :------------------------------------------------------------------------------------ |
23
+ | `direction` | `string` | The direction to scroll. Available directions are: `up`, `down`, `left`, `right`. |
24
+ | `method` | `string` | The method to scroll. Available methods are: `mouse`, `keyboard`. Defaults to `mouse` |
25
+ | `amount` | `number` | (Optional) Pixels to scroll. If not specified, a default amount of 300 is used. |
26
+
27
+ <Warning>
28
+ The `amount` should only be used when the `method` is mouse. If the `method`
29
+ is keyboard, it is redundant as the action performed is pressing the `pageup`
30
+ or `pagedown` keys.
31
+ </Warning>
32
+
33
+ ## Example usage
34
+
35
+ ```yaml
36
+ - command: scroll
37
+ direction: down
38
+ method: mouse
39
+ amount: 100
40
+ ```
41
+
42
+ ## Protips
43
+
44
+ - Be sure to focus the application and frame you are trying to scroll before using the command.
45
+ - Use precise `amount` values to control the scrolling distance for better accuracy in your tests.
46
+ - Combine the `scroll` command with other commands like `hover-text` or `match-image` to interact with elements that are initially off-screen.
47
+ - If you wish to scroll dynamically till a specific text or image appears, use [scroll-until-text](/commands/scroll-until-text) or [scroll-until-image](/commands/scroll-until-image) commands.
48
+ - The most reliable way to scroll to the top or bottom of the page is to use the `home` and `end` keys:
49
+
50
+ ```yaml
51
+ # Scroll to the top of the page
52
+ - command: press-keys
53
+ keys:
54
+ - home
55
+ # Scroll to the bottom of the page
56
+ - command: press-keys
57
+ keys:
58
+ - end
59
+ ```
60
+
61
+ ## Gotchas
62
+
63
+ - Scrolling too far may cause elements to move out of view. Adjust the `amount` value as needed.
64
+ - Ensure the application or browser window is in focus when using this command to avoid unexpected behavior.
65
+
66
+ ## Notes
67
+
68
+ - The `scroll` command is ideal for navigating through long pages or lists during automated tests.
69
+ - This command supports both vertical and horizontal scrolling for flexible navigation.
@@ -0,0 +1,45 @@
1
+ ---
2
+ title: "type"
3
+ sidebarTitle: "type"
4
+ description: "Simulate typing a string using keyboard emulation."
5
+ icon: "typewriter"
6
+ mode: "wide"
7
+ ---
8
+
9
+ import Replay from "/snippets/tests/type-replay.mdx";
10
+ import Example from "/snippets/tests/type-yaml.mdx";
11
+
12
+ <Replay />
13
+ <Example />
14
+
15
+ ## Description
16
+
17
+ The `type` command is used to simulate typing a string using keyboard emulation. This is useful for entering text into input fields or performing text-based interactions.
18
+
19
+ ## Arguments
20
+
21
+ | Argument | Type | Description |
22
+ | :------: | :------: | :----------------------- |
23
+ | `text` | `string` | The text string to type. |
24
+
25
+ ## Example usage
26
+
27
+ ```yaml
28
+ command: type
29
+ text: Hello World
30
+ ```
31
+
32
+ ## Protips
33
+
34
+ - Use this command to input text into fields, such as search bars or forms.
35
+ - Ensure the target application or input field is in focus before using the `type` command to avoid unexpected behavior.
36
+ - It can also be used to insert values from variables, refer our [variable's guide](/guide/variables) for more information.
37
+
38
+ ## Gotchas
39
+
40
+ - If the input field isn't active or in focus, the text may not be typed correctly.
41
+ - Special characters in the `text` string may require additional handling depending on the application.
42
+
43
+ ---
44
+
45
+ The `type` command is ideal for automating text input in tests.