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.
- package/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/MIGRATION.md +389 -0
- package/PLUGIN_MIGRATION.md +222 -0
- package/PROMPT_CACHE.md +200 -0
- package/SDK_LOGGING.md +222 -0
- package/SDK_MIGRATION.md +474 -0
- package/SDK_README.md +1122 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +258 -68
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +143 -188
- package/agent/lib/redraw.js +6 -3
- package/agent/lib/sandbox.js +19 -5
- package/agent/lib/sdk.js +1 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debug-screenshot-1763401388589.png +0 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +232 -152
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/quickstart.mdx +199 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/playwright.mdx +342 -0
- package/eslint.config.js +19 -1
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +744 -0
- package/mcp-server/AI_GUIDELINES.md +57 -0
- package/package.json +18 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +735 -0
- package/sdk.js +1906 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/test/mcp-example-test.yaml +27 -0
- package/test-find-api.js +73 -0
- package/test-prompt-cache.js +96 -0
- package/test-sandbox-render.js +28 -0
- package/test-sdk-methods.js +15 -0
- package/test-sdk-refactor.js +53 -0
- package/test-stack-trace.mjs +57 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +84 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +65 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /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
|