craftdriver 1.1.1 → 1.3.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.
Files changed (52) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -1
  3. package/dist/cli/dispatcher.d.ts.map +1 -1
  4. package/dist/cli/dispatcher.js +12 -0
  5. package/dist/cli/dispatcher.js.map +1 -1
  6. package/dist/cli/mcp/tools.d.ts +1 -2
  7. package/dist/cli/mcp/tools.d.ts.map +1 -1
  8. package/dist/cli/mcp/tools.js +18 -0
  9. package/dist/cli/mcp/tools.js.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/lib/bidi/index.d.ts +4 -5
  14. package/dist/lib/bidi/index.d.ts.map +1 -1
  15. package/dist/lib/bidi/index.js +18 -8
  16. package/dist/lib/bidi/index.js.map +1 -1
  17. package/dist/lib/bidi/logs.d.ts +12 -1
  18. package/dist/lib/bidi/logs.d.ts.map +1 -1
  19. package/dist/lib/bidi/logs.js +20 -8
  20. package/dist/lib/bidi/logs.js.map +1 -1
  21. package/dist/lib/browser.d.ts +9 -15
  22. package/dist/lib/browser.d.ts.map +1 -1
  23. package/dist/lib/browser.js +94 -77
  24. package/dist/lib/browser.js.map +1 -1
  25. package/dist/lib/tracing.d.ts +20 -4
  26. package/dist/lib/tracing.d.ts.map +1 -1
  27. package/dist/lib/tracing.js +38 -3
  28. package/dist/lib/tracing.js.map +1 -1
  29. package/dist/lib/vibiumTrace.d.ts +14 -0
  30. package/dist/lib/vibiumTrace.d.ts.map +1 -0
  31. package/dist/lib/vibiumTrace.js +372 -0
  32. package/dist/lib/vibiumTrace.js.map +1 -0
  33. package/docs/api-reference.md +2 -1
  34. package/docs/browser-api.md +0 -1
  35. package/docs/browser-logs.md +8 -23
  36. package/docs/mcp.md +17 -3
  37. package/docs/public/recipes/trace-failing-test.html +16 -0
  38. package/docs/public/recipes/vitest-vibium-trace.html +16 -0
  39. package/docs/public/traces/vitest-login.zip +0 -0
  40. package/docs/recipes/console-error-gate.md +6 -9
  41. package/docs/recipes/debug-failing-tests-with-traces.md +117 -0
  42. package/docs/recipes/file-upload-download.md +1 -4
  43. package/docs/recipes/login-once-reuse-session.md +2 -5
  44. package/docs/recipes/mobile-flow-with-network-and-logs.md +2 -6
  45. package/docs/recipes/vitest-browser-lifecycle.md +1 -4
  46. package/docs/recipes.md +1 -1
  47. package/docs/tracing.md +104 -26
  48. package/package.json +4 -8
  49. package/skills/craftdriver/SKILL.md +3 -2
  50. package/skills/craftdriver/cheatsheet.md +6 -3
  51. package/skills/craftdriver/patterns.md +4 -6
  52. package/docs/recipes/trace-failing-test.md +0 -51
@@ -12,7 +12,8 @@ import { Browser } from 'craftdriver';
12
12
  const browser = await Browser.launch({
13
13
  browserName: 'chrome', // 'chrome' | 'chromium' | 'firefox'
14
14
  headless: true,
15
- enableBiDi: true, // required for network / logs / tracing / init scripts
15
+ // enableBiDi defaults to true network / logs / tracing / init scripts
16
+ // all need it, so only set enableBiDi: false if you must disable it.
16
17
  });
