testdriverai 6.2.2 → 7.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/acceptance-linux.yml +75 -0
- package/.github/workflows/acceptance-sdk-tests.yml +133 -0
- package/.vscode/settings.json +5 -1
- package/MIGRATION.md +389 -0
- package/PLUGIN_MIGRATION.md +222 -0
- package/PROMPT_CACHE.md +200 -0
- package/SDK_LOGGING.md +222 -0
- package/SDK_MIGRATION.md +474 -0
- package/SDK_README.md +1122 -0
- package/{testdriver → _testdriver}/acceptance/drag-and-drop.yaml +2 -2
- package/{testdriver → _testdriver}/acceptance/snippets/login.yaml +1 -1
- package/_testdriver/examples/desktop/lifecycle/prerun.yaml +0 -0
- package/{testdriver → _testdriver}/examples/web/lifecycle/prerun.yaml +6 -1
- package/{testdriver → _testdriver}/lifecycle/postrun.yaml +3 -2
- package/_testdriver/lifecycle/prerun.yaml +15 -0
- package/{testdriver → _testdriver}/lifecycle/provision.yaml +7 -2
- package/agent/index.js +258 -68
- package/agent/interface.js +15 -0
- package/agent/lib/cache.js +142 -0
- package/agent/lib/commander.js +1 -39
- package/agent/lib/commands.js +143 -188
- package/agent/lib/redraw.js +6 -3
- package/agent/lib/sandbox.js +19 -5
- package/agent/lib/sdk.js +1 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debug-screenshot-1763401388589.png +0 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/QUICK_START_TEST_RECORDING.md +215 -0
- package/docs/SDK_AWESOME_LOGS.md +468 -0
- package/docs/TEST_RECORDING.md +388 -0
- package/docs/docs.json +232 -152
- package/docs/sdk-browser-rendering.md +167 -0
- package/docs/v6/getting-started/self-hosting.mdx +407 -0
- package/docs/{guide → v6/guide}/dashcam.mdx +1 -1
- package/docs/{guide → v6/guide}/environment-variables.mdx +4 -5
- package/docs/{guide → v6/guide}/lifecycle.mdx +1 -1
- package/docs/v6/overview/comparison.mdx +101 -0
- package/docs/v7/README.md +135 -0
- package/docs/v7/api/ai.mdx +205 -0
- package/docs/v7/api/assert.mdx +285 -0
- package/docs/v7/api/assertions.mdx +403 -0
- package/docs/v7/api/click.mdx +287 -0
- package/docs/v7/api/client.mdx +322 -0
- package/docs/v7/api/elements.mdx +479 -0
- package/docs/v7/api/exec.mdx +346 -0
- package/docs/v7/api/find.mdx +316 -0
- package/docs/v7/api/focusApplication.mdx +294 -0
- package/docs/v7/api/hover.mdx +279 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/sandbox.mdx +404 -0
- package/docs/v7/api/scroll.mdx +300 -0
- package/docs/v7/api/type.mdx +314 -0
- package/docs/v7/commands/assert.mdx +45 -0
- package/docs/v7/commands/exec.mdx +282 -0
- package/docs/v7/commands/focus-application.mdx +44 -0
- package/docs/v7/commands/hover-image.mdx +69 -0
- package/docs/v7/commands/hover-text.mdx +47 -0
- package/docs/v7/commands/if.mdx +53 -0
- package/docs/v7/commands/match-image.mdx +67 -0
- package/docs/v7/commands/press-keys.mdx +87 -0
- package/docs/v7/commands/remember.mdx +49 -0
- package/docs/v7/commands/run.mdx +44 -0
- package/docs/v7/commands/scroll-until-image.mdx +66 -0
- package/docs/v7/commands/scroll-until-text.mdx +60 -0
- package/docs/v7/commands/scroll.mdx +69 -0
- package/docs/v7/commands/type.mdx +45 -0
- package/docs/v7/commands/wait-for-image.mdx +54 -0
- package/docs/v7/commands/wait-for-text.mdx +48 -0
- package/docs/v7/commands/wait.mdx +45 -0
- package/docs/v7/getting-started/quickstart.mdx +199 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/playwright.mdx +342 -0
- package/eslint.config.js +19 -1
- package/examples/run-tests-with-recording.sh +70 -0
- package/examples/screenshot-example.js +63 -0
- package/examples/sdk-awesome-logs-demo.js +177 -0
- package/examples/sdk-cache-thresholds.js +96 -0
- package/examples/sdk-element-properties.js +155 -0
- package/examples/sdk-simple-example.js +65 -0
- package/examples/test-recording-example.test.js +166 -0
- package/interfaces/cli/lib/base.js +10 -4
- package/interfaces/logger.js +2 -1
- package/interfaces/shared-test-state.mjs +69 -0
- package/interfaces/vitest-plugin.mjs +744 -0
- package/mcp-server/AI_GUIDELINES.md +57 -0
- package/package.json +18 -5
- package/schema.json +8 -29
- package/scripts/view-test-results.mjs +96 -0
- package/sdk-log-formatter.js +714 -0
- package/sdk.d.ts +735 -0
- package/sdk.js +1906 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/test/mcp-example-test.yaml +27 -0
- package/test-find-api.js +73 -0
- package/test-prompt-cache.js +96 -0
- package/test-sandbox-render.js +28 -0
- package/test-sdk-methods.js +15 -0
- package/test-sdk-refactor.js +53 -0
- package/test-stack-trace.mjs +57 -0
- package/testdriver/acceptance-sdk/QUICK_REFERENCE.md +61 -0
- package/testdriver/acceptance-sdk/README.md +128 -0
- package/testdriver/acceptance-sdk/TEST_REPORTING.md +245 -0
- package/testdriver/acceptance-sdk/assert.test.mjs +44 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +70 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +38 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +55 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +71 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +69 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +48 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +41 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +43 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +50 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +41 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +48 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +64 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +45 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +52 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +51 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +42 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +50 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/lifecycleHelpers.mjs +239 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +648 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +84 -0
- package/verify-element-api.js +89 -0
- package/verify-types.js +0 -0
- package/vitest.config.example.js +19 -0
- package/vitest.config.mjs +65 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/docs/overview/comparison.mdx +0 -82
- package/testdriver/lifecycle/prerun.yaml +0 -17
- /package/{testdriver/examples/desktop/lifecycle/prerun.yaml → .env.example} +0 -0
- /package/{testdriver → _testdriver}/acceptance/assert.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/dashcam.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/embed.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-js.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-output.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/exec-shell.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/focus-window.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text-with-description.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/if-else.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/match-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/press-keys.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/prompt.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/remember.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/screenshots/cart.png +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-keyboard.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-image.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll-until-text.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/scroll.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/snippets/match-cart.yaml +0 -0
- /package/{testdriver → _testdriver}/acceptance/type.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/failure.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/hover-text.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/prerun.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/behavior/secrets.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/dashcam-chrome.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/exec-pwsh-multiline.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-exception.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/js-promise.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-in-middle.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/prompt-nested.yaml +0 -0
- /package/{testdriver → _testdriver}/edge-cases/success-test.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/example.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/postrun.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/android/readme.md +0 -0
- /package/{testdriver → _testdriver}/examples/chrome-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/desktop/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/vscode-extension/lifecycle/provision.yaml +0 -0
- /package/{testdriver → _testdriver}/examples/web/lifecycle/postrun.yaml +0 -0
- /package/docs/{account → v6/account}/dashboard.mdx +0 -0
- /package/docs/{account → v6/account}/enterprise.mdx +0 -0
- /package/docs/{account → v6/account}/pricing.mdx +0 -0
- /package/docs/{account → v6/account}/projects.mdx +0 -0
- /package/docs/{account → v6/account}/team.mdx +0 -0
- /package/docs/{action → v6/action}/ami.mdx +0 -0
- /package/docs/{action → v6/action}/performance.mdx +0 -0
- /package/docs/{action → v6/action}/secrets.mdx +0 -0
- /package/docs/{apps → v6/apps}/chrome-extensions.mdx +0 -0
- /package/docs/{apps → v6/apps}/desktop-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/mobile-apps.mdx +0 -0
- /package/docs/{apps → v6/apps}/static-websites.mdx +0 -0
- /package/docs/{apps → v6/apps}/tauri-apps.mdx +0 -0
- /package/docs/{bugs → v6/bugs}/jira.mdx +0 -0
- /package/docs/{cli → v6/cli}/overview.mdx +0 -0
- /package/docs/{commands → v6/commands}/assert.mdx +0 -0
- /package/docs/{commands → v6/commands}/exec.mdx +0 -0
- /package/docs/{commands → v6/commands}/focus-application.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/hover-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/if.mdx +0 -0
- /package/docs/{commands → v6/commands}/match-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/press-keys.mdx +0 -0
- /package/docs/{commands → v6/commands}/remember.mdx +0 -0
- /package/docs/{commands → v6/commands}/run.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll-until-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/scroll.mdx +0 -0
- /package/docs/{commands → v6/commands}/type.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-image.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait-for-text.mdx +0 -0
- /package/docs/{commands → v6/commands}/wait.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/junit.mdx +0 -0
- /package/docs/{exporting → v6/exporting}/playwright.mdx +0 -0
- /package/docs/{features → v6/features}/auto-healing.mdx +0 -0
- /package/docs/{features → v6/features}/generation.mdx +0 -0
- /package/docs/{features → v6/features}/parallel-testing.mdx +0 -0
- /package/docs/{features → v6/features}/reusable-snippets.mdx +0 -0
- /package/docs/{features → v6/features}/selectorless.mdx +0 -0
- /package/docs/{features → v6/features}/visual-assertions.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/ci.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/cli.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/editing.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/playwright.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/running.mdx +0 -0
- /package/docs/{getting-started → v6/getting-started}/vscode.mdx +0 -0
- /package/docs/{guide → v6/guide}/assertions.mdx +0 -0
- /package/docs/{guide → v6/guide}/authentication.mdx +0 -0
- /package/docs/{guide → v6/guide}/code.mdx +0 -0
- /package/docs/{guide → v6/guide}/locating.mdx +0 -0
- /package/docs/{guide → v6/guide}/protips.mdx +0 -0
- /package/docs/{guide → v6/guide}/variables.mdx +0 -0
- /package/docs/{guide → v6/guide}/waiting.mdx +0 -0
- /package/docs/{importing → v6/importing}/csv.mdx +0 -0
- /package/docs/{importing → v6/importing}/gherkin.mdx +0 -0
- /package/docs/{importing → v6/importing}/jira.mdx +0 -0
- /package/docs/{importing → v6/importing}/testrail.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/electron.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/netlify.mdx +0 -0
- /package/docs/{integrations → v6/integrations}/vercel.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/explore.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/run.mdx +0 -0
- /package/docs/{interactive → v6/interactive}/save.mdx +0 -0
- /package/docs/{overview → v6/overview}/faq.mdx +0 -0
- /package/docs/{overview → v6/overview}/performance.mdx +0 -0
- /package/docs/{overview → v6/overview}/quickstart.mdx +0 -0
- /package/docs/{overview → v6/overview}/what-is-testdriver.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/ai-chatbot.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/cookie-banner.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/file-upload.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/form-filling.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/log-in.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/pdf-generation.mdx +0 -0
- /package/docs/{scenarios → v6/scenarios}/spell-check.mdx +0 -0
- /package/docs/{security → v6/security}/action.mdx +0 -0
- /package/docs/{security → v6/security}/agent.mdx +0 -0
- /package/docs/{security → v6/security}/platform.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/advanced-test.mdx +0 -0
- /package/docs/{tutorials → v6/tutorials}/basic-test.mdx +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
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
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testdriverai",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
|
|
5
|
-
"main": "
|
|
5
|
+
"main": "sdk.js",
|
|
6
6
|
"bin": {
|
|
7
7
|
"testdriverai": "bin/testdriverai.js"
|
|
8
8
|
},
|
|
@@ -10,12 +10,22 @@
|
|
|
10
10
|
"start": "node bin/testdriverai.js",
|
|
11
11
|
"dev": "DEV=true node bin/testdriverai.js",
|
|
12
12
|
"debug": "DEV=true VERBOSE=true node bin/testdriverai.js",
|
|
13
|
-
"docs": "
|
|
13
|
+
"docs": "cd docs && npx mint@latest dev",
|
|
14
14
|
"docs:dev": "cd docs && npx mint dev",
|
|
15
|
-
"docs:build": "
|
|
15
|
+
"docs:build": "cd docs && npx mint@latest build",
|
|
16
16
|
"docs:links": "node docs/_scripts/link-replacer.js",
|
|
17
17
|
"bundle": "node build.mjs",
|
|
18
18
|
"test": "mocha test/*",
|
|
19
|
+
"test:sdk": "vitest run",
|
|
20
|
+
"test:sdk:windows": "TEST_PLATFORM=windows vitest run",
|
|
21
|
+
"test:sdk:mac": "TEST_PLATFORM=mac vitest run",
|
|
22
|
+
"test:sdk:linux": "TEST_PLATFORM=linux vitest run",
|
|
23
|
+
"test:sdk:watch": "vitest",
|
|
24
|
+
"test:sdk:ui": "vitest --ui",
|
|
25
|
+
"test:sdk:coverage": "vitest run --coverage",
|
|
26
|
+
"test:sdk:single": "vitest run --reporter=verbose",
|
|
27
|
+
"test:sdk:report": "open test-results/index.html",
|
|
28
|
+
"test:sdk:results": "node scripts/view-test-results.mjs",
|
|
19
29
|
"docs-lint": "cd docs && vale **/*.mdx",
|
|
20
30
|
"docs-upload": "node upload-docs-to-openai.js",
|
|
21
31
|
"runall": "dotenv testdriverai run --config testdriver.config.yaml --path './testdriver/*.testdriver.yaml'",
|
|
@@ -54,6 +64,7 @@
|
|
|
54
64
|
"remark-parse": "^11.0.0",
|
|
55
65
|
"sanitize-filename": "^1.6.3",
|
|
56
66
|
"strip-ansi": "^6.0.1",
|
|
67
|
+
"terminal-image": "^4.1.0",
|
|
57
68
|
"tmp": "^0.2.3",
|
|
58
69
|
"winston": "^3.13.0",
|
|
59
70
|
"winston-transport": "^4.9.0",
|
|
@@ -65,6 +76,7 @@
|
|
|
65
76
|
},
|
|
66
77
|
"devDependencies": {
|
|
67
78
|
"@eslint/js": "^9.10.0",
|
|
79
|
+
"@vitest/ui": "^4.0.8",
|
|
68
80
|
"chai": "^5.1.2",
|
|
69
81
|
"esbuild": "0.20.2",
|
|
70
82
|
"esbuild-plugin-fileloc": "^0.0.6",
|
|
@@ -75,7 +87,8 @@
|
|
|
75
87
|
"mint": "^4.2.67",
|
|
76
88
|
"mocha": "^10.8.2",
|
|
77
89
|
"node-addon-api": "^8.0.0",
|
|
78
|
-
"prettier": "3.3.3"
|
|
90
|
+
"prettier": "3.3.3",
|
|
91
|
+
"vitest": "^4.0.8"
|
|
79
92
|
},
|
|
80
93
|
"optionalDependencies": {
|
|
81
94
|
"@esbuild/linux-x64": "^0.21.5"
|
package/schema.json
CHANGED
|
@@ -301,13 +301,6 @@
|
|
|
301
301
|
},
|
|
302
302
|
"amount": {
|
|
303
303
|
"type": "integer"
|
|
304
|
-
},
|
|
305
|
-
"method": {
|
|
306
|
-
"type": "string",
|
|
307
|
-
"enum": [
|
|
308
|
-
"keyboard",
|
|
309
|
-
"mouse"
|
|
310
|
-
]
|
|
311
304
|
}
|
|
312
305
|
}
|
|
313
306
|
},
|
|
@@ -353,8 +346,8 @@
|
|
|
353
346
|
"right-click",
|
|
354
347
|
"double-click",
|
|
355
348
|
"hover",
|
|
356
|
-
"
|
|
357
|
-
"
|
|
349
|
+
"mouseDown",
|
|
350
|
+
"mouseUp"
|
|
358
351
|
]
|
|
359
352
|
}
|
|
360
353
|
}
|
|
@@ -405,8 +398,8 @@
|
|
|
405
398
|
"right-click",
|
|
406
399
|
"double-click",
|
|
407
400
|
"hover",
|
|
408
|
-
"
|
|
409
|
-
"
|
|
401
|
+
"mouseDown",
|
|
402
|
+
"mouseUp"
|
|
410
403
|
]
|
|
411
404
|
},
|
|
412
405
|
"method": {
|
|
@@ -443,8 +436,8 @@
|
|
|
443
436
|
"right-click",
|
|
444
437
|
"double-click",
|
|
445
438
|
"hover",
|
|
446
|
-
"
|
|
447
|
-
"
|
|
439
|
+
"mouseDown",
|
|
440
|
+
"mouseUp"
|
|
448
441
|
]
|
|
449
442
|
}
|
|
450
443
|
}
|
|
@@ -471,8 +464,8 @@
|
|
|
471
464
|
"right-click",
|
|
472
465
|
"double-click",
|
|
473
466
|
"hover",
|
|
474
|
-
"
|
|
475
|
-
"
|
|
467
|
+
"mouseDown",
|
|
468
|
+
"mouseUp"
|
|
476
469
|
]
|
|
477
470
|
},
|
|
478
471
|
"invert": {
|
|
@@ -558,13 +551,6 @@
|
|
|
558
551
|
"distance": {
|
|
559
552
|
"type": "integer"
|
|
560
553
|
},
|
|
561
|
-
"method": {
|
|
562
|
-
"type": "string",
|
|
563
|
-
"enum": [
|
|
564
|
-
"keyboard",
|
|
565
|
-
"mouse"
|
|
566
|
-
]
|
|
567
|
-
},
|
|
568
554
|
"invert": {
|
|
569
555
|
"type": "boolean"
|
|
570
556
|
}
|
|
@@ -598,13 +584,6 @@
|
|
|
598
584
|
},
|
|
599
585
|
"distance": {
|
|
600
586
|
"type": "integer"
|
|
601
|
-
},
|
|
602
|
-
"method" : {
|
|
603
|
-
"type": "string",
|
|
604
|
-
"enum": [
|
|
605
|
-
"keyboard",
|
|
606
|
-
"mouse"
|
|
607
|
-
]
|
|
608
587
|
},
|
|
609
588
|
"invert": {
|
|
610
589
|
"type": "boolean"
|
|
@@ -0,0 +1,96 @@
|
|
|
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();
|