testdriverai 7.1.0 → 7.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/agent/index.js +18 -45
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +1 -1
- package/agent/lib/redraw.js +1 -1
- package/agent/lib/sandbox.js +30 -2
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +140 -131
- package/docs/v6/getting-started/self-hosting.mdx +3 -2
- package/docs/v7/_drafts/agents.mdx +852 -0
- package/docs/v7/_drafts/auto-cache-key.mdx +167 -0
- package/docs/v7/{guides → _drafts}/caching-selectors.mdx +125 -17
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/implementation-plan.mdx +994 -0
- package/docs/v7/_drafts/init-command.mdx +95 -0
- package/docs/v7/_drafts/optimal-sdk-design.mdx +1348 -0
- package/docs/v7/_drafts/plugin-migration.mdx +222 -0
- package/docs/v7/_drafts/prompt-cache.mdx +200 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-logging.mdx +222 -0
- package/docs/v7/_drafts/sdk-migration.mdx +474 -0
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/{guides → _drafts}/troubleshooting.mdx +2 -2
- package/docs/v7/{guides → _drafts}/vitest-plugin.mdx +4 -4
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +2 -2
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/type.mdx +51 -7
- package/docs/v7/features/ai-native.mdx +427 -0
- package/docs/v7/features/easy-to-write.mdx +351 -0
- package/docs/v7/features/enterprise.mdx +540 -0
- package/docs/v7/features/fast.mdx +424 -0
- package/docs/v7/features/observable.mdx +623 -0
- package/docs/v7/features/powerful.mdx +531 -0
- package/docs/v7/features/scalable.mdx +417 -0
- package/docs/v7/features/stable.mdx +514 -0
- package/docs/v7/getting-started/configuration.mdx +1 -1
- package/docs/v7/getting-started/generating-tests.mdx +525 -0
- package/docs/v7/getting-started/installation.mdx +486 -0
- package/docs/v7/getting-started/quickstart.mdx +51 -5
- package/docs/v7/getting-started/running-and-debugging.mdx +511 -0
- package/docs/v7/getting-started/setting-up-in-ci.mdx +612 -0
- package/docs/v7/getting-started/writing-tests.mdx +535 -0
- package/docs/v7/overview/what-is-testdriver.mdx +398 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome.mdx +16 -0
- package/docs/v7/presets/electron.mdx +18 -0
- package/docs/v7/presets/vscode.mdx +19 -0
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +214 -10
- package/{src → lib}/core/Dashcam.js +41 -4
- package/{src → lib}/vitest/hooks.mjs +118 -100
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +9 -10
- package/sdk.d.ts +15 -2
- package/sdk.js +72 -17
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/{testdriver/acceptance-sdk → test/manual}/test-console-logs.test.mjs +1 -1
- package/test/manual/test-find-api.js +73 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-prompt-cache.js +96 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/manual/test-sandbox-render.js +28 -0
- package/test/manual/test-sdk-methods.js +15 -0
- package/test/manual/test-sdk-refactor.js +53 -0
- package/test/manual/test-stack-trace.mjs +57 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/auto-cache-key-demo.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +3 -3
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +2 -2
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-text.test.mjs +1 -1
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +1 -1
- package/{src/vitest/lifecycle.mjs → test/testdriver/setup/lifecycleHelpers.mjs} +84 -99
- package/test/testdriver/setup/testHelpers.mjs +653 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/type.test.mjs +1 -1
- package/vitest.config.mjs +8 -59
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/acceptance-linux.yml +0 -75
- package/.github/workflows/acceptance-sdk-tests.yml +0 -133
- package/.github/workflows/acceptance-tests.yml +0 -130
- package/.github/workflows/lint.yml +0 -27
- package/.github/workflows/publish-canary.yml +0 -40
- package/.github/workflows/publish-latest.yml +0 -61
- package/.github/workflows/test-install.yml +0 -29
- package/.vscode/extensions.json +0 -3
- package/.vscode/launch.json +0 -22
- package/.vscode/settings.json +0 -14
- package/AGENTS.md +0 -550
- package/CODEOWNERS +0 -2
- package/_testdriver/acceptance/assert.yaml +0 -7
- package/_testdriver/acceptance/dashcam.yaml +0 -9
- package/_testdriver/acceptance/drag-and-drop.yaml +0 -49
- package/_testdriver/acceptance/embed.yaml +0 -9
- package/_testdriver/acceptance/exec-js.yaml +0 -29
- package/_testdriver/acceptance/exec-output.yaml +0 -43
- package/_testdriver/acceptance/exec-shell.yaml +0 -40
- package/_testdriver/acceptance/focus-window.yaml +0 -16
- package/_testdriver/acceptance/hover-image.yaml +0 -18
- package/_testdriver/acceptance/hover-text-with-description.yaml +0 -29
- package/_testdriver/acceptance/hover-text.yaml +0 -14
- package/_testdriver/acceptance/if-else.yaml +0 -31
- package/_testdriver/acceptance/match-image.yaml +0 -15
- package/_testdriver/acceptance/press-keys.yaml +0 -35
- package/_testdriver/acceptance/prompt.yaml +0 -11
- package/_testdriver/acceptance/remember.yaml +0 -27
- package/_testdriver/acceptance/screenshots/cart.png +0 -0
- package/_testdriver/acceptance/scroll-keyboard.yaml +0 -34
- package/_testdriver/acceptance/scroll-until-image.yaml +0 -26
- package/_testdriver/acceptance/scroll-until-text.yaml +0 -20
- package/_testdriver/acceptance/scroll.yaml +0 -33
- package/_testdriver/acceptance/snippets/login.yaml +0 -29
- package/_testdriver/acceptance/snippets/match-cart.yaml +0 -8
- package/_testdriver/acceptance/type.yaml +0 -29
- package/_testdriver/behavior/failure.yaml +0 -7
- package/_testdriver/behavior/hover-text.yaml +0 -13
- package/_testdriver/behavior/lifecycle/postrun.yaml +0 -10
- package/_testdriver/behavior/lifecycle/prerun.yaml +0 -8
- package/_testdriver/behavior/lifecycle/provision.yaml +0 -8
- package/_testdriver/behavior/secrets.yaml +0 -7
- package/_testdriver/edge-cases/dashcam-chrome.yaml +0 -8
- package/_testdriver/edge-cases/exec-pwsh-multiline.yaml +0 -10
- package/_testdriver/edge-cases/js-exception.yaml +0 -8
- package/_testdriver/edge-cases/js-promise.yaml +0 -19
- package/_testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/_testdriver/edge-cases/prompt-in-middle.yaml +0 -23
- package/_testdriver/edge-cases/prompt-nested.yaml +0 -7
- package/_testdriver/edge-cases/success-test.yaml +0 -9
- package/_testdriver/examples/android/example.yaml +0 -12
- package/_testdriver/examples/android/lifecycle/postrun.yaml +0 -11
- package/_testdriver/examples/android/lifecycle/provision.yaml +0 -47
- package/_testdriver/examples/android/readme.md +0 -7
- package/_testdriver/examples/chrome-extension/lifecycle/provision.yaml +0 -74
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/_testdriver/examples/desktop/lifecycle/provision.yaml +0 -64
- package/_testdriver/examples/vscode-extension/lifecycle/provision.yaml +0 -73
- package/_testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/_testdriver/examples/web/lifecycle/prerun.yaml +0 -22
- package/_testdriver/lifecycle/postrun.yaml +0 -8
- package/_testdriver/lifecycle/prerun.yaml +0 -15
- package/_testdriver/lifecycle/provision.yaml +0 -25
- package/docs/v7/guides/ci-cd/azure.mdx +0 -587
- package/docs/v7/guides/ci-cd/circleci.mdx +0 -523
- package/docs/v7/guides/ci-cd/github-actions.mdx +0 -457
- package/docs/v7/guides/ci-cd/gitlab.mdx +0 -498
- package/docs/v7/guides/ci-cd/jenkins.mdx +0 -664
- package/docs/v7/guides/ci-cd/travis.mdx +0 -438
- package/scripts/view-test-results.mjs +0 -96
- package/src/vitest/extended.mjs +0 -108
- package/src/vitest/index.mjs +0 -64
- package/src/vitest/utils.mjs +0 -150
- package/styles/.vale-config/2-MDX.ini +0 -5
- package/styles/Microsoft/AMPM.yml +0 -9
- package/styles/Microsoft/Accessibility.yml +0 -30
- package/styles/Microsoft/Acronyms.yml +0 -64
- package/styles/Microsoft/Adverbs.yml +0 -272
- package/styles/Microsoft/Auto.yml +0 -11
- package/styles/Microsoft/Avoid.yml +0 -14
- package/styles/Microsoft/Contractions.yml +0 -50
- package/styles/Microsoft/Dashes.yml +0 -13
- package/styles/Microsoft/DateFormat.yml +0 -8
- package/styles/Microsoft/DateNumbers.yml +0 -40
- package/styles/Microsoft/DateOrder.yml +0 -8
- package/styles/Microsoft/Ellipses.yml +0 -9
- package/styles/Microsoft/FirstPerson.yml +0 -16
- package/styles/Microsoft/Foreign.yml +0 -13
- package/styles/Microsoft/Gender.yml +0 -8
- package/styles/Microsoft/GenderBias.yml +0 -42
- package/styles/Microsoft/GeneralURL.yml +0 -11
- package/styles/Microsoft/HeadingAcronyms.yml +0 -7
- package/styles/Microsoft/HeadingColons.yml +0 -8
- package/styles/Microsoft/HeadingPunctuation.yml +0 -13
- package/styles/Microsoft/Headings.yml +0 -28
- package/styles/Microsoft/Hyphens.yml +0 -14
- package/styles/Microsoft/Negative.yml +0 -13
- package/styles/Microsoft/Ordinal.yml +0 -13
- package/styles/Microsoft/OxfordComma.yml +0 -8
- package/styles/Microsoft/Passive.yml +0 -183
- package/styles/Microsoft/Percentages.yml +0 -7
- package/styles/Microsoft/Plurals.yml +0 -7
- package/styles/Microsoft/Quotes.yml +0 -7
- package/styles/Microsoft/RangeTime.yml +0 -13
- package/styles/Microsoft/Semicolon.yml +0 -8
- package/styles/Microsoft/SentenceLength.yml +0 -6
- package/styles/Microsoft/Spacing.yml +0 -8
- package/styles/Microsoft/Suspended.yml +0 -7
- package/styles/Microsoft/Terms.yml +0 -42
- package/styles/Microsoft/URLFormat.yml +0 -9
- package/styles/Microsoft/Units.yml +0 -16
- package/styles/Microsoft/Vocab.yml +0 -25
- package/styles/Microsoft/We.yml +0 -11
- package/styles/Microsoft/Wordiness.yml +0 -127
- package/styles/Microsoft/meta.json +0 -4
- package/styles/alex/Ablist.yml +0 -274
- package/styles/alex/Condescending.yml +0 -16
- package/styles/alex/Gendered.yml +0 -110
- package/styles/alex/LGBTQ.yml +0 -55
- package/styles/alex/OCD.yml +0 -10
- package/styles/alex/Press.yml +0 -12
- package/styles/alex/ProfanityLikely.yml +0 -1289
- package/styles/alex/ProfanityMaybe.yml +0 -282
- package/styles/alex/ProfanityUnlikely.yml +0 -251
- package/styles/alex/README.md +0 -27
- package/styles/alex/Race.yml +0 -85
- package/styles/alex/Suicide.yml +0 -26
- package/styles/alex/meta.json +0 -4
- package/styles/config/vocabularies/Docs/accept.txt +0 -47
- package/styles/config/vocabularies/Docs/reject.txt +0 -4
- package/styles/proselint/Airlinese.yml +0 -8
- package/styles/proselint/AnimalLabels.yml +0 -48
- package/styles/proselint/Annotations.yml +0 -9
- package/styles/proselint/Apologizing.yml +0 -8
- package/styles/proselint/Archaisms.yml +0 -52
- package/styles/proselint/But.yml +0 -8
- package/styles/proselint/Cliches.yml +0 -782
- package/styles/proselint/CorporateSpeak.yml +0 -30
- package/styles/proselint/Currency.yml +0 -5
- package/styles/proselint/Cursing.yml +0 -15
- package/styles/proselint/DateCase.yml +0 -7
- package/styles/proselint/DateMidnight.yml +0 -7
- package/styles/proselint/DateRedundancy.yml +0 -10
- package/styles/proselint/DateSpacing.yml +0 -7
- package/styles/proselint/DenizenLabels.yml +0 -52
- package/styles/proselint/Diacritical.yml +0 -95
- package/styles/proselint/GenderBias.yml +0 -45
- package/styles/proselint/GroupTerms.yml +0 -39
- package/styles/proselint/Hedging.yml +0 -8
- package/styles/proselint/Hyperbole.yml +0 -6
- package/styles/proselint/Jargon.yml +0 -11
- package/styles/proselint/LGBTOffensive.yml +0 -13
- package/styles/proselint/LGBTTerms.yml +0 -15
- package/styles/proselint/Malapropisms.yml +0 -8
- package/styles/proselint/Needless.yml +0 -358
- package/styles/proselint/Nonwords.yml +0 -38
- package/styles/proselint/Oxymorons.yml +0 -22
- package/styles/proselint/P-Value.yml +0 -6
- package/styles/proselint/RASSyndrome.yml +0 -30
- package/styles/proselint/README.md +0 -12
- package/styles/proselint/Skunked.yml +0 -13
- package/styles/proselint/Spelling.yml +0 -17
- package/styles/proselint/Typography.yml +0 -11
- package/styles/proselint/Uncomparables.yml +0 -50
- package/styles/proselint/Very.yml +0 -6
- package/styles/proselint/meta.json +0 -15
- package/styles/write-good/Cliches.yml +0 -702
- package/styles/write-good/E-Prime.yml +0 -32
- package/styles/write-good/Illusions.yml +0 -11
- package/styles/write-good/Passive.yml +0 -183
- package/styles/write-good/README.md +0 -27
- package/styles/write-good/So.yml +0 -5
- package/styles/write-good/ThereIs.yml +0 -6
- package/styles/write-good/TooWordy.yml +0 -221
- package/styles/write-good/Weasel.yml +0 -29
- package/styles/write-good/meta.json +0 -4
- package/test/dashcam.test.js +0 -137
- package/test/mcp-example-test.yaml +0 -27
- package/test/test_parser.js +0 -47
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +0 -61
- package/testdriver/acceptance-sdk/README.md +0 -128
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +0 -245
- package/testdriver/acceptance-sdk/assert.test.mjs +0 -26
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +0 -38
- package/testdriver/acceptance-sdk/presets-example.test.mjs +0 -87
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +0 -420
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +0 -234
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/vale.ini +0 -18
- package/vitest.config.example.js +0 -19
- package/vitest.config.mjs.bak +0 -44
- /package/docs/{ARCHITECTURE.md → v7/_drafts/architecture.mdx} +0 -0
- /package/docs/{AWESOME_LOGS_QUICK_REF.md → v7/_drafts/awesome-logs-quick-ref.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/best-practices.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching-ai.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/caching.mdx +0 -0
- /package/docs/{MIGRATION.md → v7/_drafts/cli-to-sdk-migration.mdx} +0 -0
- /package/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{progressive-apis/CORE.md → _drafts/core.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/debugging.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/faq.mdx +0 -0
- /package/docs/v7/{progressive-apis/HOOKS.md → _drafts/hooks.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/docs/v7/{guides → _drafts}/performance.mdx +0 -0
- /package/docs/{PRESETS.md → v7/_drafts/presets.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROGRESSIVE_DISCLOSURE.md → _drafts/progressive-disclosure.mdx} +0 -0
- /package/docs/v7/{progressive-apis/PROVISION.md → _drafts/provision.mdx} +0 -0
- /package/docs/{SDK_AWESOME_LOGS.md → v7/_drafts/sdk-awesome-logs.mdx} +0 -0
- /package/docs/{sdk-browser-rendering.md → v7/_drafts/sdk-browser-rendering.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/vitest.mdx +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{src → lib}/core/index.d.ts +0 -0
- /package/{src → lib}/core/index.js +0 -0
- /package/{src → lib}/presets/index.mjs +0 -0
- /package/{src → lib}/vitest/hooks.d.ts +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{verify-element-api.js → test/manual/verify-element-api.js} +0 -0
- /package/{verify-types.js → test/manual/verify-types.js} +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/chrome-extension.test.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Running & Debugging Tests"
|
|
3
|
+
description: "Run tests with Vitest and debug failures with Dashcam replays"
|
|
4
|
+
icon: "play"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Learn how to run TestDriver tests efficiently and debug failures using video replays, logs, and error analysis.
|
|
8
|
+
|
|
9
|
+
## Running Tests
|
|
10
|
+
|
|
11
|
+
TestDriver works with Vitest's powerful test runner:
|
|
12
|
+
|
|
13
|
+
<Tabs>
|
|
14
|
+
<Tab title="Run All Tests">
|
|
15
|
+
```bash
|
|
16
|
+
# Run all tests once
|
|
17
|
+
npx vitest run
|
|
18
|
+
|
|
19
|
+
# Run in watch mode
|
|
20
|
+
npx vitest
|
|
21
|
+
|
|
22
|
+
# Run with coverage
|
|
23
|
+
npx vitest run --coverage
|
|
24
|
+
```
|
|
25
|
+
</Tab>
|
|
26
|
+
|
|
27
|
+
<Tab title="Run Specific Tests">
|
|
28
|
+
```bash
|
|
29
|
+
# Run specific file
|
|
30
|
+
npx vitest run login.test.js
|
|
31
|
+
|
|
32
|
+
# Run multiple files
|
|
33
|
+
npx vitest run login.test.js checkout.test.js
|
|
34
|
+
|
|
35
|
+
# Run tests matching pattern
|
|
36
|
+
npx vitest run --grep "login"
|
|
37
|
+
|
|
38
|
+
# Run tests in specific folder
|
|
39
|
+
npx vitest run tests/e2e/
|
|
40
|
+
```
|
|
41
|
+
</Tab>
|
|
42
|
+
|
|
43
|
+
<Tab title="Watch Mode">
|
|
44
|
+
```bash
|
|
45
|
+
# Watch mode - reruns on file changes
|
|
46
|
+
npx vitest
|
|
47
|
+
|
|
48
|
+
# Watch only changed tests
|
|
49
|
+
npx vitest --changed
|
|
50
|
+
|
|
51
|
+
# Watch specific file
|
|
52
|
+
npx vitest login.test.js
|
|
53
|
+
```
|
|
54
|
+
</Tab>
|
|
55
|
+
|
|
56
|
+
<Tab title="Parallel Execution">
|
|
57
|
+
```bash
|
|
58
|
+
# Control concurrency
|
|
59
|
+
npx vitest run --maxConcurrency=5
|
|
60
|
+
|
|
61
|
+
# Run with specific thread count
|
|
62
|
+
npx vitest run --threads --minThreads=2 --maxThreads=8
|
|
63
|
+
```
|
|
64
|
+
</Tab>
|
|
65
|
+
</Tabs>
|
|
66
|
+
|
|
67
|
+
## Test Output
|
|
68
|
+
|
|
69
|
+
Understanding test output:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
$ npx vitest run
|
|
73
|
+
|
|
74
|
+
✓ login.test.js (3) 23.4s
|
|
75
|
+
✓ user can login with valid credentials 12.3s
|
|
76
|
+
✓ shows error for invalid email 5.6s
|
|
77
|
+
✓ shows error for wrong password 5.5s
|
|
78
|
+
|
|
79
|
+
✓ checkout.test.js (2) 34.7s
|
|
80
|
+
✓ user can complete checkout 28.9s
|
|
81
|
+
✓ validates credit card format 5.8s
|
|
82
|
+
|
|
83
|
+
Test Files 2 passed (2)
|
|
84
|
+
Tests 5 passed (5)
|
|
85
|
+
Duration 58.12s
|
|
86
|
+
|
|
87
|
+
📹 Dashcam Replays:
|
|
88
|
+
- https://console.testdriver.ai/dashcam/abc123
|
|
89
|
+
- https://console.testdriver.ai/dashcam/def456
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
<Tip>
|
|
93
|
+
Click the Dashcam URLs to watch video replays of your tests!
|
|
94
|
+
</Tip>
|
|
95
|
+
|
|
96
|
+
## Debugging with Dashcam
|
|
97
|
+
|
|
98
|
+
Every test automatically records a video replay:
|
|
99
|
+
|
|
100
|
+
<Steps>
|
|
101
|
+
<Step title="Get Replay URL">
|
|
102
|
+
```javascript
|
|
103
|
+
test('my test', async (context) => {
|
|
104
|
+
const { testdriver, dashcam } = await chrome(context, { url });
|
|
105
|
+
|
|
106
|
+
// Your test code
|
|
107
|
+
|
|
108
|
+
console.log('Replay:', dashcam.url);
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Or find URLs in test output.
|
|
113
|
+
</Step>
|
|
114
|
+
|
|
115
|
+
<Step title="Open Replay">
|
|
116
|
+
Visit [console.testdriver.ai](https://console.testdriver.ai) or click the URL directly.
|
|
117
|
+
</Step>
|
|
118
|
+
|
|
119
|
+
<Step title="Analyze Replay">
|
|
120
|
+
Dashcam shows:
|
|
121
|
+
- Full video of test execution
|
|
122
|
+
- Timeline of all actions
|
|
123
|
+
- Console logs synchronized
|
|
124
|
+
- Network requests
|
|
125
|
+
- Element highlights
|
|
126
|
+
- Screenshots at key moments
|
|
127
|
+
</Step>
|
|
128
|
+
</Steps>
|
|
129
|
+
|
|
130
|
+
<Card title="Dashcam Features" icon="video" href="/v7/features/observable">
|
|
131
|
+
- Play/pause, speed control
|
|
132
|
+
- Jump to any action via timeline
|
|
133
|
+
- Frame-by-frame stepping
|
|
134
|
+
- Download as MP4
|
|
135
|
+
- Share with team
|
|
136
|
+
- View network waterfall
|
|
137
|
+
- See console logs
|
|
138
|
+
|
|
139
|
+
[Complete observability guide](/v7/features/observable)
|
|
140
|
+
</Card>
|
|
141
|
+
|
|
142
|
+
## Understanding Failures
|
|
143
|
+
|
|
144
|
+
When a test fails, TestDriver provides rich debugging information:
|
|
145
|
+
|
|
146
|
+
```javascript
|
|
147
|
+
try {
|
|
148
|
+
await testdriver.find('submit button').click();
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.log('Error:', error.message);
|
|
151
|
+
console.log('Type:', error.name); // 'ElementNotFoundError'
|
|
152
|
+
console.log('Similarity:', error.similarity); // 0.72 (how close it got)
|
|
153
|
+
console.log('Screenshot:', error.debugScreenshot); // Base64 image
|
|
154
|
+
console.log('Cache info:', error.cacheInfo);
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Typical Error Output
|
|
159
|
+
|
|
160
|
+
```
|
|
161
|
+
ElementNotFoundError: Could not find 'submit button'
|
|
162
|
+
|
|
163
|
+
Debug information:
|
|
164
|
+
- Similarity: 0.72 (partial match found)
|
|
165
|
+
- Timeout: 30000ms
|
|
166
|
+
- Retry attempts: 60
|
|
167
|
+
- Cache hit: false
|
|
168
|
+
|
|
169
|
+
Screenshot saved: .testdriver/debug-screenshots/test-001.png
|
|
170
|
+
Dashcam: https://console.testdriver.ai/dashcam/abc123
|
|
171
|
+
|
|
172
|
+
Recent actions:
|
|
173
|
+
1. ✓ navigate to https://example.com (2.1s)
|
|
174
|
+
2. ✓ find('email input') (1.3s)
|
|
175
|
+
3. ✓ type('user@example.com') (0.8s)
|
|
176
|
+
4. ✗ find('submit button') (30.0s) FAILED
|
|
177
|
+
|
|
178
|
+
Suggestions:
|
|
179
|
+
- Try more specific selector: 'blue submit button in bottom right'
|
|
180
|
+
- Check if button is visible on screen
|
|
181
|
+
- Verify button loaded (check network tab)
|
|
182
|
+
- View Dashcam replay to see what happened
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Common Debugging Scenarios
|
|
186
|
+
|
|
187
|
+
<AccordionGroup>
|
|
188
|
+
<Accordion title="Element Not Found">
|
|
189
|
+
**Error:** `ElementNotFoundError: Could not find 'button'`
|
|
190
|
+
|
|
191
|
+
**Debug steps:**
|
|
192
|
+
|
|
193
|
+
1. **Watch Dashcam replay** - See what's on screen
|
|
194
|
+
2. **Check similarity score:**
|
|
195
|
+
- `> 0.8` - Close match, be more specific
|
|
196
|
+
- `0.5-0.8` - Partial match, adjust selector
|
|
197
|
+
- `< 0.5` - No match, element might not be present
|
|
198
|
+
|
|
199
|
+
3. **Try variations:**
|
|
200
|
+
```javascript
|
|
201
|
+
const selectors = [
|
|
202
|
+
'submit button',
|
|
203
|
+
'blue submit button',
|
|
204
|
+
'button in bottom right',
|
|
205
|
+
'primary action button'
|
|
206
|
+
];
|
|
207
|
+
|
|
208
|
+
for (const selector of selectors) {
|
|
209
|
+
try {
|
|
210
|
+
await testdriver.find(selector).click();
|
|
211
|
+
break;
|
|
212
|
+
} catch (error) {
|
|
213
|
+
console.log(`Failed: ${selector} (${error.similarity})`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
4. **Check timing** - Element might load later:
|
|
219
|
+
```javascript
|
|
220
|
+
await testdriver.find('submit button', { timeout: 60000 });
|
|
221
|
+
```
|
|
222
|
+
</Accordion>
|
|
223
|
+
|
|
224
|
+
<Accordion title="Assertion Failures">
|
|
225
|
+
**Error:** `AssertionError: 'welcome message is visible' failed`
|
|
226
|
+
|
|
227
|
+
**Debug steps:**
|
|
228
|
+
|
|
229
|
+
1. **Watch Dashcam** - Verify what's actually displayed
|
|
230
|
+
2. **Simplify assertion:**
|
|
231
|
+
```javascript
|
|
232
|
+
// Instead of:
|
|
233
|
+
await testdriver.assert('welcome message says "Hello John"');
|
|
234
|
+
|
|
235
|
+
// Try:
|
|
236
|
+
await testdriver.assert('welcome message is visible');
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
3. **Check timing:**
|
|
240
|
+
```javascript
|
|
241
|
+
// Wait longer for async content
|
|
242
|
+
await testdriver.assert('message is visible', { timeout: 60000 });
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
4. **Use find() instead:**
|
|
246
|
+
```javascript
|
|
247
|
+
const element = await testdriver.find('welcome message');
|
|
248
|
+
console.log('Message text:', element.text);
|
|
249
|
+
```
|
|
250
|
+
</Accordion>
|
|
251
|
+
|
|
252
|
+
<Accordion title="Test Timeout">
|
|
253
|
+
**Error:** `Test timed out after 120000ms`
|
|
254
|
+
|
|
255
|
+
**Debug steps:**
|
|
256
|
+
|
|
257
|
+
1. **Increase timeout:**
|
|
258
|
+
```javascript vitest.config.mjs
|
|
259
|
+
export default defineConfig({
|
|
260
|
+
test: {
|
|
261
|
+
testTimeout: 180000, // 3 minutes
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
2. **Check sandbox logs** - Look for network issues
|
|
267
|
+
3. **Watch Dashcam** - See where test got stuck
|
|
268
|
+
4. **Add checkpoints:**
|
|
269
|
+
```javascript
|
|
270
|
+
await testdriver.find('button').click();
|
|
271
|
+
console.log('Clicked button');
|
|
272
|
+
|
|
273
|
+
await testdriver.assert('page loaded');
|
|
274
|
+
console.log('Page loaded');
|
|
275
|
+
```
|
|
276
|
+
</Accordion>
|
|
277
|
+
|
|
278
|
+
<Accordion title="Flaky Tests">
|
|
279
|
+
**Issue:** Test passes sometimes, fails other times
|
|
280
|
+
|
|
281
|
+
**Solutions:**
|
|
282
|
+
|
|
283
|
+
1. **Check Dashcam replays** - Compare passing vs failing runs
|
|
284
|
+
2. **Increase stability delay:**
|
|
285
|
+
```javascript
|
|
286
|
+
await testdriver.find('element', {
|
|
287
|
+
stabilityDelay: 500 // Wait 500ms for stability
|
|
288
|
+
});
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
3. **Wait for network:**
|
|
292
|
+
```javascript
|
|
293
|
+
await testdriver.find('button').click();
|
|
294
|
+
// TestDriver automatically waits for network requests
|
|
295
|
+
await testdriver.assert('content loaded');
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
4. **Disable animations in test mode:**
|
|
299
|
+
```javascript
|
|
300
|
+
await testdriver.exec('js', `
|
|
301
|
+
document.querySelectorAll('*').forEach(el => {
|
|
302
|
+
el.style.transition = 'none';
|
|
303
|
+
el.style.animation = 'none';
|
|
304
|
+
});
|
|
305
|
+
`, 5000);
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
[Learn more about stability](/v7/features/stable)
|
|
309
|
+
</Accordion>
|
|
310
|
+
</AccordionGroup>
|
|
311
|
+
|
|
312
|
+
## Debugging Tools
|
|
313
|
+
|
|
314
|
+
### 1. Console Logging
|
|
315
|
+
|
|
316
|
+
```javascript
|
|
317
|
+
test('debug test', async (context) => {
|
|
318
|
+
const { testdriver } = await chrome(context, { url });
|
|
319
|
+
|
|
320
|
+
console.log('Starting test...');
|
|
321
|
+
|
|
322
|
+
const element = await testdriver.find('button');
|
|
323
|
+
console.log('Found element:', {
|
|
324
|
+
text: element.text,
|
|
325
|
+
coordinates: element.coordinates,
|
|
326
|
+
confidence: element.confidence,
|
|
327
|
+
cacheHit: element.cacheHit
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
await element.click();
|
|
331
|
+
console.log('Clicked element');
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 2. Screenshots
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
// Capture debug screenshot
|
|
339
|
+
try {
|
|
340
|
+
await testdriver.find('element');
|
|
341
|
+
} catch (error) {
|
|
342
|
+
// Save debug screenshot
|
|
343
|
+
const fs = require('fs');
|
|
344
|
+
const buffer = Buffer.from(error.debugScreenshot, 'base64');
|
|
345
|
+
fs.writeFileSync('debug.png', buffer);
|
|
346
|
+
console.log('Screenshot saved to debug.png');
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 3. Step-by-Step Execution
|
|
351
|
+
|
|
352
|
+
```javascript
|
|
353
|
+
test('step by step', async (context) => {
|
|
354
|
+
const { testdriver } = await chrome(context, { url });
|
|
355
|
+
|
|
356
|
+
console.log('Step 1: Find email input');
|
|
357
|
+
const email = await testdriver.find('email input');
|
|
358
|
+
console.log('✓ Found:', email);
|
|
359
|
+
|
|
360
|
+
console.log('Step 2: Type email');
|
|
361
|
+
await email.type('user@example.com');
|
|
362
|
+
console.log('✓ Typed');
|
|
363
|
+
|
|
364
|
+
console.log('Step 3: Find button');
|
|
365
|
+
const button = await testdriver.find('submit button');
|
|
366
|
+
console.log('✓ Found:', button);
|
|
367
|
+
|
|
368
|
+
console.log('Step 4: Click button');
|
|
369
|
+
await button.click();
|
|
370
|
+
console.log('✓ Clicked');
|
|
371
|
+
});
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### 4. Network Inspection
|
|
375
|
+
|
|
376
|
+
```javascript
|
|
377
|
+
// View network activity in Dashcam replay
|
|
378
|
+
test('check network', async (context) => {
|
|
379
|
+
const { testdriver } = await chrome(context, {
|
|
380
|
+
url,
|
|
381
|
+
captureNetwork: true // Enable network capture
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
await testdriver.find('load data button').click();
|
|
385
|
+
|
|
386
|
+
// Network requests appear in Dashcam replay
|
|
387
|
+
// Filter by XHR, images, scripts, etc.
|
|
388
|
+
});
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
## Performance Profiling
|
|
392
|
+
|
|
393
|
+
Identify slow tests:
|
|
394
|
+
|
|
395
|
+
```bash
|
|
396
|
+
# Run with reporter showing timing
|
|
397
|
+
npx vitest run --reporter=verbose
|
|
398
|
+
|
|
399
|
+
# Output shows duration per test:
|
|
400
|
+
✓ slow-test.test.js > user can checkout (34.7s)
|
|
401
|
+
→ find('product') (2.1s)
|
|
402
|
+
→ click() (0.4s)
|
|
403
|
+
→ find('add to cart') (1.8s)
|
|
404
|
+
→ click() (0.3s)
|
|
405
|
+
→ find('checkout') (28.9s) ← SLOW!
|
|
406
|
+
→ click() (0.5s)
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
Optimize slow operations:
|
|
410
|
+
|
|
411
|
+
1. **Enable caching** - First run is slow, subsequent runs are fast
|
|
412
|
+
2. **Use parallel execution** - Run tests concurrently
|
|
413
|
+
3. **Check network delays** - Look for slow API calls in Dashcam
|
|
414
|
+
4. **Optimize selectors** - More specific = faster matching
|
|
415
|
+
|
|
416
|
+
[Performance optimization guide](/v7/guides/performance)
|
|
417
|
+
|
|
418
|
+
## Debugging in CI/CD
|
|
419
|
+
|
|
420
|
+
When tests fail in CI:
|
|
421
|
+
|
|
422
|
+
<Steps>
|
|
423
|
+
<Step title="Get Dashcam URL">
|
|
424
|
+
CI output includes replay URLs:
|
|
425
|
+
|
|
426
|
+
```
|
|
427
|
+
Tests failed!
|
|
428
|
+
Dashcam replay: https://console.testdriver.ai/dashcam/abc123
|
|
429
|
+
```
|
|
430
|
+
</Step>
|
|
431
|
+
|
|
432
|
+
<Step title="Download Artifacts">
|
|
433
|
+
Save debug screenshots and logs:
|
|
434
|
+
|
|
435
|
+
```yaml .github/workflows/test.yml
|
|
436
|
+
- uses: actions/upload-artifact@v3
|
|
437
|
+
if: failure()
|
|
438
|
+
with:
|
|
439
|
+
name: test-artifacts
|
|
440
|
+
path: |
|
|
441
|
+
.testdriver/debug-screenshots/
|
|
442
|
+
.testdriver/dashcam-urls.txt
|
|
443
|
+
```
|
|
444
|
+
</Step>
|
|
445
|
+
|
|
446
|
+
<Step title="Reconnect to Sandbox">
|
|
447
|
+
If test failed, reconnect to same sandbox to debug:
|
|
448
|
+
|
|
449
|
+
```bash
|
|
450
|
+
# Get sandbox ID from CI logs
|
|
451
|
+
export TESTDRIVER_SANDBOX_ID=i-abc123def
|
|
452
|
+
|
|
453
|
+
# Run tests locally against same sandbox
|
|
454
|
+
npx vitest run
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
[Sandbox management guide](/agents.md#sandbox-management)
|
|
458
|
+
</Step>
|
|
459
|
+
</Steps>
|
|
460
|
+
|
|
461
|
+
## Vitest UI
|
|
462
|
+
|
|
463
|
+
Use Vitest UI for interactive debugging:
|
|
464
|
+
|
|
465
|
+
```bash
|
|
466
|
+
# Start Vitest UI
|
|
467
|
+
npx vitest --ui
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
Open http://localhost:51204 to see:
|
|
471
|
+
- Test file tree
|
|
472
|
+
- Test status and duration
|
|
473
|
+
- Console output
|
|
474
|
+
- Re-run individual tests
|
|
475
|
+
- Filter and search tests
|
|
476
|
+
|
|
477
|
+
## Next Steps
|
|
478
|
+
|
|
479
|
+
<CardGroup cols={2}>
|
|
480
|
+
<Card
|
|
481
|
+
title="Setting Up in CI"
|
|
482
|
+
icon="arrows-spin"
|
|
483
|
+
href="/v7/getting-started/setting-up-in-ci"
|
|
484
|
+
>
|
|
485
|
+
Run tests in CI/CD pipelines
|
|
486
|
+
</Card>
|
|
487
|
+
|
|
488
|
+
<Card
|
|
489
|
+
title="Debugging Guide"
|
|
490
|
+
icon="bug"
|
|
491
|
+
href="/v7/guides/debugging"
|
|
492
|
+
>
|
|
493
|
+
Advanced debugging techniques
|
|
494
|
+
</Card>
|
|
495
|
+
|
|
496
|
+
<Card
|
|
497
|
+
title="Observable Features"
|
|
498
|
+
icon="microscope"
|
|
499
|
+
href="/v7/features/observable"
|
|
500
|
+
>
|
|
501
|
+
Complete observability guide
|
|
502
|
+
</Card>
|
|
503
|
+
|
|
504
|
+
<Card
|
|
505
|
+
title="Troubleshooting"
|
|
506
|
+
icon="wrench"
|
|
507
|
+
href="/v7/guides/troubleshooting"
|
|
508
|
+
>
|
|
509
|
+
Common issues and solutions
|
|
510
|
+
</Card>
|
|
511
|
+
</CardGroup>
|