17
18
  try {
18
19
  await browser.navigateTo('https://example.com');
@@ -158,8 +159,10 @@ const download = await browser.waitForDownload(() => browser.click('#download'))
158
159
  ```ts
159
160
  await browser.screenshot({ path: 'out.png', fullPage: true });
160
161
 
161
- await browser.startTrace({ outDir: './artefacts/run' });
162
- try { /* ... */ } finally { await browser.stopTrace(); }
162
+ await browser.startTrace({ outDir: './artefacts/run', title: 'Smoke flow' });
163
+ try { /* ... */ } finally {
164
+ await browser.stopTrace({ path: './artefacts/run.zip' }); // player.vibium.dev
165
+ }
163
166
  ```
164
167
 
165
168
  ## Accessibility
@@ -6,7 +6,7 @@ Worked recipes. Each is ≤ ~200 tokens; load on demand from
6
6
  ## 1. Login, save storage state for reuse
7
7
 
8
8
  ```ts
9
- const browser = await Browser.launch({ enableBiDi: true });
9
+ const browser = await Browser.launch();
10
10
  await browser.navigateTo('https://app.example.com/login');
11
11
  await browser.locator(By.labelText('Email')).fill('jane@example.com');
12
12
  await browser.locator(By.labelText('Password')).fill(process.env.PW!);
@@ -23,10 +23,7 @@ await browser.quit();
23
23
 
24
24
  ```ts
25
25
  const state = JSON.parse(await fs.readFile('.auth/state.json', 'utf8'));
26
- const browser = await Browser.launch({
27
- enableBiDi: true,
28
- storageState: state,
29
- });
26
+ const browser = await Browser.launch({ storageState: state });
30
27
  await browser.navigateTo('https://app.example.com/dashboard');
31
28
  await browser.locator(By.testId('dashboard')).expect().toBeVisible();
32
29
  ```
@@ -63,6 +60,7 @@ const due = await row.locator('[data-col=due]').text();
63
60
  ```ts
64
61
  await browser.startTrace({
65
62
  outDir: './artefacts/checkout-fail',
63
+ title: 'Checkout failure',
66
64
  screenshots: 'auto',
67
65
  network: true,
68
66
  console: true,
@@ -73,7 +71,7 @@ try {
73
71
  // Trace lands on disk regardless — thrown expects never lose data.
74
72
  throw e;
75
73
  } finally {
76
- await browser.stopTrace();
74
+ await browser.stopTrace({ path: './artefacts/checkout-fail.zip' });
77
75
  }
78
76
  ```
79
77
 
@@ -1,51 +0,0 @@
1
- # Capture Failure Evidence With Tracing
2
-
3
- When a complex or occasionally-flaky test fails, the message alone rarely tells
4
- you why. A trace records the actions, navigation, console output, JavaScript
5
- errors, network events, and screenshots so you can replay what happened. Wrap
6
- the flow in a helper that starts a trace, keeps it on failure, and always stops
7
- it. This recipe traces a sign-in against the live
8
- [login example](https://dtopuzov.github.io/craftdriver/examples/login.html).
9
-
10
- The `try/catch` here is deliberate — it is what keeps the trace directory when
11
- the flow throws.
12
-
13
- ```ts
14
- async function withTrace(name: string, run: () => Promise<void>) {
15
- const outDir = `./traces/${name}-${Date.now()}`;
16
- await browser.startTrace({ outDir });
17
-
18
- try {
19
- await run();
20
- } catch (error) {
21
- console.error(`Trace kept at ${outDir}`);
22
- throw error;
23
- } finally {
24
- await browser.stopTrace().catch(() => undefined);
25
- }
26
- }
27
-
28
- await withTrace('login', async () => {
29
- await browser.navigateTo('https://dtopuzov.github.io/craftdriver/examples/login.html');
30
- await browser.getByLabel('Username').fill('alice');
31
- await browser.getByLabel('Password').fill('secret');
32
- await browser.getByRole('button', { name: 'Sign in' }).click();
33
- await browser.expect('#welcome').toContainText('Welcome back, alice!');
34
- });
35
- ```
36
-
37
- ## Notes
38
-
39
- - The trace file is NDJSON, so it stays useful even if the test throws before `stopTrace()`.
40
- - Screenshots are stored under the trace directory.
41
- - For high-volume suites, turn screenshots off unless a test is under investigation:
42
-
43
- ```ts
44
- await browser.startTrace({ outDir: './traces/smoke', screenshots: 'off' });
45
- ```
46
-
47
- ## Learn More
48
-
49
- - [Tracing](../tracing.md)
50
- - [Screenshots](../screenshots.md)
51
- - [Console Logs And JavaScript Errors](../browser-logs.md)