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,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! 🎨✨
|