testdriverai 7.0.0 → 7.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +2 -0
- package/.github/workflows/linux-tests.yml +28 -0
- package/README.md +126 -0
- package/agent/index.js +7 -9
- package/agent/interface.js +13 -2
- package/agent/lib/commands.js +795 -136
- package/agent/lib/redraw.js +124 -39
- package/agent/lib/sandbox.js +40 -3
- package/agent/lib/sdk.js +21 -0
- package/agent/lib/valid-version.js +2 -2
- package/debugger/index.html +1 -1
- package/docs/docs.json +86 -71
- package/docs/guide/best-practices-polling.mdx +154 -0
- 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/_drafts/best-practices.mdx +486 -0
- package/docs/v7/_drafts/caching-ai.mdx +215 -0
- package/docs/v7/_drafts/caching-selectors.mdx +400 -0
- package/docs/v7/_drafts/caching.mdx +366 -0
- package/docs/v7/_drafts/cli-to-sdk-migration.mdx +425 -0
- package/docs/v7/_drafts/core.mdx +459 -0
- package/docs/v7/_drafts/dashcam-title-feature.mdx +89 -0
- package/docs/v7/_drafts/debugging.mdx +349 -0
- package/docs/v7/_drafts/error-handling.mdx +501 -0
- package/docs/v7/_drafts/faq.mdx +393 -0
- package/docs/v7/_drafts/hooks.mdx +360 -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/performance.mdx +517 -0
- package/docs/v7/_drafts/presets.mdx +210 -0
- package/docs/v7/_drafts/progressive-disclosure.mdx +230 -0
- package/docs/v7/_drafts/provision.mdx +266 -0
- package/docs/{QUICK_START_TEST_RECORDING.md → v7/_drafts/quick-start-test-recording.mdx} +3 -3
- package/docs/v7/_drafts/sdk-v7-complete.mdx +345 -0
- package/docs/v7/{guides → _drafts}/self-hosting.mdx +1 -1
- package/docs/v7/_drafts/troubleshooting.mdx +526 -0
- package/docs/v7/_drafts/vitest-plugin.mdx +477 -0
- package/docs/v7/_drafts/vitest.mdx +535 -0
- package/docs/v7/api/{ai.mdx → act.mdx} +24 -24
- package/docs/v7/api/client.mdx +1 -1
- package/docs/v7/api/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -0
- package/docs/v7/api/elements.mdx +143 -41
- package/docs/v7/api/find.mdx +258 -0
- package/docs/v7/api/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/rightClick.mdx +123 -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 +380 -0
- 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 +320 -141
- 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/platforms/linux.mdx +308 -0
- package/docs/v7/platforms/macos.mdx +433 -0
- package/docs/v7/platforms/windows.mdx +430 -0
- package/docs/v7/playwright.mdx +3 -3
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +303 -0
- package/docs/v7/presets/electron.mdx +453 -0
- package/docs/v7/presets/vscode.mdx +417 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/examples/run-tests-with-recording.sh +2 -2
- package/interfaces/cli/commands/init.js +358 -0
- package/interfaces/vitest-plugin.mjs +393 -103
- package/lib/core/Dashcam.js +506 -0
- package/lib/core/index.d.ts +150 -0
- package/lib/core/index.js +12 -0
- package/lib/presets/index.mjs +331 -0
- package/lib/vitest/hooks.d.ts +119 -0
- package/lib/vitest/hooks.mjs +316 -0
- package/lib/vitest/setup.mjs +44 -0
- package/package.json +13 -3
- package/sdk.d.ts +350 -44
- package/sdk.js +818 -105
- package/{self-hosted.yml → setup/aws/self-hosted.yml} +1 -1
- package/test/manual/test-console-logs.test.mjs +42 -0
- package/test/manual/test-init.sh +54 -0
- package/test/manual/test-provision-auth.mjs +22 -0
- package/test/testdriver/assert.test.mjs +41 -0
- package/test/testdriver/auto-cache-key-demo.test.mjs +56 -0
- package/test/testdriver/chrome-extension.test.mjs +89 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/drag-and-drop.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/element-not-found.test.mjs +6 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-js.test.mjs +6 -18
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-output.test.mjs +9 -21
- package/{testdriver/acceptance-sdk → test/testdriver}/exec-pwsh.test.mjs +14 -26
- package/{testdriver/acceptance-sdk → test/testdriver}/focus-window.test.mjs +8 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/formatted-logging.test.mjs +5 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-image.test.mjs +10 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text-with-description.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/hover-text.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/match-image.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/press-keys.test.mjs +5 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/prompt.test.mjs +7 -19
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-keyboard.test.mjs +6 -20
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll-until-image.test.mjs +6 -18
- package/test/testdriver/scroll-until-text.test.mjs +28 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/scroll.test.mjs +12 -21
- package/test/testdriver/setup/lifecycleHelpers.mjs +262 -0
- package/{testdriver/acceptance-sdk → test/testdriver}/setup/testHelpers.mjs +25 -20
- package/test/testdriver/type.test.mjs +45 -0
- package/vitest.config.mjs +11 -56
- 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/mcp.json +0 -9
- package/.vscode/settings.json +0 -14
- package/CODEOWNERS +0 -3
- package/MIGRATION.md +0 -389
- package/SDK_README.md +0 -1122
- 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/debug-screenshot-1763401388589.png +0 -0
- package/mcp-server/AI_GUIDELINES.md +0 -57
- package/scripts/view-test-results.mjs +0 -96
- 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/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 -44
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +0 -42
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +0 -239
- package/testdriver/acceptance-sdk/type-checking-demo.js +0 -49
- package/testdriver/acceptance-sdk/type.test.mjs +0 -84
- 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/{CONTRIBUTING.md → docs/v7/_drafts/contributing.mdx} +0 -0
- /package/docs/v7/{guides → _drafts}/migration.mdx +0 -0
- /package/{PLUGIN_MIGRATION.md → docs/v7/_drafts/plugin-migration.mdx} +0 -0
- /package/{PROMPT_CACHE.md → docs/v7/_drafts/prompt-cache.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/{SDK_LOGGING.md → docs/v7/_drafts/sdk-logging.mdx} +0 -0
- /package/{SDK_MIGRATION.md → docs/v7/_drafts/sdk-migration.mdx} +0 -0
- /package/docs/{TEST_RECORDING.md → v7/_drafts/test-recording.mdx} +0 -0
- /package/docs/v7/{README.md → overview/readme.mdx} +0 -0
- /package/{debug-locate-response.js → test/manual/debug-locate-response.js} +0 -0
- /package/{test-find-api.js → test/manual/test-find-api.js} +0 -0
- /package/{test-prompt-cache.js → test/manual/test-prompt-cache.js} +0 -0
- /package/{test-sandbox-render.js → test/manual/test-sandbox-render.js} +0 -0
- /package/{test-sdk-methods.js → test/manual/test-sdk-methods.js} +0 -0
- /package/{test-sdk-refactor.js → test/manual/test-sdk-refactor.js} +0 -0
- /package/{test-stack-trace.mjs → test/manual/test-stack-trace.mjs} +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}/setup/globalTeardown.mjs +0 -0
- /package/{testdriver/acceptance-sdk → test/testdriver}/setup/vitestSetup.mjs +0 -0
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
# TestDriver SDK Acceptance Tests
|
|
2
|
-
|
|
3
|
-
This directory contains acceptance tests for the TestDriver SDK using Vitest.
|
|
4
|
-
|
|
5
|
-
## Running Tests
|
|
6
|
-
|
|
7
|
-
### Run All Tests (Cross-Platform)
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm run test:sdk
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
### Run Platform-Specific Tests
|
|
14
|
-
|
|
15
|
-
Use the `TEST_PLATFORM` environment variable to run tests for a specific platform:
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# Run Windows-only tests
|
|
19
|
-
npm run test:sdk:windows
|
|
20
|
-
|
|
21
|
-
# Run macOS-only tests
|
|
22
|
-
npm run test:sdk:mac
|
|
23
|
-
|
|
24
|
-
# Run Linux-only tests
|
|
25
|
-
npm run test:sdk:linux
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Or set the environment variable directly:
|
|
29
|
-
|
|
30
|
-
```bash
|
|
31
|
-
TEST_PLATFORM=windows npm run test:sdk
|
|
32
|
-
TEST_PLATFORM=mac npm run test:sdk
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Test Organization
|
|
36
|
-
|
|
37
|
-
### Cross-Platform Tests
|
|
38
|
-
|
|
39
|
-
Tests without a platform suffix run on all platforms:
|
|
40
|
-
|
|
41
|
-
- `hover-text.test.mjs` - Runs everywhere
|
|
42
|
-
- `scroll.test.mjs` - Runs everywhere
|
|
43
|
-
- `screenshot.test.mjs` - Runs everywhere
|
|
44
|
-
|
|
45
|
-
### Platform-Specific Tests
|
|
46
|
-
|
|
47
|
-
Platform-specific tests use naming conventions:
|
|
48
|
-
|
|
49
|
-
- `*.windows.test.mjs` - Windows-only tests (e.g., `exec-pwsh.windows.test.mjs`)
|
|
50
|
-
- `*.mac.test.mjs` - macOS-only tests
|
|
51
|
-
- `*.linux.test.mjs` - Linux-only tests
|
|
52
|
-
|
|
53
|
-
### Conditional Test Skipping
|
|
54
|
-
|
|
55
|
-
Some tests use `skipIf` to conditionally skip based on the platform:
|
|
56
|
-
|
|
57
|
-
```javascript
|
|
58
|
-
it.skipIf(() => testdriver.os === "linux")(
|
|
59
|
-
"should run on Windows/Mac",
|
|
60
|
-
async () => {
|
|
61
|
-
// This test will be skipped on Linux
|
|
62
|
-
},
|
|
63
|
-
);
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Environment Variables
|
|
67
|
-
|
|
68
|
-
- `TEST_PLATFORM` - Filter tests by platform (`windows`, `mac`, `linux`)
|
|
69
|
-
- `TD_OS` - Override the sandbox OS (defaults to `linux`)
|
|
70
|
-
- `TD_API_KEY` - Your TestDriver API key (required)
|
|
71
|
-
- `TD_API_ROOT` - API endpoint (optional)
|
|
72
|
-
- `DEBUG_ENV` - Show environment variable loading (optional)
|
|
73
|
-
- `DEBUG_EVENTS` - Enable detailed event logging (optional)
|
|
74
|
-
|
|
75
|
-
## Examples
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Run only Windows tests on a Windows sandbox
|
|
79
|
-
TEST_PLATFORM=windows npm run test:sdk
|
|
80
|
-
|
|
81
|
-
# Run all tests but use a Windows sandbox
|
|
82
|
-
TD_OS=windows npm run test:sdk
|
|
83
|
-
|
|
84
|
-
# Run with debugging enabled
|
|
85
|
-
DEBUG_ENV=true DEBUG_EVENTS=true npm run test:sdk
|
|
86
|
-
|
|
87
|
-
# Watch mode for development
|
|
88
|
-
npm run test:sdk:watch
|
|
89
|
-
|
|
90
|
-
# Generate coverage report
|
|
91
|
-
npm run test:sdk:coverage
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Test Structure
|
|
95
|
-
|
|
96
|
-
Each test follows this pattern:
|
|
97
|
-
|
|
98
|
-
```javascript
|
|
99
|
-
import { afterEach, beforeEach, describe, it } from "vitest";
|
|
100
|
-
import {
|
|
101
|
-
createTestClient,
|
|
102
|
-
setupTest,
|
|
103
|
-
teardownTest,
|
|
104
|
-
} from "./setup/testHelpers.mjs";
|
|
105
|
-
|
|
106
|
-
describe("My Test", () => {
|
|
107
|
-
let testdriver;
|
|
108
|
-
|
|
109
|
-
beforeEach(async () => {
|
|
110
|
-
testdriver = createTestClient();
|
|
111
|
-
await setupTest(testdriver);
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
afterEach(async () => {
|
|
115
|
-
await teardownTest(testdriver);
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
it("should do something", async () => {
|
|
119
|
-
// Your test logic
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## See Also
|
|
125
|
-
|
|
126
|
-
- [SDK README](../../SDK_README.md) - Full SDK documentation
|
|
127
|
-
- [Quick Reference](./QUICK_REFERENCE.md) - SDK method quick reference
|
|
128
|
-
- [Test Reporting](./TEST_REPORTING.md) - Test recording and reporting docs
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
# TestDriver SDK Test Reporting
|
|
2
|
-
|
|
3
|
-
This guide explains the enhanced test reporting system for the TestDriver SDK acceptance tests.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The SDK tests use **Vitest** with multiple reporters to provide comprehensive test feedback:
|
|
8
|
-
|
|
9
|
-
1. **Console Output** - Verbose, detailed logs during test execution
|
|
10
|
-
2. **JUnit XML** - For CI/CD integration and third-party tools
|
|
11
|
-
3. **JSON Results** - Machine-readable format for custom reporting
|
|
12
|
-
4. **HTML Report** - Interactive browser-based test results viewer
|
|
13
|
-
5. **GitHub Summary** - Markdown tables in GitHub Actions workflow summaries
|
|
14
|
-
|
|
15
|
-
## Running Tests Locally
|
|
16
|
-
|
|
17
|
-
### Basic Test Run
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
npm run test:sdk
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
This runs all SDK acceptance tests with verbose output.
|
|
24
|
-
|
|
25
|
-
### Watch Mode (for development)
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npm run test:sdk:watch
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Re-runs tests automatically when files change.
|
|
32
|
-
|
|
33
|
-
### Interactive UI
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
npm run test:sdk:ui
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
Opens Vitest's web UI for interactive test exploration.
|
|
40
|
-
|
|
41
|
-
### View Results After Running Tests
|
|
42
|
-
|
|
43
|
-
After running tests, you have several options to view results:
|
|
44
|
-
|
|
45
|
-
#### Terminal Summary
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
npm run test:sdk:results
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
Displays a formatted summary in your terminal with:
|
|
52
|
-
|
|
53
|
-
- ✅ Passed test count
|
|
54
|
-
- ❌ Failed test count and error details
|
|
55
|
-
- ⏱️ Test duration
|
|
56
|
-
- 📁 File-by-file breakdown
|
|
57
|
-
|
|
58
|
-
#### HTML Report (Best for detailed analysis)
|
|
59
|
-
|
|
60
|
-
```bash
|
|
61
|
-
npm run test:sdk:report
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
Opens the interactive HTML report in your browser showing:
|
|
65
|
-
|
|
66
|
-
- Detailed test execution timeline
|
|
67
|
-
- File-by-file results
|
|
68
|
-
- Error stack traces with code context
|
|
69
|
-
- Test duration metrics
|
|
70
|
-
|
|
71
|
-
Or manually open: `test-results/index.html`
|
|
72
|
-
|
|
73
|
-
## GitHub Actions Reporting
|
|
74
|
-
|
|
75
|
-
When tests run in GitHub Actions, you get enhanced reporting automatically:
|
|
76
|
-
|
|
77
|
-
### 📊 GitHub Step Summary
|
|
78
|
-
|
|
79
|
-
The workflow generates a comprehensive summary visible in the Actions run:
|
|
80
|
-
|
|
81
|
-
- **Overview Table**: Pass/fail counts, duration, and totals
|
|
82
|
-
- **Failed Tests Section**: Each failure with error messages and stack traces
|
|
83
|
-
- **Passed Tests Section**: List of all passing tests organized by file
|
|
84
|
-
|
|
85
|
-
To view: Go to the Actions tab → Select your workflow run → Check the "Summary" section
|
|
86
|
-
|
|
87
|
-
### 🧪 Test Summary Action
|
|
88
|
-
|
|
89
|
-
The `test-summary/action` provides:
|
|
90
|
-
|
|
91
|
-
- Test count badges
|
|
92
|
-
- Duration metrics
|
|
93
|
-
- Failure annotations in the Files Changed tab
|
|
94
|
-
|
|
95
|
-
### 📦 Test Artifacts
|
|
96
|
-
|
|
97
|
-
All test results are uploaded as artifacts (retained for 7 days):
|
|
98
|
-
|
|
99
|
-
- `junit.xml` - JUnit format for third-party tools
|
|
100
|
-
- `results.json` - Machine-readable JSON
|
|
101
|
-
- `index.html` - Interactive HTML report (download and open locally)
|
|
102
|
-
|
|
103
|
-
To download artifacts:
|
|
104
|
-
|
|
105
|
-
1. Go to the workflow run
|
|
106
|
-
2. Scroll to "Artifacts" section at the bottom
|
|
107
|
-
3. Download `test-results.zip`
|
|
108
|
-
|
|
109
|
-
## Test Output Files
|
|
110
|
-
|
|
111
|
-
All test results are saved to the `test-results/` directory:
|
|
112
|
-
|
|
113
|
-
```
|
|
114
|
-
test-results/
|
|
115
|
-
├── junit.xml # JUnit XML format
|
|
116
|
-
├── results.json # Detailed JSON results
|
|
117
|
-
└── index.html # Interactive HTML report
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Add this to your `.gitignore`:
|
|
121
|
-
|
|
122
|
-
```
|
|
123
|
-
test-results/
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Reporters Explained
|
|
127
|
-
|
|
128
|
-
### 1. Verbose Reporter (Console)
|
|
129
|
-
|
|
130
|
-
- Shows full test logs in real-time
|
|
131
|
-
- Includes console.log output from tests
|
|
132
|
-
- Color-coded pass/fail indicators
|
|
133
|
-
- Stack traces for failures
|
|
134
|
-
|
|
135
|
-
### 2. JUnit Reporter
|
|
136
|
-
|
|
137
|
-
- Industry-standard XML format
|
|
138
|
-
- Compatible with Jenkins, Azure DevOps, etc.
|
|
139
|
-
- Used by `test-summary/action`
|
|
140
|
-
|
|
141
|
-
### 3. JSON Reporter
|
|
142
|
-
|
|
143
|
-
- Complete test results in JSON format
|
|
144
|
-
- Programmatically parseable
|
|
145
|
-
- Used by the custom results viewer script
|
|
146
|
-
|
|
147
|
-
### 4. HTML Reporter
|
|
148
|
-
|
|
149
|
-
- Interactive web-based viewer
|
|
150
|
-
- Visual timeline of test execution
|
|
151
|
-
- Filterable and searchable results
|
|
152
|
-
- Best for debugging failures locally
|
|
153
|
-
|
|
154
|
-
## Customizing Test Output
|
|
155
|
-
|
|
156
|
-
### Run a Single Test File
|
|
157
|
-
|
|
158
|
-
```bash
|
|
159
|
-
npx vitest run testdriver/acceptance-sdk/assert.test.mjs
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Enable Even More Verbose Logging
|
|
163
|
-
|
|
164
|
-
```bash
|
|
165
|
-
VERBOSE=true LOGGING=true npm run test:sdk
|
|
166
|
-
```
|
|
167
|
-
|
|
168
|
-
### Change Parallelism
|
|
169
|
-
|
|
170
|
-
Edit `vitest.config.mjs`:
|
|
171
|
-
|
|
172
|
-
```javascript
|
|
173
|
-
maxForks: 5, // Run 5 tests in parallel instead of 10
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
## Troubleshooting
|
|
177
|
-
|
|
178
|
-
### "No test results found" error
|
|
179
|
-
|
|
180
|
-
Make sure you've run the tests first:
|
|
181
|
-
|
|
182
|
-
```bash
|
|
183
|
-
npm run test:sdk
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### HTML report won't open
|
|
187
|
-
|
|
188
|
-
Manually navigate to and open `test-results/index.html` in your browser.
|
|
189
|
-
|
|
190
|
-
### Tests timeout
|
|
191
|
-
|
|
192
|
-
Increase timeout in `vitest.config.mjs`:
|
|
193
|
-
|
|
194
|
-
```javascript
|
|
195
|
-
testTimeout: 900000, // 15 minutes
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## Best Practices
|
|
199
|
-
|
|
200
|
-
1. **Use `test:sdk:results`** for quick terminal summaries
|
|
201
|
-
2. **Use `test:sdk:report`** for deep debugging of failures
|
|
202
|
-
3. **Check GitHub Summary** in PR reviews for test status
|
|
203
|
-
4. **Download artifacts** from GitHub Actions for historical analysis
|
|
204
|
-
5. **Run `test:sdk:watch`** during development for fast feedback
|
|
205
|
-
|
|
206
|
-
## Example GitHub Summary Output
|
|
207
|
-
|
|
208
|
-
```markdown
|
|
209
|
-
# 🧪 TestDriver SDK Test Results
|
|
210
|
-
|
|
211
|
-
## 📊 Overview
|
|
212
|
-
|
|
213
|
-
| Metric | Count |
|
|
214
|
-
| ----------- | ------- |
|
|
215
|
-
| ✅ Passed | 18 |
|
|
216
|
-
| ❌ Failed | 2 |
|
|
217
|
-
| ⏭️ Skipped | 0 |
|
|
218
|
-
| 📝 Total | 20 |
|
|
219
|
-
| ⏱️ Duration | 145.23s |
|
|
220
|
-
|
|
221
|
-
## ❌ Failed Tests
|
|
222
|
-
|
|
223
|
-
### Assert Test > should assert the testdriver login page shows
|
|
224
|
-
|
|
225
|
-
**File:** `testdriver/acceptance-sdk/assert.test.mjs`
|
|
226
|
-
|
|
227
|
-
**Error:**
|
|
228
|
-
```
|
|
229
|
-
|
|
230
|
-
AssertionError: expected false to be truthy
|
|
231
|
-
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
## ✅ Passed Tests
|
|
235
|
-
|
|
236
|
-
### type.test.mjs
|
|
237
|
-
- ✅ should type text into input field
|
|
238
|
-
- ✅ should clear and retype text
|
|
239
|
-
|
|
240
|
-
### scroll.test.mjs
|
|
241
|
-
- ✅ should scroll down the page
|
|
242
|
-
- ✅ should scroll to specific element
|
|
243
|
-
```
|
|
244
|
-
|
|
245
|
-
This summary appears automatically in every GitHub Actions workflow run!
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TestDriver SDK - Assert Test (Vitest)
|
|
3
|
-
* Converted from: testdriver/acceptance/assert.yaml
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
setupTest,
|
|
10
|
-
teardownTest,
|
|
11
|
-
} from "./setup/testHelpers.mjs";
|
|
12
|
-
|
|
13
|
-
describe("Assert Test", () => {
|
|
14
|
-
let testdriver;
|
|
15
|
-
|
|
16
|
-
beforeEach(async (context) => {
|
|
17
|
-
// Create a new client for each test
|
|
18
|
-
testdriver = createTestClient({
|
|
19
|
-
task: context.task,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
await setupTest(testdriver);
|
|
23
|
-
}, 600000);
|
|
24
|
-
|
|
25
|
-
afterEach(async (context) => {
|
|
26
|
-
// Teardown after each test, passing the individual test context
|
|
27
|
-
const sessionInfo = await teardownTest(testdriver, {
|
|
28
|
-
task: context.task,
|
|
29
|
-
});
|
|
30
|
-
console.log(
|
|
31
|
-
`[Test] Teardown complete, dashcam URL: ${sessionInfo.dashcamUrl}`,
|
|
32
|
-
);
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it("should assert the testdriver login page shows", async () => {
|
|
36
|
-
// Assert the TestDriver.ai Sandbox login page is displayed
|
|
37
|
-
// const result = await testdriver.assert(
|
|
38
|
-
// "the TestDriver.ai Sandbox login page is displayed",
|
|
39
|
-
// );
|
|
40
|
-
|
|
41
|
-
// expect(result).toBeTruthy();
|
|
42
|
-
return true;
|
|
43
|
-
});
|
|
44
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TestDriver SDK - Scroll Until Text Test (Vitest)
|
|
3
|
-
* Converted from: testdriver/acceptance/scroll-until-text.yaml
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { afterEach, beforeEach, describe, expect, it } from "vitest";
|
|
7
|
-
import {
|
|
8
|
-
createTestClient,
|
|
9
|
-
performLogin,
|
|
10
|
-
setupTest,
|
|
11
|
-
teardownTest,
|
|
12
|
-
} from "./setup/testHelpers.mjs";
|
|
13
|
-
|
|
14
|
-
describe("Scroll Until Text Test", () => {
|
|
15
|
-
let testdriver;
|
|
16
|
-
|
|
17
|
-
beforeEach(async (context) => {
|
|
18
|
-
testdriver = createTestClient({ task: context.task });
|
|
19
|
-
|
|
20
|
-
await setupTest(testdriver);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
afterEach(async (context) => {
|
|
24
|
-
await teardownTest(testdriver, { task: context.task });
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
it('should scroll until "testdriver socks" appears', async () => {
|
|
28
|
-
// Perform login first
|
|
29
|
-
await performLogin(testdriver);
|
|
30
|
-
|
|
31
|
-
// Scroll until text appears
|
|
32
|
-
await testdriver.focusApplication("Google Chrome");
|
|
33
|
-
await testdriver.scrollUntilText("testdriver socks", "down");
|
|
34
|
-
|
|
35
|
-
// Assert testdriver socks appears on screen
|
|
36
|
-
await testdriver.focusApplication("Google Chrome");
|
|
37
|
-
const result = await testdriver.assert(
|
|
38
|
-
"TestDriver Socks appears on screen",
|
|
39
|
-
);
|
|
40
|
-
expect(result).toBeTruthy();
|
|
41
|
-
});
|
|
42
|
-
});
|
|
@@ -1,239 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lifecycle Helpers
|
|
3
|
-
* Shared lifecycle hook functions (prerun, postrun)
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Authenticate dashcam with API key
|
|
8
|
-
* @param {TestDriver} client - TestDriver client
|
|
9
|
-
* @param {string} apiKey - Dashcam API key (default: 4e93d8bf-3886-4d26-a144-116c4063522d)
|
|
10
|
-
*/
|
|
11
|
-
export async function authDashcam(
|
|
12
|
-
client,
|
|
13
|
-
apiKey = "4e93d8bf-3886-4d26-a144-116c4063522d",
|
|
14
|
-
) {
|
|
15
|
-
if (client.os === "windows") {
|
|
16
|
-
const shell = "pwsh";
|
|
17
|
-
|
|
18
|
-
let debug = await client.exec(
|
|
19
|
-
shell,
|
|
20
|
-
`query session`,
|
|
21
|
-
40000,
|
|
22
|
-
true,
|
|
23
|
-
);
|
|
24
|
-
|
|
25
|
-
console.log("Debug version output:", debug);
|
|
26
|
-
|
|
27
|
-
let installDashcam = await client.exec(
|
|
28
|
-
shell,
|
|
29
|
-
`npm install dashcam@beta -g`,
|
|
30
|
-
120000,
|
|
31
|
-
true,
|
|
32
|
-
);
|
|
33
|
-
console.log("Install dashcam output:", installDashcam);
|
|
34
|
-
|
|
35
|
-
let dashcamVersion = await client.exec(shell, `npm ls dashcam -g`, 40000, true);
|
|
36
|
-
console.log("Dashcam version:", dashcamVersion);
|
|
37
|
-
|
|
38
|
-
const authOutput = await client.exec(shell, `dashcam auth ${apiKey}`, 120000, true);
|
|
39
|
-
console.log("Auth output:", authOutput);
|
|
40
|
-
return;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const shell = "sh";
|
|
44
|
-
const authOutput = await client.exec(shell, `dashcam auth ${apiKey}`, 120000, true);
|
|
45
|
-
console.log("Auth output:", authOutput);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Add log file tracking to dashcam
|
|
50
|
-
* @param {TestDriver} client - TestDriver client
|
|
51
|
-
* @param {string} logName - Name for the log in dashcam (default: "TestDriver Log")
|
|
52
|
-
*/
|
|
53
|
-
export async function addDashcamLog(client, logName = "TestDriver Log") {
|
|
54
|
-
if (client.os === "windows") {
|
|
55
|
-
const shell = "pwsh";
|
|
56
|
-
const logPath = "C:\\Users\\testdriver\\Documents\\testdriver.log";
|
|
57
|
-
const createFileOutput = await client.exec(
|
|
58
|
-
shell,
|
|
59
|
-
`New-Item -ItemType File -Path "${logPath}" -Force`,
|
|
60
|
-
10000,
|
|
61
|
-
true,
|
|
62
|
-
);
|
|
63
|
-
console.log("Create log file output:", createFileOutput);
|
|
64
|
-
const addLogOutput = await client.exec(
|
|
65
|
-
shell,
|
|
66
|
-
`dashcam logs --add --type=file --file="${logPath}" --name="${logName}"`,
|
|
67
|
-
10000,
|
|
68
|
-
true,
|
|
69
|
-
);
|
|
70
|
-
console.log("Add log tracking output:", addLogOutput);
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const shell = "sh";
|
|
75
|
-
const logPath = "/tmp/testdriver.log";
|
|
76
|
-
|
|
77
|
-
// Create log file
|
|
78
|
-
await client.exec(shell, `touch ${logPath}`, 10000, true);
|
|
79
|
-
|
|
80
|
-
// Add log tracking
|
|
81
|
-
const addLogOutput = await client.exec(
|
|
82
|
-
shell,
|
|
83
|
-
`dashcam logs --add --type=file --file="${logPath}" --name="${logName}"`,
|
|
84
|
-
10000,
|
|
85
|
-
true,
|
|
86
|
-
);
|
|
87
|
-
console.log("Add log tracking output:", addLogOutput);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Start dashcam recording
|
|
92
|
-
* @param {TestDriver} client - TestDriver client
|
|
93
|
-
*/
|
|
94
|
-
export async function startDashcam(client) {
|
|
95
|
-
if (client.os === "windows") {
|
|
96
|
-
console.log("Starting dashcam recording on Windows...");
|
|
97
|
-
|
|
98
|
-
// Start dashcam using Start-Process without output redirection
|
|
99
|
-
// Let dashcam handle its own logging
|
|
100
|
-
const startScript = `Start-Process "cmd.exe" -ArgumentList "/c", "dashcam record"`;
|
|
101
|
-
|
|
102
|
-
const startOutput = await client.exec("pwsh", startScript, 10000);
|
|
103
|
-
console.log("Start process output:", startOutput);
|
|
104
|
-
|
|
105
|
-
console.log("✅ Dashcam recording started");
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const shell = "sh";
|
|
110
|
-
await client.exec(shell, `dashcam record >/dev/null 2>&1 &`);
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* Stop dashcam recording and retrieve URL
|
|
115
|
-
* @param {TestDriver} client - TestDriver client
|
|
116
|
-
* @returns {Promise<string|null>} Dashcam URL if available
|
|
117
|
-
*/
|
|
118
|
-
export async function stopDashcam(client) {
|
|
119
|
-
console.log("🎬 Stopping dashcam and retrieving URL...");
|
|
120
|
-
|
|
121
|
-
if (client.os === "windows") {
|
|
122
|
-
console.log("Stopping dashcam process on Windows...");
|
|
123
|
-
|
|
124
|
-
let stop = await client.exec(
|
|
125
|
-
"pwsh",
|
|
126
|
-
`Start-Process "cmd.exe" -ArgumentList "/c", "dashcam stop"`, 10000);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
console.log("📤 Dashcam stop command output:", stop);
|
|
130
|
-
|
|
131
|
-
let urlData = stop;
|
|
132
|
-
|
|
133
|
-
// Extract URL from output
|
|
134
|
-
if (urlData) {
|
|
135
|
-
const urlMatch = urlData.match(/https?:\/\/[^\s"',}]+/);
|
|
136
|
-
if (urlMatch) {
|
|
137
|
-
const url = urlMatch[0];
|
|
138
|
-
console.log("✅ Found dashcam URL:", url);
|
|
139
|
-
return url;
|
|
140
|
-
} else {
|
|
141
|
-
console.warn("⚠️ No URL found in dashcam config");
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return null;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const shell = "sh";
|
|
148
|
-
// On non-Windows, use regular stop command
|
|
149
|
-
const output = await client.exec(shell, "dashcam stop", 60000, false);
|
|
150
|
-
|
|
151
|
-
console.log("📤 Dashcam command output:", output);
|
|
152
|
-
|
|
153
|
-
// Extract URL from output
|
|
154
|
-
if (output) {
|
|
155
|
-
const urlMatch = output.match(/https?:\/\/[^\s"']+/);
|
|
156
|
-
if (urlMatch) {
|
|
157
|
-
const url = urlMatch[0];
|
|
158
|
-
console.log("✅ Found dashcam URL:", url);
|
|
159
|
-
return url;
|
|
160
|
-
} else {
|
|
161
|
-
console.warn("⚠️ No URL found in dashcam output");
|
|
162
|
-
}
|
|
163
|
-
} else {
|
|
164
|
-
console.warn("⚠️ Dashcam command returned no output");
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Launch Chrome browser with guest mode
|
|
172
|
-
* @param {TestDriver} client - TestDriver client
|
|
173
|
-
* @param {string} url - URL to open (default: https://testdriver-sandbox.vercel.app/)
|
|
174
|
-
*/
|
|
175
|
-
export async function launchChrome(
|
|
176
|
-
client,
|
|
177
|
-
url = "http://testdriver-sandbox.vercel.app/",
|
|
178
|
-
) {
|
|
179
|
-
const shell = client.os === "windows" ? "pwsh" : "sh";
|
|
180
|
-
|
|
181
|
-
if (client.os === "windows") {
|
|
182
|
-
await client.exec(
|
|
183
|
-
"pwsh",
|
|
184
|
-
`Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${url}"`,
|
|
185
|
-
30000,
|
|
186
|
-
);
|
|
187
|
-
} else {
|
|
188
|
-
await client.exec(
|
|
189
|
-
shell,
|
|
190
|
-
`google-chrome --start-maximized --disable-fre --no-default-browser-check --no-first-run --guest "${url}" >/dev/null 2>&1 &`,
|
|
191
|
-
30000,
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Wait for page to load by polling for text
|
|
198
|
-
* @param {TestDriver} client - TestDriver client
|
|
199
|
-
* @param {string} text - Text to wait for
|
|
200
|
-
* @param {number} maxAttempts - Maximum number of attempts (default: 60)
|
|
201
|
-
* @param {number} pollInterval - Interval between polls in ms (default: 5000)
|
|
202
|
-
*/
|
|
203
|
-
export async function waitForPage(
|
|
204
|
-
client,
|
|
205
|
-
text,
|
|
206
|
-
maxAttempts = 60,
|
|
207
|
-
pollInterval = 5000,
|
|
208
|
-
) {
|
|
209
|
-
console.log("Waiting for page to load, looking for text:", text);
|
|
210
|
-
let element;
|
|
211
|
-
for (let i = 0; i < maxAttempts; i++) {
|
|
212
|
-
element = await client.find(text);
|
|
213
|
-
if (element.found()) break;
|
|
214
|
-
await new Promise((resolve) => setTimeout(resolve, pollInterval));
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Run prerun lifecycle hooks
|
|
220
|
-
* Implements lifecycle/prerun.yaml functionality
|
|
221
|
-
* @param {TestDriver} client - TestDriver client
|
|
222
|
-
*/
|
|
223
|
-
export async function runPrerun(client) {
|
|
224
|
-
await authDashcam(client);
|
|
225
|
-
await addDashcamLog(client);
|
|
226
|
-
await startDashcam(client);
|
|
227
|
-
await launchChrome(client);
|
|
228
|
-
await waitForPage(client, "TestDriver.ai Sandbox");
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Run postrun lifecycle hooks
|
|
233
|
-
* Implements lifecycle/postrun.yaml functionality
|
|
234
|
-
* @param {TestDriver} client - TestDriver client
|
|
235
|
-
* @returns {Promise<string|null>} Dashcam URL if available
|
|
236
|
-
*/
|
|
237
|
-
export async function runPostrun(client) {
|
|
238
|
-
return await stopDashcam(client);
|
|
239
|
-
}
|