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,10 +0,0 @@
|
|
|
1
|
-
version: 5.1.1
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: execute powershell multiline
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: pwsh
|
|
8
|
-
code: |
|
|
9
|
-
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "${TD_WEBSITE}"
|
|
10
|
-
exit
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
version: 5.1.1
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: execute powershell multiline
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: js
|
|
8
|
-
code: |
|
|
9
|
-
const failingPromise = new Promise((resolve, reject) => {
|
|
10
|
-
try {
|
|
11
|
-
// Simulate some operation that fails
|
|
12
|
-
throw new Error("Something went wrong!");
|
|
13
|
-
} catch (err) {
|
|
14
|
-
reject(err);
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
// Usage
|
|
19
|
-
await failingPromise()
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
version: 5.7.7
|
|
2
|
-
session: 682f6071811bd5a322c0e6dd
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: focus chrome
|
|
5
|
-
commands:
|
|
6
|
-
- command: focus-application
|
|
7
|
-
name: Google Chrome
|
|
8
|
-
- prompt: enter a username
|
|
9
|
-
commands:
|
|
10
|
-
- command: hover-text
|
|
11
|
-
text: Username
|
|
12
|
-
description: username input field
|
|
13
|
-
action: click
|
|
14
|
-
- command: type
|
|
15
|
-
text: standard_user
|
|
16
|
-
- prompt: >-
|
|
17
|
-
enter a valid password
|
|
18
|
-
- prompt: click sign in
|
|
19
|
-
commands:
|
|
20
|
-
- command: hover-text
|
|
21
|
-
text: Sign in
|
|
22
|
-
description: sign in button
|
|
23
|
-
action: click
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
session: 685c63558f43d1527c84d053
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: assert app opens
|
|
5
|
-
commands:
|
|
6
|
-
- command: assert
|
|
7
|
-
expect: The Todo App is open
|
|
8
|
-
|
|
9
|
-
- command: hover-text
|
|
10
|
-
action: click
|
|
11
|
-
text: "click anywhere"
|
|
12
|
-
description: Label that describes to click anywhere
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
session: 685c63558f43d1527c84d053
|
|
3
|
-
steps:
|
|
4
|
-
# Start the instance and install APK
|
|
5
|
-
- prompt: Download and Start APK
|
|
6
|
-
commands:
|
|
7
|
-
- command: exec
|
|
8
|
-
lang: pwsh
|
|
9
|
-
code: |
|
|
10
|
-
# Authenticate Gmsaas
|
|
11
|
-
gmsaas auth token ${TD_GENYMOTION_KEY}
|
|
12
|
-
gmsaas config set android-sdk-path C:\Android
|
|
13
|
-
|
|
14
|
-
# Start instance, with name 'td-test'
|
|
15
|
-
$instance=$(gmsaas instances start 3990323a-1e9a-49df-ad87-6947f7fc166e td-test)
|
|
16
|
-
gmsaas instances adbconnect $instance
|
|
17
|
-
|
|
18
|
-
# Save Instance ID and echo value
|
|
19
|
-
Write-Output $instance | Out-File -FilePath C:\instance_id
|
|
20
|
-
Write-Output "Instance ID: $instance"
|
|
21
|
-
|
|
22
|
-
# Get Display Link
|
|
23
|
-
gmsaas instances display -y $instance
|
|
24
|
-
$clipboard = Get-Clipboard
|
|
25
|
-
$escapedUrl = '"' + $clipboard + '"'
|
|
26
|
-
|
|
27
|
-
# Open Chrome to Emulator
|
|
28
|
-
Start-Process 'C:/Program Files/Google/Chrome/Application/chrome.exe' -ArgumentList '--start-maximized',$escapedUrl
|
|
29
|
-
|
|
30
|
-
- command: exec
|
|
31
|
-
lang: pwsh
|
|
32
|
-
code: |
|
|
33
|
-
# Download + install APK via cmd
|
|
34
|
-
$apk_url = "https://v6-demo-assets.s3.us-east-2.amazonaws.com/todo-1-0-0.apk"
|
|
35
|
-
Start-Process cmd.exe -ArgumentList "/c curl -o C:\app.apk $apk_url && adb install C:\app.apk"
|
|
36
|
-
|
|
37
|
-
# Get Package name
|
|
38
|
-
$output = & 'C:\Android\build-tools\36.0.0\aapt.exe' dump badging C:\app.apk
|
|
39
|
-
$package = ($output | Select-String "package: name='([^']+)'" ).Matches.Groups[1].Value
|
|
40
|
-
|
|
41
|
-
# Launch Application via cmd
|
|
42
|
-
Start-Process cmd.exe -ArgumentList "/c adb shell monkey -p $package -c android.intent.category.LAUNCHER 1"
|
|
43
|
-
|
|
44
|
-
# Make Sure Window is open
|
|
45
|
-
- command: wait-for-text
|
|
46
|
-
text: gmsaas
|
|
47
|
-
timeout: 60000
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# Android Example (Preview)
|
|
2
|
-
|
|
3
|
-
This is a preview of TestDriver mobile support.
|
|
4
|
-
|
|
5
|
-
This example [Genymotion](https://www.genymotion.com/) cloud instance, downloads and installs an APK, uploads it to genymotion, and provides it as input to TestDriver.
|
|
6
|
-
|
|
7
|
-
This example only needs a Genymotion Key. Set it in `TD_GENYMOTION_KEY` within your `.env`.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: launch chrome
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: pwsh
|
|
8
|
-
code: |
|
|
9
|
-
Write-Host "Cloning Chrome extension samples..."
|
|
10
|
-
$repoUrl = "https://github.com/GoogleChrome/chrome-extensions-samples.git"
|
|
11
|
-
$clonePath = Join-Path $env:TEMP "chrome-extensions-samples"
|
|
12
|
-
if (!(Test-Path $clonePath)) {
|
|
13
|
-
git clone $repoUrl $clonePath
|
|
14
|
-
} else {
|
|
15
|
-
Write-Host "Repo already cloned at $clonePath"
|
|
16
|
-
}
|
|
17
|
-
Write-Host "Repo ready at $clonePath"
|
|
18
|
-
|
|
19
|
-
Write-Host "Initializing new npm project..."
|
|
20
|
-
cd $env:TEMP
|
|
21
|
-
Write-Host "Changed directory to TEMP: $env:TEMP"
|
|
22
|
-
|
|
23
|
-
Write-Host "Running 'npm init -y'..."
|
|
24
|
-
npm init -y
|
|
25
|
-
|
|
26
|
-
Write-Host "Installing dependencies: @puppeteer/browsers and dashcam-chrome..."
|
|
27
|
-
npm install @puppeteer/browsers dashcam-chrome
|
|
28
|
-
|
|
29
|
-
Write-Host "Installing Chromium via '@puppeteer/browsers'..."
|
|
30
|
-
npx @puppeteer/browsers install chrome
|
|
31
|
-
|
|
32
|
-
# Define paths - redefining variables for this script
|
|
33
|
-
$extensionPath = Join-Path (Join-Path $env:TEMP "chrome-extensions-samples") "functional-samples/tutorial.hello-world"
|
|
34
|
-
$profilePath = Join-Path $env:TEMP "chrome-profile-$(Get-Random)"
|
|
35
|
-
$defaultDir = Join-Path $profilePath "Default"
|
|
36
|
-
$prefsPath = Join-Path $defaultDir "Preferences"
|
|
37
|
-
|
|
38
|
-
Write-Host "Extension path (hello-world): $extensionPath"
|
|
39
|
-
Write-Host "Chrome user data dir: $profilePath"
|
|
40
|
-
|
|
41
|
-
# Create a clean profile + Preferences to disable password manager & autofill
|
|
42
|
-
Remove-Item $profilePath -Recurse -Force -ErrorAction SilentlyContinue
|
|
43
|
-
New-Item $defaultDir -ItemType Directory -Force | Out-Null
|
|
44
|
-
|
|
45
|
-
$prefs = @{
|
|
46
|
-
"credentials_enable_service" = $false
|
|
47
|
-
"profile" = @{
|
|
48
|
-
"password_manager_enabled" = $false
|
|
49
|
-
}
|
|
50
|
-
"autofill" = @{
|
|
51
|
-
"profile_enabled" = $false
|
|
52
|
-
"address_enabled" = $false
|
|
53
|
-
"credit_card_enabled" = $false
|
|
54
|
-
}
|
|
55
|
-
} | ConvertTo-Json -Depth 6
|
|
56
|
-
|
|
57
|
-
# Write Preferences before Chrome starts (ASCII/UTF8 is fine)
|
|
58
|
-
$prefs | Set-Content -Path $prefsPath -Encoding ASCII
|
|
59
|
-
|
|
60
|
-
# Build args - load only hello-world extension
|
|
61
|
-
$chromeArgs = @(
|
|
62
|
-
"--start-maximized",
|
|
63
|
-
"--load-extension=$extensionPath",
|
|
64
|
-
"--user-data-dir=$profilePath",
|
|
65
|
-
"--no-first-run",
|
|
66
|
-
"--no-default-browser-check",
|
|
67
|
-
"--disable-infobars"
|
|
68
|
-
"https://testdriver.ai"
|
|
69
|
-
) -join ' '
|
|
70
|
-
|
|
71
|
-
Start-Process "cmd.exe" -ArgumentList "/c", "npx @puppeteer/browsers launch chrome -- $chromeArgs"
|
|
72
|
-
|
|
73
|
-
Write-Host "Script complete."
|
|
74
|
-
exit
|
|
File without changes
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: download and install Spotify
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: pwsh
|
|
8
|
-
code: |
|
|
9
|
-
$spotifyUrl = "https://download.scdn.co/SpotifySetup.exe"
|
|
10
|
-
$installerPath = "$env:TEMP\SpotifySetup.exe"
|
|
11
|
-
|
|
12
|
-
Write-Host "Downloading Spotify installer..."
|
|
13
|
-
Invoke-WebRequest -Uri $spotifyUrl -OutFile $installerPath -UseBasicParsing
|
|
14
|
-
|
|
15
|
-
Write-Host "Downloaded to $installerPath"
|
|
16
|
-
- command: exec
|
|
17
|
-
lang: pwsh
|
|
18
|
-
code: |
|
|
19
|
-
$installerPath = "$env:TEMP\SpotifySetup.exe"
|
|
20
|
-
|
|
21
|
-
if (-Not (Test-Path $installerPath)) {
|
|
22
|
-
Write-Error "Spotify installer not found at $installerPath"
|
|
23
|
-
exit 1
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
Write-Host "Installing Spotify silently..."
|
|
27
|
-
$process = Start-Process -FilePath $installerPath -ArgumentList "/silent" -Wait -PassThru
|
|
28
|
-
|
|
29
|
-
if ($process.ExitCode -eq 0) {
|
|
30
|
-
Write-Host "Spotify installed successfully."
|
|
31
|
-
Remove-Item $installerPath -Force
|
|
32
|
-
exit 0
|
|
33
|
-
} else {
|
|
34
|
-
Write-Error "Installation failed with exit code $($process.ExitCode)"
|
|
35
|
-
exit $process.ExitCode
|
|
36
|
-
}
|
|
37
|
-
- command: exec
|
|
38
|
-
lang: pwsh
|
|
39
|
-
code: |
|
|
40
|
-
# patch-path.ps1
|
|
41
|
-
|
|
42
|
-
$spotifyPath = "$env:APPDATA\Spotify"
|
|
43
|
-
|
|
44
|
-
if (-not ($env:PATH -like "*$spotifyPath*")) {
|
|
45
|
-
Write-Host "Temporarily appending Spotify to PATH for current session."
|
|
46
|
-
$env:PATH += ";$spotifyPath"
|
|
47
|
-
} else {
|
|
48
|
-
Write-Host "Spotify path already in PATH."
|
|
49
|
-
}
|
|
50
|
-
- command: exec
|
|
51
|
-
lang: pwsh
|
|
52
|
-
code: |
|
|
53
|
-
# launch-spotify.ps1
|
|
54
|
-
|
|
55
|
-
Write-Host "Launching Spotify..."
|
|
56
|
-
$spotifyExe = "$env:APPDATA\Spotify\Spotify.exe"
|
|
57
|
-
|
|
58
|
-
if (Test-Path $spotifyExe) {
|
|
59
|
-
Start-Process $spotifyExe
|
|
60
|
-
Write-Host "Spotify launched successfully."
|
|
61
|
-
} else {
|
|
62
|
-
Write-Error "Spotify executable not found at $spotifyExe"
|
|
63
|
-
exit 1
|
|
64
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: download and run docker vs code
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: pwsh
|
|
8
|
-
code: |
|
|
9
|
-
$vsCodeUrl = "https://update.code.visualstudio.com/latest/win32-x64-user/stable"
|
|
10
|
-
$installerPath = "$env:TEMP\VSCodeSetup.exe"
|
|
11
|
-
|
|
12
|
-
Write-Host "Downloading Visual Studio Code installer..."
|
|
13
|
-
Invoke-WebRequest -Uri $vsCodeUrl -OutFile $installerPath -UseBasicParsing
|
|
14
|
-
|
|
15
|
-
Write-Host "Downloaded to $installerPath"
|
|
16
|
-
- command: exec
|
|
17
|
-
lang: pwsh
|
|
18
|
-
code: |
|
|
19
|
-
$installerPath = "$env:TEMP\VSCodeSetup.exe"
|
|
20
|
-
|
|
21
|
-
if (-Not (Test-Path $installerPath)) {
|
|
22
|
-
Write-Error "VS Code installer not found at $installerPath"
|
|
23
|
-
exit 1
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
Write-Host "Installing VS Code silently..."
|
|
27
|
-
$process = Start-Process -FilePath $installerPath -ArgumentList "/silent" -Wait -PassThru
|
|
28
|
-
|
|
29
|
-
if ($process.ExitCode -eq 0) {
|
|
30
|
-
Write-Host "VS Code installed successfully."
|
|
31
|
-
Remove-Item $installerPath -Force
|
|
32
|
-
exit 0
|
|
33
|
-
} else {
|
|
34
|
-
Write-Error "Installation failed with exit code $($process.ExitCode)"
|
|
35
|
-
exit $process.ExitCode
|
|
36
|
-
}
|
|
37
|
-
- command: exec
|
|
38
|
-
lang: pwsh
|
|
39
|
-
code: |
|
|
40
|
-
# patch-path.ps1
|
|
41
|
-
|
|
42
|
-
$codePath = "$env:LOCALAPPDATA\Programs\Microsoft VS Code\bin"
|
|
43
|
-
|
|
44
|
-
if (-not ($env:PATH -like "*$codePath*")) {
|
|
45
|
-
Write-Host "Temporarily appending VS Code bin to PATH for current session."
|
|
46
|
-
$env:PATH += ";$codePath"
|
|
47
|
-
} else {
|
|
48
|
-
Write-Host "VS Code path already in PATH."
|
|
49
|
-
}
|
|
50
|
-
- command: exec
|
|
51
|
-
lang: pwsh
|
|
52
|
-
code: |
|
|
53
|
-
# install-docker-extension.ps1
|
|
54
|
-
|
|
55
|
-
$extensionId = "ms-azuretools.vscode-docker"
|
|
56
|
-
|
|
57
|
-
Write-Host "Installing Docker extension for VS Code..."
|
|
58
|
-
$process = Start-Process "code" -ArgumentList "--install-extension $extensionId --force" -Wait -PassThru
|
|
59
|
-
|
|
60
|
-
if ($process.ExitCode -eq 0) {
|
|
61
|
-
Write-Host "Extension installed successfully."
|
|
62
|
-
exit 0
|
|
63
|
-
} else {
|
|
64
|
-
Write-Error "Extension installation failed with exit code $($process.ExitCode)"
|
|
65
|
-
exit $process.ExitCode
|
|
66
|
-
}
|
|
67
|
-
- command: exec
|
|
68
|
-
lang: pwsh
|
|
69
|
-
code: |
|
|
70
|
-
# launch-vscode.ps1
|
|
71
|
-
|
|
72
|
-
Write-Host "Launching Visual Studio Code..."
|
|
73
|
-
Start-Process "code"
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
steps:
|
|
3
|
-
- prompt: launch chrome
|
|
4
|
-
commands:
|
|
5
|
-
- command: exec
|
|
6
|
-
lang: pwsh
|
|
7
|
-
code: |
|
|
8
|
-
npm install dashcam@beta -g
|
|
9
|
-
npm list -g dashcam
|
|
10
|
-
- command: exec
|
|
11
|
-
lang: pwsh
|
|
12
|
-
code: dashcam track --name=TestDriver --type=app --pattern="C:\Users\testdriver\Documents\testdriver.log"
|
|
13
|
-
- command: exec
|
|
14
|
-
lang: pwsh
|
|
15
|
-
code: dashcam start
|
|
16
|
-
- command: exec
|
|
17
|
-
lang: pwsh
|
|
18
|
-
code: |
|
|
19
|
-
Start-Process "C:/Program Files/Google/Chrome/Application/chrome.exe" -ArgumentList "--start-maximized", "--guest", "https://testdriver-sandbox.vercel.app/login"
|
|
20
|
-
- command: wait-for-text
|
|
21
|
-
text: "TestDriver.ai Sandbox"
|
|
22
|
-
timeout: 60000
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
version: 6.0.0
|
|
2
|
-
steps:
|
|
3
|
-
- prompt: dashcam
|
|
4
|
-
commands:
|
|
5
|
-
- command: exec
|
|
6
|
-
lang: sh
|
|
7
|
-
code: |
|
|
8
|
-
dashcam auth 4e93d8bf-3886-4d26-a144-116c4063522d
|
|
9
|
-
dashcam logs --add --name="TestDriver" --type=file --file="/tmp/testdriver.log"
|
|
10
|
-
- command: exec
|
|
11
|
-
lang: sh
|
|
12
|
-
code: dashcam record > /dev/null 2>&1 &
|
|
13
|
-
- command: exec
|
|
14
|
-
lang: sh
|
|
15
|
-
code: dashcam logs --add --name=TestDriver --type=file --file="/tmp/testdriver.log"
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
version: 5.1.1
|
|
2
|
-
session: 67f00511acbd9ccac373edf7
|
|
3
|
-
steps:
|
|
4
|
-
- prompt: launch chrome
|
|
5
|
-
commands:
|
|
6
|
-
- command: exec
|
|
7
|
-
lang: sh
|
|
8
|
-
code: |
|
|
9
|
-
npm install dashcam@beta -g
|
|
10
|
-
npm list -g dashcam
|
|
11
|
-
- command: exec
|
|
12
|
-
lang: sh
|
|
13
|
-
code: |
|
|
14
|
-
google-chrome \
|
|
15
|
-
--start-maximized \
|
|
16
|
-
--disable-infobars \
|
|
17
|
-
--disable-fre \
|
|
18
|
-
--no-default-browser-check \
|
|
19
|
-
--no-first-run \
|
|
20
|
-
--guest \
|
|
21
|
-
"https://testdriver-sandbox.vercel.app/" \
|
|
22
|
-
>/dev/null 2>&1 &
|
|
23
|
-
- command: wait-for-text
|
|
24
|
-
text: testdriver-sandbox
|
|
25
|
-
timeout: 60000
|
|
Binary file
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# TestDriver MCP Server - AI Agent Guidelines
|
|
2
|
-
|
|
3
|
-
## Essential Workflow
|
|
4
|
-
|
|
5
|
-
1. **Always connect first**: Call `testdriver_connect` before any other operations
|
|
6
|
-
2. **Verify with screenshots**: Screenshots are automatically captured after actions - review them to confirm success
|
|
7
|
-
3. **Wait before interacting**: Use `waitForText` or `waitForImage` before clicking/typing to ensure elements are ready
|
|
8
|
-
4. **Assert expectations**: After critical actions, use `assert` to verify the expected outcome
|
|
9
|
-
5. **Share debugger URL**: After connecting, share the debugger URL with users so they can watch in real-time
|
|
10
|
-
|
|
11
|
-
## Common Patterns
|
|
12
|
-
|
|
13
|
-
### Login Flow
|
|
14
|
-
|
|
15
|
-
```
|
|
16
|
-
1. connect() - start sandbox
|
|
17
|
-
2. getScreenshot() - see initial state
|
|
18
|
-
3. hoverText("Username") - click username field
|
|
19
|
-
4. type("user@example.com") - enter username
|
|
20
|
-
5. hoverText("Password") - click password field
|
|
21
|
-
6. type("password123") - enter password
|
|
22
|
-
7. hoverText("Login") - click login button
|
|
23
|
-
8. waitForText("Welcome") - wait for success
|
|
24
|
-
9. assert("the user is logged in") - verify outcome
|
|
25
|
-
10. getScreenshot() - capture final state
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Form Testing
|
|
29
|
-
|
|
30
|
-
```
|
|
31
|
-
1. Always wait for form elements before interacting
|
|
32
|
-
2. Take screenshots before and after form submission
|
|
33
|
-
3. Assert success/error messages appear
|
|
34
|
-
4. Use remember() to capture dynamic values (order IDs, timestamps, etc.)
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Best Practices
|
|
38
|
-
|
|
39
|
-
- **Be patient**: Always wait for elements before clicking
|
|
40
|
-
- **Be specific**: Use descriptive text in hoverText/assert (e.g., "the blue Submit button" not just "Submit")
|
|
41
|
-
- **Verify everything**: Check screenshots to ensure actions succeeded
|
|
42
|
-
- **Handle errors**: If an action fails, take a screenshot to diagnose
|
|
43
|
-
- **Save tests**: Use `createTestFromActions` to save successful workflows
|
|
44
|
-
|
|
45
|
-
## Common Mistakes to Avoid
|
|
46
|
-
|
|
47
|
-
❌ Don't click elements that may not have loaded yet
|
|
48
|
-
✅ Do use `waitForText` first
|
|
49
|
-
|
|
50
|
-
❌ Don't assume actions succeeded without verification
|
|
51
|
-
✅ Do check screenshots and use assertions
|
|
52
|
-
|
|
53
|
-
❌ Don't chain many actions without pauses
|
|
54
|
-
✅ Do add small waits between rapid actions
|
|
55
|
-
|
|
56
|
-
❌ Don't forget to share the debugger URL
|
|
57
|
-
✅ Do tell users where to watch the live VM screen
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* TestDriver SDK Test Results Viewer
|
|
5
|
-
* Displays a formatted summary of test results from the JSON output
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import fs from "fs";
|
|
9
|
-
import path from "path";
|
|
10
|
-
|
|
11
|
-
const RESULTS_PATH = "test-results/results.json";
|
|
12
|
-
|
|
13
|
-
function formatDuration(ms) {
|
|
14
|
-
if (ms < 1000) return `${ms}ms`;
|
|
15
|
-
return `${(ms / 1000).toFixed(2)}s`;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
function displayResults() {
|
|
19
|
-
if (!fs.existsSync(RESULTS_PATH)) {
|
|
20
|
-
console.error("❌ No test results found. Run tests first:");
|
|
21
|
-
console.error(" npm run test:sdk");
|
|
22
|
-
process.exit(1);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const results = JSON.parse(fs.readFileSync(RESULTS_PATH, "utf8"));
|
|
26
|
-
|
|
27
|
-
const total = results.numTotalTests || 0;
|
|
28
|
-
const passed = results.numPassedTests || 0;
|
|
29
|
-
const failed = results.numFailedTests || 0;
|
|
30
|
-
const skipped = results.numPendingTests || 0;
|
|
31
|
-
const duration = results.testResults?.reduce(
|
|
32
|
-
(sum, file) => sum + (file.endTime - file.startTime),
|
|
33
|
-
0,
|
|
34
|
-
);
|
|
35
|
-
|
|
36
|
-
console.log("\n🧪 TestDriver SDK Test Results");
|
|
37
|
-
console.log("═".repeat(50));
|
|
38
|
-
console.log(`✅ Passed: ${passed}/${total}`);
|
|
39
|
-
console.log(`❌ Failed: ${failed}/${total}`);
|
|
40
|
-
console.log(`⏭️ Skipped: ${skipped}/${total}`);
|
|
41
|
-
console.log(`⏱️ Duration: ${formatDuration(duration)}`);
|
|
42
|
-
console.log("═".repeat(50));
|
|
43
|
-
|
|
44
|
-
if (failed > 0) {
|
|
45
|
-
console.log("\n❌ Failed Tests:\n");
|
|
46
|
-
results.testResults?.forEach((file) => {
|
|
47
|
-
const failedTests =
|
|
48
|
-
file.assertionResults?.filter((test) => test.status === "failed") || [];
|
|
49
|
-
|
|
50
|
-
if (failedTests.length > 0) {
|
|
51
|
-
console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
|
|
52
|
-
failedTests.forEach((test) => {
|
|
53
|
-
console.log(` ❌ ${test.title}`);
|
|
54
|
-
console.log(` Duration: ${formatDuration(test.duration)}`);
|
|
55
|
-
if (test.failureMessages?.length > 0) {
|
|
56
|
-
console.log("\n Error:");
|
|
57
|
-
test.failureMessages.forEach((msg) => {
|
|
58
|
-
// Truncate very long error messages
|
|
59
|
-
const truncated =
|
|
60
|
-
msg.length > 500 ? msg.substring(0, 500) + "..." : msg;
|
|
61
|
-
console.log(
|
|
62
|
-
" " + truncated.split("\n").join("\n ") + "\n",
|
|
63
|
-
);
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
console.log();
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (passed > 0) {
|
|
73
|
-
console.log("✅ Passed Tests:\n");
|
|
74
|
-
results.testResults?.forEach((file) => {
|
|
75
|
-
const passedTests =
|
|
76
|
-
file.assertionResults?.filter((test) => test.status === "passed") || [];
|
|
77
|
-
|
|
78
|
-
if (passedTests.length > 0) {
|
|
79
|
-
console.log(`📁 ${path.relative(process.cwd(), file.name)}`);
|
|
80
|
-
passedTests.forEach((test) => {
|
|
81
|
-
console.log(` ✅ ${test.title} (${formatDuration(test.duration)})`);
|
|
82
|
-
});
|
|
83
|
-
console.log();
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
console.log("\n📊 View detailed HTML report:");
|
|
89
|
-
console.log(" npm run test:sdk:report");
|
|
90
|
-
console.log(" or open: test-results/index.html\n");
|
|
91
|
-
|
|
92
|
-
// Exit with error code if tests failed
|
|
93
|
-
process.exit(failed > 0 ? 1 : 0);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
displayResults();
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
extends: existence
|
|
2
|
-
message: Use 'AM' or 'PM' (preceded by a space).
|
|
3
|
-
link: https://docs.microsoft.com/en-us/style-guide/a-z-word-list-term-collections/term-collections/date-time-terms
|
|
4
|
-
level: error
|
|
5
|
-
nonword: true
|
|
6
|
-
tokens:
|
|
7
|
-
- '\d{1,2}[AP]M'
|
|
8
|
-
- '\d{1,2} ?[ap]m'
|
|
9
|
-
- '\d{1,2} ?[aApP]\.[mM]\.'
|