testdriverai 6.2.2 → 7.1.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/AGENTS.md +550 -0
- package/CODEOWNERS +0 -1
- package/README.md +126 -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 +300 -85
- 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 +910 -296
- package/agent/lib/redraw.js +129 -41
- package/agent/lib/sandbox.js +29 -6
- package/agent/lib/sdk.js +22 -0
- package/agent/lib/system.js +0 -3
- package/agent/lib/validation.js +1 -7
- package/debug-locate-response.js +82 -0
- package/debugger/index.html +15 -4
- package/docs/ARCHITECTURE.md +424 -0
- package/docs/AWESOME_LOGS_QUICK_REF.md +100 -0
- package/docs/MIGRATION.md +425 -0
- package/docs/PRESETS.md +210 -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 +286 -152
- package/docs/guide/best-practices-polling.mdx +154 -0
- 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/dashcam.mdx +497 -0
- package/docs/v7/api/doubleClick.mdx +102 -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/mouseDown.mdx +161 -0
- package/docs/v7/api/mouseUp.mdx +164 -0
- package/docs/v7/api/pressKeys.mdx +349 -0
- package/docs/v7/api/rightClick.mdx +123 -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/configuration.mdx +380 -0
- package/docs/v7/getting-started/quickstart.mdx +332 -0
- package/docs/v7/guides/best-practices.mdx +486 -0
- package/docs/v7/guides/caching-ai.mdx +215 -0
- package/docs/v7/guides/caching-selectors.mdx +292 -0
- package/docs/v7/guides/caching.mdx +366 -0
- package/docs/v7/guides/ci-cd/azure.mdx +587 -0
- package/docs/v7/guides/ci-cd/circleci.mdx +523 -0
- package/docs/v7/guides/ci-cd/github-actions.mdx +457 -0
- package/docs/v7/guides/ci-cd/gitlab.mdx +498 -0
- package/docs/v7/guides/ci-cd/jenkins.mdx +664 -0
- package/docs/v7/guides/ci-cd/travis.mdx +438 -0
- package/docs/v7/guides/debugging.mdx +349 -0
- package/docs/v7/guides/faq.mdx +393 -0
- package/docs/v7/guides/migration.mdx +562 -0
- package/docs/v7/guides/performance.mdx +517 -0
- package/docs/{getting-started → v7/guides}/self-hosting.mdx +11 -12
- package/docs/v7/guides/troubleshooting.mdx +526 -0
- package/docs/v7/guides/vitest-plugin.mdx +477 -0
- package/docs/v7/guides/vitest.mdx +535 -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 +342 -0
- package/docs/v7/presets/chrome-extension.mdx +223 -0
- package/docs/v7/presets/chrome.mdx +287 -0
- package/docs/v7/presets/electron.mdx +435 -0
- package/docs/v7/presets/vscode.mdx +398 -0
- package/docs/v7/presets/webapp.mdx +396 -0
- package/docs/v7/progressive-apis/CORE.md +459 -0
- package/docs/v7/progressive-apis/HOOKS.md +360 -0
- package/docs/v7/progressive-apis/PROGRESSIVE_DISCLOSURE.md +230 -0
- package/docs/v7/progressive-apis/PROVISION.md +266 -0
- package/eslint.config.js +19 -1
- 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 +830 -0
- package/package.json +29 -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 +1028 -0
- package/sdk.js +2567 -0
- package/{.github/workflows/self-hosted.yml → self-hosted.yml} +13 -4
- package/setup/aws/cloudformation.yaml +9 -2
- package/src/core/Dashcam.js +469 -0
- package/src/core/index.d.ts +150 -0
- package/src/core/index.js +12 -0
- package/src/presets/index.mjs +331 -0
- package/src/vitest/extended.mjs +108 -0
- package/src/vitest/hooks.d.ts +119 -0
- package/src/vitest/hooks.mjs +298 -0
- package/src/vitest/index.mjs +64 -0
- package/src/vitest/lifecycle.mjs +277 -0
- package/src/vitest/utils.mjs +150 -0
- package/test/dashcam.test.js +137 -0
- package/test/mcp-example-test.yaml +27 -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 +26 -0
- package/testdriver/acceptance-sdk/auto-cache-key-demo.test.mjs +56 -0
- package/testdriver/acceptance-sdk/chrome-extension.test.mjs +89 -0
- package/testdriver/acceptance-sdk/drag-and-drop.test.mjs +58 -0
- package/testdriver/acceptance-sdk/element-not-found.test.mjs +25 -0
- package/testdriver/acceptance-sdk/exec-js.test.mjs +43 -0
- package/testdriver/acceptance-sdk/exec-output.test.mjs +59 -0
- package/testdriver/acceptance-sdk/exec-pwsh.test.mjs +57 -0
- package/testdriver/acceptance-sdk/focus-window.test.mjs +36 -0
- package/testdriver/acceptance-sdk/formatted-logging.test.mjs +26 -0
- package/testdriver/acceptance-sdk/hooks-example.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-image.test.mjs +34 -0
- package/testdriver/acceptance-sdk/hover-text-with-description.test.mjs +38 -0
- package/testdriver/acceptance-sdk/hover-text.test.mjs +27 -0
- package/testdriver/acceptance-sdk/match-image.test.mjs +36 -0
- package/testdriver/acceptance-sdk/presets-example.test.mjs +87 -0
- package/testdriver/acceptance-sdk/press-keys.test.mjs +50 -0
- package/testdriver/acceptance-sdk/prompt.test.mjs +33 -0
- package/testdriver/acceptance-sdk/scroll-keyboard.test.mjs +38 -0
- package/testdriver/acceptance-sdk/scroll-until-image.test.mjs +39 -0
- package/testdriver/acceptance-sdk/scroll-until-text.test.mjs +28 -0
- package/testdriver/acceptance-sdk/scroll.test.mjs +41 -0
- package/testdriver/acceptance-sdk/setup/globalTeardown.mjs +11 -0
- package/testdriver/acceptance-sdk/setup/testHelpers.mjs +420 -0
- package/testdriver/acceptance-sdk/setup/vitestSetup.mjs +40 -0
- package/testdriver/acceptance-sdk/sully-ai.test.mjs +234 -0
- package/testdriver/acceptance-sdk/test-console-logs.test.mjs +42 -0
- package/testdriver/acceptance-sdk/type-checking-demo.js +49 -0
- package/testdriver/acceptance-sdk/type.test.mjs +45 -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 +66 -0
- package/vitest.config.mjs.bak +44 -0
- package/.github/workflows/acceptance-v6.yml +0 -169
- package/.vscode/mcp.json +0 -9
- 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,215 @@
|
|
|
1
|
+
# Quick Start: TestDriver Test Recording
|
|
2
|
+
|
|
3
|
+
## What You Get
|
|
4
|
+
|
|
5
|
+
- 📊 Track all test runs in the TestDriver dashboard
|
|
6
|
+
- 🎥 Link dashcam screen recordings to specific tests
|
|
7
|
+
- 🔄 Integrate with CI/CD (GitHub Actions, GitLab, etc.)
|
|
8
|
+
- 🐛 View exact replay of failed tests
|
|
9
|
+
- 📈 Track test performance and flakiness over time
|
|
10
|
+
|
|
11
|
+
## Setup (5 minutes)
|
|
12
|
+
|
|
13
|
+
### 1. Add Vitest Plugin
|
|
14
|
+
|
|
15
|
+
```javascript
|
|
16
|
+
// vitest.config.mjs
|
|
17
|
+
import { defineConfig } from 'vitest/config';
|
|
18
|
+
import testDriverPlugin from './interfaces/vitest-plugin.mjs';
|
|
19
|
+
|
|
20
|
+
export default defineConfig({
|
|
21
|
+
plugins: [
|
|
22
|
+
testDriverPlugin({
|
|
23
|
+
apiKey: process.env.TD_API_KEY,
|
|
24
|
+
apiRoot: process.env.TD_API_ROOT || 'https://testdriver-api.onrender.com',
|
|
25
|
+
}),
|
|
26
|
+
],
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 2. Set API Key
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
export TD_API_KEY="your-api-key-here"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
Get your API key from: https://app.testdriver.ai/settings/api-keys
|
|
37
|
+
|
|
38
|
+
### 3. Run Tests
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx vitest run
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
That's it! Your tests are now being recorded. View results at:
|
|
45
|
+
https://app.testdriver.ai/dashboard/test-runs
|
|
46
|
+
|
|
47
|
+
## With Dashcam (Optional)
|
|
48
|
+
|
|
49
|
+
To link screen recordings with tests, simply register the dashcam URL after your test completes:
|
|
50
|
+
|
|
51
|
+
```javascript
|
|
52
|
+
import { test } from 'vitest';
|
|
53
|
+
import TestDriver from '@testdriverai/sdk';
|
|
54
|
+
|
|
55
|
+
test('my test', async () => {
|
|
56
|
+
const client = await TestDriver({ apiKey: 'your-api-key' });
|
|
57
|
+
|
|
58
|
+
// Run your test...
|
|
59
|
+
await client.get('https://example.com');
|
|
60
|
+
|
|
61
|
+
// Get dashcam URL and register it
|
|
62
|
+
const dashcamUrl = await client.dashcam.publish();
|
|
63
|
+
|
|
64
|
+
// Register with the plugin - it will automatically associate with this test
|
|
65
|
+
if (globalThis.__testdriverPlugin) {
|
|
66
|
+
globalThis.__testdriverPlugin.registerDashcamUrl(
|
|
67
|
+
'my-test-id', // Or use task.id in Vitest context
|
|
68
|
+
dashcamUrl,
|
|
69
|
+
client.os
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
await client.disconnect();
|
|
74
|
+
});
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The plugin automatically tracks all dashcam URLs in memory (no temp files needed!) and associates them with test results.
|
|
78
|
+
|
|
79
|
+
## CI/CD Integration
|
|
80
|
+
|
|
81
|
+
### GitHub Actions
|
|
82
|
+
|
|
83
|
+
```yaml
|
|
84
|
+
# .github/workflows/test.yml
|
|
85
|
+
name: Tests
|
|
86
|
+
on: [push]
|
|
87
|
+
jobs:
|
|
88
|
+
test:
|
|
89
|
+
runs-on: windows-latest
|
|
90
|
+
steps:
|
|
91
|
+
- uses: actions/checkout@v3
|
|
92
|
+
- run: npm install
|
|
93
|
+
- run: npx vitest run
|
|
94
|
+
env:
|
|
95
|
+
TD_API_KEY: ${{ secrets.TD_API_KEY }}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### GitLab CI
|
|
99
|
+
|
|
100
|
+
```yaml
|
|
101
|
+
# .gitlab-ci.yml
|
|
102
|
+
test:
|
|
103
|
+
script:
|
|
104
|
+
- npm install
|
|
105
|
+
- npx vitest run
|
|
106
|
+
variables:
|
|
107
|
+
TD_API_KEY: $CI_JOB_TOKEN
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
The reporter automatically detects CI environment and records:
|
|
111
|
+
- Git repo, branch, commit
|
|
112
|
+
- CI provider and run URL
|
|
113
|
+
- Test results and timing
|
|
114
|
+
|
|
115
|
+
## What Gets Recorded
|
|
116
|
+
|
|
117
|
+
### Test Run
|
|
118
|
+
- Suite name and platform
|
|
119
|
+
- Total/passed/failed counts
|
|
120
|
+
- Duration
|
|
121
|
+
- CI/CD metadata
|
|
122
|
+
- Git commit info
|
|
123
|
+
|
|
124
|
+
### Each Test
|
|
125
|
+
- Test name and file
|
|
126
|
+
- Pass/fail status
|
|
127
|
+
- Error messages (if failed)
|
|
128
|
+
- Duration
|
|
129
|
+
- Dashcam replay link (if available)
|
|
130
|
+
|
|
131
|
+
## View Results
|
|
132
|
+
|
|
133
|
+
Dashboard shows:
|
|
134
|
+
- All test runs with filters
|
|
135
|
+
- Drill down to individual tests
|
|
136
|
+
- Embedded dashcam replay player
|
|
137
|
+
- Link to CI/CD runs
|
|
138
|
+
- Test history and trends
|
|
139
|
+
|
|
140
|
+
## SDK Methods
|
|
141
|
+
|
|
142
|
+
Use in your test code:
|
|
143
|
+
|
|
144
|
+
```javascript
|
|
145
|
+
// Create test run
|
|
146
|
+
const testRun = await client.createTestRun({
|
|
147
|
+
runId: 'unique-id',
|
|
148
|
+
suiteName: 'My Tests',
|
|
149
|
+
platform: 'windows'
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
// Record test result
|
|
153
|
+
await client.recordTestCase({
|
|
154
|
+
runId: 'unique-id',
|
|
155
|
+
testName: 'my test',
|
|
156
|
+
status: 'passed',
|
|
157
|
+
replayUrl: 'https://app.dashcam.io/replay/abc'
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
// Complete run
|
|
161
|
+
await client.completeTestRun({
|
|
162
|
+
runId: 'unique-id',
|
|
163
|
+
status: 'passed'
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Troubleshooting
|
|
168
|
+
|
|
169
|
+
**Reporter not recording?**
|
|
170
|
+
- Check `TD_API_KEY` is set
|
|
171
|
+
- Verify network connectivity to TestDriver API
|
|
172
|
+
- Look for reporter logs in test output
|
|
173
|
+
|
|
174
|
+
**No dashcam link?**
|
|
175
|
+
- Ensure dashcam publishes and outputs replay URL
|
|
176
|
+
- Check test logs for replay URL output
|
|
177
|
+
- Manually set `DASHCAM_REPLAY_URL` if needed
|
|
178
|
+
|
|
179
|
+
**CI metadata missing?**
|
|
180
|
+
- CI environment variables must be available
|
|
181
|
+
- Supported: GitHub Actions, GitLab CI, CircleCI, Travis, Jenkins
|
|
182
|
+
|
|
183
|
+
## Files Created
|
|
184
|
+
|
|
185
|
+
**API (Backend)**
|
|
186
|
+
- `api/models/TdTestRun.js` - Test run model
|
|
187
|
+
- `api/models/TdTestCase.js` - Test case model
|
|
188
|
+
- `api/models/TdSandbox.js` - Sandbox tracking model
|
|
189
|
+
- `api/controllers/testdriver/testdriver-test-run-create.js` - Create test run endpoint
|
|
190
|
+
- `api/controllers/testdriver/testdriver-test-run-complete.js` - Complete test run endpoint
|
|
191
|
+
- `api/controllers/testdriver/testdriver-test-case-create.js` - Record test case endpoint
|
|
192
|
+
|
|
193
|
+
**CLI/SDK**
|
|
194
|
+
- `cli/interfaces/vitest-plugin.mjs` - Vitest plugin for test recording
|
|
195
|
+
- `cli/sdk.js` - Added createTestRun(), recordTestCase(), completeTestRun() methods
|
|
196
|
+
|
|
197
|
+
**Documentation**
|
|
198
|
+
- `cli/docs/TEST_RECORDING.md` - Complete guide
|
|
199
|
+
- `cli/docs/ARCHITECTURE.md` - Technical architecture
|
|
200
|
+
- `cli/vitest.config.example.js` - Example config
|
|
201
|
+
- `cli/examples/test-recording-example.test.js` - Example test
|
|
202
|
+
- `cli/examples/run-tests-with-recording.sh` - Example script
|
|
203
|
+
|
|
204
|
+
## Next Steps
|
|
205
|
+
|
|
206
|
+
1. **Try it out**: Run `npx vitest run` and check the dashboard
|
|
207
|
+
2. **Add dashcam**: Record your tests with screen capture
|
|
208
|
+
3. **Set up CI/CD**: Add to your pipeline for continuous tracking
|
|
209
|
+
4. **Build dashboard UI**: Create Vue components to visualize test runs (next phase)
|
|
210
|
+
|
|
211
|
+
## Support
|
|
212
|
+
|
|
213
|
+
- Documentation: https://docs.testdriver.ai
|
|
214
|
+
- Dashboard: https://app.testdriver.ai
|
|
215
|
+
- API Reference: /cli/docs/TEST_RECORDING.md
|
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# TestDriver SDK - AWESOME Logs 🎨
|
|
2
|
+
|
|
3
|
+
Beautiful, emoji-rich logging with incredible DX that makes your test output a joy to read!
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
✨ **Rich Emojis & UTF-8** - Full emoji support now that dashcam supports UTF-8!
|
|
8
|
+
🎨 **Color-Coded Actions** - Different colors for different action types
|
|
9
|
+
⚡ **Performance Indicators** - Color-coded duration times (green < 100ms, yellow < 500ms, red > 500ms)
|
|
10
|
+
📊 **Progress Tracking** - Beautiful progress bars for multi-step operations
|
|
11
|
+
🔍 **Cache Visualization** - Clear indication of cache hits/misses
|
|
12
|
+
📍 **Coordinate Display** - See exactly where elements are found
|
|
13
|
+
⏱️ **Timing Information** - Elapsed time from test start on every log
|
|
14
|
+
📦 **Beautiful Headers** - Box-drawn section headers for organization
|
|
15
|
+
|
|
16
|
+
## Log Types
|
|
17
|
+
|
|
18
|
+
### 🔍 Element Finding
|
|
19
|
+
|
|
20
|
+
```javascript
|
|
21
|
+
const element = await client.find("submit button");
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
**Output:**
|
|
25
|
+
```
|
|
26
|
+
[2.34s] 🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Features:
|
|
30
|
+
- Green checkmark for successful finds
|
|
31
|
+
- Coordinates with pin emoji
|
|
32
|
+
- Duration with color coding
|
|
33
|
+
- Cache status with lightning bolt
|
|
34
|
+
|
|
35
|
+
### 👆 User Actions
|
|
36
|
+
|
|
37
|
+
```javascript
|
|
38
|
+
await element.click();
|
|
39
|
+
await element.hover();
|
|
40
|
+
await client.type("hello world");
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
**Output:**
|
|
44
|
+
```
|
|
45
|
+
[2.51s] 👆 Click "submit button"
|
|
46
|
+
[2.67s] 👉 Hover "menu item"
|
|
47
|
+
[2.89s] ⌨️ Type → hello world
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Action emojis:
|
|
51
|
+
- 👆 Click
|
|
52
|
+
- 👆👆 Double-click
|
|
53
|
+
- 🖱️ Right-click
|
|
54
|
+
- 👉 Hover
|
|
55
|
+
- ⌨️ Type
|
|
56
|
+
- 🎹 Press Keys
|
|
57
|
+
- 📜 Scroll
|
|
58
|
+
|
|
59
|
+
### ✅ Assertions
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
await client.assert("page title is Example Domain");
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**Output:**
|
|
66
|
+
```
|
|
67
|
+
[3.12s] ✅ Assert "page title is Example Domain" · ✓ PASSED · ⏱️ 45ms
|
|
68
|
+
[3.45s] ❌ Assert "login form visible" · ✗ FAILED · ⏱️ 1234ms
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Color-coded results:
|
|
72
|
+
- ✅ Green for PASSED
|
|
73
|
+
- ❌ Red for FAILED
|
|
74
|
+
- Performance-based duration coloring
|
|
75
|
+
|
|
76
|
+
### ⚡ Cache Performance
|
|
77
|
+
|
|
78
|
+
The SDK automatically logs cache performance:
|
|
79
|
+
|
|
80
|
+
**Cache HIT:**
|
|
81
|
+
```
|
|
82
|
+
⚡ Cache HIT · 98.5% similar · image strategy
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
**Cache MISS:**
|
|
86
|
+
```
|
|
87
|
+
💤 Cache MISS · text strategy
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### 🔌 Connection Status
|
|
91
|
+
|
|
92
|
+
```javascript
|
|
93
|
+
await client.connect();
|
|
94
|
+
await client.disconnect();
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Output:**
|
|
98
|
+
```
|
|
99
|
+
🔌 Connected · Sandbox: i-0a1b2c3d4e5f6 · OS: windows
|
|
100
|
+
🔌 Disconnected
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### 📸 Screenshots
|
|
104
|
+
|
|
105
|
+
```javascript
|
|
106
|
+
await client.screenshot();
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**Output:**
|
|
110
|
+
```
|
|
111
|
+
[5.67s] 📸 Screenshot · /tmp/testdriver-debug/screenshot-123.png · 245 KB
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### 🚨 Errors
|
|
115
|
+
|
|
116
|
+
Errors are beautifully formatted with context:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
[8.90s] ❌ Element not found → Timeout after 5000ms
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 📈 Progress Tracking
|
|
123
|
+
|
|
124
|
+
For multi-step operations:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Progress ████████████████████ 100% 5/5 · Processing complete
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### 📊 Test Summary
|
|
131
|
+
|
|
132
|
+
At the end of your test suite:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
────────────────────────────────────────────────────────────
|
|
136
|
+
✓ 12 passed │ ✗ 2 failed │ ⊘ 1 skipped │ 15 total │ ⏱️ 45.23s
|
|
137
|
+
────────────────────────────────────────────────────────────
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 📦 Section Headers
|
|
141
|
+
|
|
142
|
+
Organize your test output with beautiful headers:
|
|
143
|
+
|
|
144
|
+
```
|
|
145
|
+
╭────────────────────────────────────────────────────────────╮
|
|
146
|
+
│ ✨ User Authentication Flow │
|
|
147
|
+
╰────────────────────────────────────────────────────────────╯
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Configuration
|
|
151
|
+
|
|
152
|
+
### Enable/Disable Logging
|
|
153
|
+
|
|
154
|
+
```javascript
|
|
155
|
+
const client = new TestDriver(apiKey, {
|
|
156
|
+
logging: true, // Enable logging (default)
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Or disable later
|
|
160
|
+
client.setLogging(false);
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Emojis vs Simple Symbols
|
|
164
|
+
|
|
165
|
+
The formatter automatically uses emojis when available. If you need to disable emojis:
|
|
166
|
+
|
|
167
|
+
```javascript
|
|
168
|
+
const { formatter } = require('testdriverai/sdk-log-formatter');
|
|
169
|
+
formatter.useEmojis = false; // Falls back to simple Unicode symbols
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Test Context Integration
|
|
173
|
+
|
|
174
|
+
Integrate with Vitest or other test frameworks:
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
import { describe, it, beforeEach } from 'vitest';
|
|
178
|
+
|
|
179
|
+
describe('Login Tests', () => {
|
|
180
|
+
let client;
|
|
181
|
+
|
|
182
|
+
beforeEach(() => {
|
|
183
|
+
client = new TestDriver(process.env.TD_API_KEY);
|
|
184
|
+
|
|
185
|
+
// Set test context for better logging
|
|
186
|
+
client.setTestContext({
|
|
187
|
+
file: 'login.test.js',
|
|
188
|
+
test: 'should log in successfully',
|
|
189
|
+
startTime: Date.now()
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('should log in successfully', async () => {
|
|
194
|
+
// All logs will now include elapsed time from test start
|
|
195
|
+
await client.connect();
|
|
196
|
+
// ...test code...
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
## Examples
|
|
202
|
+
|
|
203
|
+
### Basic Usage
|
|
204
|
+
|
|
205
|
+
```javascript
|
|
206
|
+
const TestDriver = require('testdriverai');
|
|
207
|
+
|
|
208
|
+
const client = new TestDriver(process.env.TD_API_KEY, {
|
|
209
|
+
logging: true,
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
await client.connect();
|
|
213
|
+
|
|
214
|
+
// Find and click - logs automatically
|
|
215
|
+
const button = await client.find('submit button');
|
|
216
|
+
await button.click();
|
|
217
|
+
|
|
218
|
+
await client.disconnect();
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Output:**
|
|
222
|
+
```
|
|
223
|
+
🔌 Connected · Sandbox: i-0a1b2c3d · OS: windows
|
|
224
|
+
🔍 Found "submit button" · 📍 (682, 189) · ⏱️ 167ms · ⚡ cached
|
|
225
|
+
👆 Click "submit button"
|
|
226
|
+
🔌 Disconnected
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Manual Formatting
|
|
230
|
+
|
|
231
|
+
You can also use the formatter directly for custom logs:
|
|
232
|
+
|
|
233
|
+
```javascript
|
|
234
|
+
const { formatter } = require('testdriverai/sdk-log-formatter');
|
|
235
|
+
|
|
236
|
+
// Format custom messages
|
|
237
|
+
console.log(formatter.formatHeader('My Test Suite', '🧪'));
|
|
238
|
+
console.log(formatter.formatAction('custom action', 'my element'));
|
|
239
|
+
console.log(formatter.formatProgress(3, 10, 'Processing...'));
|
|
240
|
+
console.log(formatter.formatDivider());
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### Performance Monitoring
|
|
244
|
+
|
|
245
|
+
Duration colors help you spot slow operations:
|
|
246
|
+
|
|
247
|
+
- **🟢 Green** (< 100ms): Fast, optimal
|
|
248
|
+
- **🟡 Yellow** (100-500ms): Acceptable
|
|
249
|
+
- **🔴 Red** (> 500ms): Slow, may need optimization
|
|
250
|
+
|
|
251
|
+
Example output:
|
|
252
|
+
```
|
|
253
|
+
⏱️ 45ms ← Green (fast)
|
|
254
|
+
⏱️ 234ms ← Yellow (acceptable)
|
|
255
|
+
⏱️ 1.2s ← Red (slow)
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Cache Monitoring
|
|
259
|
+
|
|
260
|
+
Track cache effectiveness in real-time:
|
|
261
|
+
|
|
262
|
+
```javascript
|
|
263
|
+
// Enable cache debugging
|
|
264
|
+
process.env.VERBOSE = 'true';
|
|
265
|
+
|
|
266
|
+
// Now you'll see detailed cache info
|
|
267
|
+
const element = await client.find('button');
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**Output:**
|
|
271
|
+
```
|
|
272
|
+
🔍 find() threshold: 0.05 (cache ENABLED)
|
|
273
|
+
🔍 Found "button" · 📍 (500, 300) · ⏱️ 89ms · ⚡ cached
|
|
274
|
+
|
|
275
|
+
Element Found:
|
|
276
|
+
Description: button
|
|
277
|
+
Coordinates: (500, 300)
|
|
278
|
+
Duration: 89ms
|
|
279
|
+
Cache Hit: ✅ YES
|
|
280
|
+
Cache Strategy: image
|
|
281
|
+
Similarity: 98.50%
|
|
282
|
+
Cache Age: 2s (created: 2024-11-18T15:30:45.123Z)
|
|
283
|
+
Pixel Diff: 1.23%
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Advanced Features
|
|
287
|
+
|
|
288
|
+
### Test Lifecycle Tracking
|
|
289
|
+
|
|
290
|
+
```javascript
|
|
291
|
+
const { formatter } = require('testdriverai/sdk-log-formatter');
|
|
292
|
+
|
|
293
|
+
// Test start
|
|
294
|
+
console.log(formatter.formatTestStart('Login Flow'));
|
|
295
|
+
|
|
296
|
+
// ... test code ...
|
|
297
|
+
|
|
298
|
+
// Test end
|
|
299
|
+
console.log(formatter.formatTestEnd('Login Flow', true, 2345));
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Output:**
|
|
303
|
+
```
|
|
304
|
+
▶️ Running: Login Flow
|
|
305
|
+
|
|
306
|
+
✅ PASSED Login Flow · 2.35s
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
### Multi-Step Workflows
|
|
310
|
+
|
|
311
|
+
```javascript
|
|
312
|
+
const steps = [
|
|
313
|
+
'Navigate to login',
|
|
314
|
+
'Enter credentials',
|
|
315
|
+
'Submit form',
|
|
316
|
+
'Verify dashboard',
|
|
317
|
+
'Logout'
|
|
318
|
+
];
|
|
319
|
+
|
|
320
|
+
for (let i = 0; i < steps.length; i++) {
|
|
321
|
+
console.log(formatter.formatProgress(i + 1, steps.length, steps[i]));
|
|
322
|
+
// ... perform step ...
|
|
323
|
+
}
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
**Output:**
|
|
327
|
+
```
|
|
328
|
+
Progress ████░░░░░░░░░░░░░░░░ 20% 1/5 · Navigate to login
|
|
329
|
+
Progress ████████░░░░░░░░░░░░ 40% 2/5 · Enter credentials
|
|
330
|
+
Progress ████████████░░░░░░░░ 60% 3/5 · Submit form
|
|
331
|
+
Progress ████████████████░░░░ 80% 4/5 · Verify dashboard
|
|
332
|
+
Progress ████████████████████ 100% 5/5 · Logout
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### Error Reporting
|
|
336
|
+
|
|
337
|
+
```javascript
|
|
338
|
+
try {
|
|
339
|
+
await client.find('non-existent element');
|
|
340
|
+
} catch (error) {
|
|
341
|
+
console.log(formatter.formatError('Element search failed', error));
|
|
342
|
+
}
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**Output:**
|
|
346
|
+
```
|
|
347
|
+
❌ Element search failed → Element "non-existent element" not found.
|
|
348
|
+
|
|
349
|
+
=== Debug Information ===
|
|
350
|
+
Element searched for: "non-existent element"
|
|
351
|
+
Cache threshold: 0.05 (95.0% similarity required)
|
|
352
|
+
Cache: MISS
|
|
353
|
+
Similarity score: 45.23%
|
|
354
|
+
Current screenshot: /tmp/testdriver-debug/screenshot-1234.png
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
## Tips for Great Logs
|
|
358
|
+
|
|
359
|
+
1. **Use descriptive element descriptions** - They appear in the logs!
|
|
360
|
+
```javascript
|
|
361
|
+
// ✅ Good
|
|
362
|
+
await client.find('blue submit button in login form');
|
|
363
|
+
|
|
364
|
+
// ❌ Less helpful
|
|
365
|
+
await client.find('button');
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
2. **Leverage test context** - Set it once, get timestamps on all logs
|
|
369
|
+
```javascript
|
|
370
|
+
client.setTestContext({
|
|
371
|
+
test: 'User Login',
|
|
372
|
+
startTime: Date.now()
|
|
373
|
+
});
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
3. **Monitor cache performance** - Use VERBOSE mode during development
|
|
377
|
+
```bash
|
|
378
|
+
VERBOSE=true node my-test.js
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
4. **Organize with headers** - Make long test output scannable
|
|
382
|
+
```javascript
|
|
383
|
+
console.log(formatter.formatHeader('Setup Phase', '⚙️'));
|
|
384
|
+
// ... setup code ...
|
|
385
|
+
|
|
386
|
+
console.log(formatter.formatHeader('Test Execution', '🧪'));
|
|
387
|
+
// ... test code ...
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
5. **Track progress** - Show users what's happening in long-running tests
|
|
391
|
+
```javascript
|
|
392
|
+
for (let i = 0; i < items.length; i++) {
|
|
393
|
+
console.log(formatter.formatProgress(i + 1, items.length));
|
|
394
|
+
// ... process item ...
|
|
395
|
+
}
|
|
396
|
+
```
|
|
397
|
+
|
|
398
|
+
## Demo
|
|
399
|
+
|
|
400
|
+
Run the comprehensive demo to see all logging features:
|
|
401
|
+
|
|
402
|
+
```bash
|
|
403
|
+
TD_API_KEY=your_key node examples/sdk-awesome-logs-demo.js
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
Or check out the cache thresholds example:
|
|
407
|
+
|
|
408
|
+
```bash
|
|
409
|
+
TD_API_KEY=your_key VERBOSE=true node examples/sdk-cache-thresholds.js
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
## Color Reference
|
|
413
|
+
|
|
414
|
+
The logging system uses consistent color coding:
|
|
415
|
+
|
|
416
|
+
- **🔵 Blue**: Info, navigation, system messages
|
|
417
|
+
- **🟢 Green**: Success, passed assertions, fast operations
|
|
418
|
+
- **🟡 Yellow**: Warnings, caching, acceptable performance
|
|
419
|
+
- **🔴 Red**: Errors, failures, slow operations
|
|
420
|
+
- **🟣 Magenta**: Finding/searching operations
|
|
421
|
+
- **🔵 Cyan**: User actions, interactive elements
|
|
422
|
+
- **⚪ Gray**: Debug info, metadata, timestamps
|
|
423
|
+
|
|
424
|
+
## Emoji Reference
|
|
425
|
+
|
|
426
|
+
### Actions
|
|
427
|
+
- 👆 Click / Tap
|
|
428
|
+
- 👉 Hover / Point
|
|
429
|
+
- ⌨️ Type / Keyboard input
|
|
430
|
+
- 🎹 Press keys
|
|
431
|
+
- 📜 Scroll
|
|
432
|
+
- 🖱️ Right-click
|
|
433
|
+
- ✊ Drag
|
|
434
|
+
|
|
435
|
+
### Status
|
|
436
|
+
- ✅ Success / Passed
|
|
437
|
+
- ❌ Error / Failed
|
|
438
|
+
- ⚠️ Warning
|
|
439
|
+
- ℹ️ Info
|
|
440
|
+
- 🔧 Debug
|
|
441
|
+
|
|
442
|
+
### Operations
|
|
443
|
+
- 🔍 Find / Search
|
|
444
|
+
- 🔎 Find all
|
|
445
|
+
- 📸 Screenshot
|
|
446
|
+
- 🧠 Remember (AI)
|
|
447
|
+
- 🎯 Focus
|
|
448
|
+
- ⚡ Cache hit
|
|
449
|
+
- 💤 Cache miss
|
|
450
|
+
|
|
451
|
+
### System
|
|
452
|
+
- 🔌 Connect / Disconnect
|
|
453
|
+
- 🚀 Launch / Start
|
|
454
|
+
- 🏁 Finish / End
|
|
455
|
+
- ⏳ Waiting / Loading
|
|
456
|
+
- ⏱️ Duration / Time
|
|
457
|
+
- 📍 Location / Coordinates
|
|
458
|
+
- 📊 Statistics / Summary
|
|
459
|
+
- 📈 Progress
|
|
460
|
+
|
|
461
|
+
### Organizational
|
|
462
|
+
- ✨ Header / Title
|
|
463
|
+
- 📦 Section / Group
|
|
464
|
+
- ▶️ Running / Active
|
|
465
|
+
- 🎉 Complete / Success
|
|
466
|
+
- 🚨 Alert / Critical
|
|
467
|
+
|
|
468
|
+
Enjoy your AWESOME logs! 🎨✨
|