testdriverai 7.9.32-test → 7.9.34-test

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 (77) hide show
  1. package/ai/skills/testdriver:ai/SKILL.md +204 -0
  2. package/ai/skills/testdriver:assert/SKILL.md +315 -0
  3. package/ai/skills/testdriver:aws-setup/SKILL.md +448 -0
  4. package/ai/skills/testdriver:cache/SKILL.md +221 -0
  5. package/ai/skills/testdriver:caching/SKILL.md +124 -0
  6. package/ai/skills/testdriver:captcha/SKILL.md +158 -0
  7. package/ai/skills/testdriver:ci-cd/SKILL.md +602 -0
  8. package/ai/skills/testdriver:click/SKILL.md +286 -0
  9. package/ai/skills/testdriver:client/SKILL.md +477 -0
  10. package/ai/skills/testdriver:customizing-devices/SKILL.md +319 -0
  11. package/ai/skills/testdriver:dashcam/SKILL.md +451 -0
  12. package/ai/skills/testdriver:debugging-with-screenshots/SKILL.md +415 -0
  13. package/ai/skills/testdriver:device-config/SKILL.md +317 -0
  14. package/ai/skills/testdriver:double-click/SKILL.md +102 -0
  15. package/ai/skills/testdriver:elements/SKILL.md +605 -0
  16. package/ai/skills/testdriver:enterprise/SKILL.md +7 -0
  17. package/ai/skills/testdriver:errors/SKILL.md +246 -0
  18. package/ai/skills/testdriver:events/SKILL.md +356 -0
  19. package/ai/skills/testdriver:exec/SKILL.md +317 -0
  20. package/ai/skills/testdriver:find/SKILL.md +860 -0
  21. package/ai/skills/testdriver:focus-application/SKILL.md +293 -0
  22. package/ai/skills/testdriver:generating-tests/SKILL.md +36 -0
  23. package/ai/skills/testdriver:hosted/SKILL.md +156 -0
  24. package/ai/skills/testdriver:hover/SKILL.md +278 -0
  25. package/ai/skills/testdriver:locating-elements/SKILL.md +71 -0
  26. package/ai/skills/testdriver:making-assertions/SKILL.md +32 -0
  27. package/ai/skills/testdriver:mcp/SKILL.md +7 -0
  28. package/ai/skills/testdriver:mouse-down/SKILL.md +161 -0
  29. package/ai/skills/testdriver:mouse-up/SKILL.md +164 -0
  30. package/ai/skills/testdriver:parse/SKILL.md +236 -0
  31. package/ai/skills/testdriver:performing-actions/SKILL.md +53 -0
  32. package/ai/skills/testdriver:press-keys/SKILL.md +348 -0
  33. package/ai/skills/testdriver:provision/SKILL.md +331 -0
  34. package/ai/skills/testdriver:quickstart/SKILL.md +172 -0
  35. package/ai/skills/testdriver:redraw/SKILL.md +214 -0
  36. package/ai/skills/testdriver:reusable-code/SKILL.md +249 -0
  37. package/ai/skills/testdriver:right-click/SKILL.md +123 -0
  38. package/ai/skills/testdriver:running-tests/SKILL.md +185 -0
  39. package/ai/skills/testdriver:screenshot/SKILL.md +248 -0
  40. package/ai/skills/testdriver:screenshots/SKILL.md +184 -0
  41. package/ai/skills/testdriver:scroll/SKILL.md +205 -0
  42. package/ai/skills/testdriver:secrets/SKILL.md +115 -0
  43. package/ai/skills/testdriver:self-hosted/SKILL.md +147 -0
  44. package/ai/skills/testdriver:test-results-json/SKILL.md +257 -0
  45. package/ai/skills/testdriver:testdriver/SKILL.md +624 -0
  46. package/ai/skills/testdriver:type/SKILL.md +357 -0
  47. package/ai/skills/testdriver:variables/SKILL.md +111 -0
  48. package/ai/skills/testdriver:wait/SKILL.md +50 -0
  49. package/ai/skills/testdriver:waiting-for-elements/SKILL.md +90 -0
  50. package/ai/skills/testdriver:what-is-testdriver/SKILL.md +54 -0
  51. package/docs/_data/examples-manifest.json +42 -42
  52. package/docs/v7/debugging-with-screenshots.mdx +14 -0
  53. package/docs/v7/examples/ai.mdx +1 -1
  54. package/docs/v7/examples/assert.mdx +1 -1
  55. package/docs/v7/examples/chrome-extension.mdx +2 -2
  56. package/docs/v7/examples/element-not-found.mdx +1 -1
  57. package/docs/v7/examples/exec-output.mdx +1 -1
  58. package/docs/v7/examples/exec-pwsh.mdx +1 -1
  59. package/docs/v7/examples/findall-coffee-icons.mdx +1 -1
  60. package/docs/v7/examples/focus-window.mdx +1 -1
  61. package/docs/v7/examples/hover-image.mdx +1 -1
  62. package/docs/v7/examples/hover-text-with-description.mdx +1 -1
  63. package/docs/v7/examples/hover-text.mdx +1 -1
  64. package/docs/v7/examples/installer.mdx +1 -1
  65. package/docs/v7/examples/launch-vscode-linux.mdx +1 -1
  66. package/docs/v7/examples/parse.mdx +1 -1
  67. package/docs/v7/examples/press-keys.mdx +1 -1
  68. package/docs/v7/examples/prompt.mdx +1 -1
  69. package/docs/v7/examples/scroll-keyboard.mdx +1 -1
  70. package/docs/v7/examples/scroll-until-image.mdx +1 -1
  71. package/docs/v7/examples/scroll.mdx +1 -1
  72. package/docs/v7/examples/type.mdx +1 -1
  73. package/docs/v7/examples/windows-installer.mdx +1 -1
  74. package/docs/v7/find.mdx +33 -0
  75. package/examples/chrome-extension.test.mjs +1 -1
  76. package/package.json +1 -1
  77. package/setup/aws/spawn-runner.sh +24 -3
@@ -2,16 +2,16 @@
2
2
  "$schema": "./examples-manifest.schema.json",
3
3
  "examples": {
4
4
  "assert.test.mjs": {
5
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451160f3ad36c01d6d2b6",
6
- "lastUpdated": "2026-04-07T00:50:35.143Z"
5
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e0c0ec56e77d2d2b48",
6
+ "lastUpdated": "2026-04-09T00:47:56.308Z"
7
7
  },
8
8
  "drag-and-drop.test.mjs": {
9
9
  "url": "https://console.testdriver.ai/runs/69a62b3aaa712ecd3dea730a/69a62b42fc0ac3cc632a918b",
10
10
  "lastUpdated": "2026-03-03T00:32:25.275Z"
11
11
  },
12
12
  "exec-pwsh.test.mjs": {
13
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451080f3ad36c01d6d2aa",
14
- "lastUpdated": "2026-04-07T00:35:19.961Z"
13
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d1c0ec56e77d2d2b3c",
14
+ "lastUpdated": "2026-04-09T00:30:09.363Z"
15
15
  },
16
16
  "match-image.test.mjs": {
17
17
  "url": "https://console-test.testdriver.ai/runs/69c8738614b73310c7839412/69c8738c14b73310c783941d",
@@ -22,84 +22,84 @@
22
22
  "lastUpdated": "2026-03-03T00:32:25.282Z"
23
23
  },
24
24
  "hover-text-with-description.test.mjs": {
25
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4510a0f3ad36c01d6d2ab",
26
- "lastUpdated": "2026-04-07T00:34:17.941Z"
25
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d3c0ec56e77d2d2b3d",
26
+ "lastUpdated": "2026-04-09T00:29:07.375Z"
27
27
  },
28
28
  "windows-installer.test.mjs": {
29
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4510d0f3ad36c01d6d2ae",
30
- "lastUpdated": "2026-04-07T00:35:24.405Z"
29
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d6c0ec56e77d2d2b40",
30
+ "lastUpdated": "2026-04-09T00:30:14.179Z"
31
31
  },
32
32
  "exec-output.test.mjs": {
33
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4510f0f3ad36c01d6d2af",
34
- "lastUpdated": "2026-04-07T00:35:25.737Z"
33
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d7c0ec56e77d2d2b41",
34
+ "lastUpdated": "2026-04-09T00:30:15.528Z"
35
35
  },
36
36
  "chrome-extension.test.mjs": {
37
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451070f3ad36c01d6d2a9",
38
- "lastUpdated": "2026-04-07T00:34:47.526Z"
37
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d0c0ec56e77d2d2b3b",
38
+ "lastUpdated": "2026-04-09T00:29:36.485Z"
39
39
  },
40
40
  "launch-vscode-linux.test.mjs": {
41
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4510c0f3ad36c01d6d2ac",
42
- "lastUpdated": "2026-04-07T00:40:22.703Z"
41
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d5c0ec56e77d2d2b3e",
42
+ "lastUpdated": "2026-04-09T00:37:50.393Z"
43
43
  },
44
44
  "hover-image.test.mjs": {
45
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451100f3ad36c01d6d2b0",
46
- "lastUpdated": "2026-04-07T00:34:56.038Z"
45
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2d9c0ec56e77d2d2b42",
46
+ "lastUpdated": "2026-04-09T00:29:45.158Z"
47
47
  },
48
48
  "installer.test.mjs": {
49
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451120f3ad36c01d6d2b1",
50
- "lastUpdated": "2026-04-07T00:34:26.096Z"
49
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2dbc0ec56e77d2d2b43",
50
+ "lastUpdated": "2026-04-09T00:29:14.938Z"
51
51
  },
52
52
  "type.test.mjs": {
53
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451130f3ad36c01d6d2b4",
54
- "lastUpdated": "2026-04-07T00:34:59.210Z"
53
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2dcc0ec56e77d2d2b46",
54
+ "lastUpdated": "2026-04-09T00:29:48.386Z"
55
55
  },
56
56
  "press-keys.test.mjs": {
57
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451150f3ad36c01d6d2b5",
58
- "lastUpdated": "2026-04-07T00:49:27.995Z"
57
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2dec0ec56e77d2d2b47",
58
+ "lastUpdated": "2026-04-09T00:46:49.783Z"
59
59
  },
60
60
  "scroll-keyboard.test.mjs": {
61
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451190f3ad36c01d6d2b8",
62
- "lastUpdated": "2026-04-07T00:35:36.559Z"
61
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e3c0ec56e77d2d2b4a",
62
+ "lastUpdated": "2026-04-09T00:30:27.053Z"
63
63
  },
64
64
  "scroll.test.mjs": {
65
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4511f0f3ad36c01d6d2bc",
66
- "lastUpdated": "2026-04-07T00:55:05.452Z"
65
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e8c0ec56e77d2d2b4e",
66
+ "lastUpdated": "2026-04-09T00:55:13.692Z"
67
67
  },
68
68
  "scroll-until-image.test.mjs": {
69
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4511b0f3ad36c01d6d2b9",
70
- "lastUpdated": "2026-04-07T00:34:35.122Z"
69
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e4c0ec56e77d2d2b4b",
70
+ "lastUpdated": "2026-04-09T00:29:24.528Z"
71
71
  },
72
72
  "prompt.test.mjs": {
73
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4511c0f3ad36c01d6d2ba",
74
- "lastUpdated": "2026-04-07T00:35:39.320Z"
73
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e5c0ec56e77d2d2b4c",
74
+ "lastUpdated": "2026-04-09T00:30:29.837Z"
75
75
  },
76
76
  "focus-window.test.mjs": {
77
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d4511d0f3ad36c01d6d2bb",
78
- "lastUpdated": "2026-04-07T00:34:37.946Z"
77
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e7c0ec56e77d2d2b4d",
78
+ "lastUpdated": "2026-04-09T00:29:27.218Z"
79
79
  },
80
80
  "captcha-api.test.mjs": {
81
81
  "url": "https://console.testdriver.ai/runs/698f7df69e27ce1528d7d087/698f7fb0d3b320ad547d9d44",
82
82
  "lastUpdated": "2026-02-13T19:55:05.951Z"
83
83
  },
84
84
  "element-not-found.test.mjs": {
85
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451200f3ad36c01d6d2bd",
86
- "lastUpdated": "2026-04-07T00:35:43.573Z"
85
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2eac0ec56e77d2d2b4f",
86
+ "lastUpdated": "2026-04-09T00:30:34.117Z"
87
87
  },
88
88
  "formatted-logging.test.mjs": {
89
89
  "url": "https://console-test.testdriver.ai/runs/69c8738614b73310c7839412/69c873a714b73310c7839450",
90
90
  "lastUpdated": "2026-03-29T00:36:10.628Z"
91
91
  },
92
92
  "hover-text.test.mjs": {
93
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451230f3ad36c01d6d2bf",
94
- "lastUpdated": "2026-04-07T00:34:43.883Z"
93
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2edc0ec56e77d2d2b51",
94
+ "lastUpdated": "2026-04-09T00:29:33.199Z"
95
95
  },
96
96
  "no-provision.test.mjs": {
97
97
  "url": "https://console.testdriver.ai/runs/69a62b3aaa712ecd3dea730a/69a62b7706a177a05bccd1cf",
98
98
  "lastUpdated": "2026-03-03T00:32:25.279Z"
99
99
  },
100
100
  "ai.test.mjs": {
101
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451220f3ad36c01d6d2be",
102
- "lastUpdated": "2026-04-07T00:58:09.203Z"
101
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2ebc0ec56e77d2d2b50",
102
+ "lastUpdated": "2026-04-09T00:58:39.073Z"
103
103
  },
104
104
  "popup-loading.test.mjs": {
105
105
  "url": "https://console.testdriver.ai/runs/698bc89f7140c3fa7daaca8d/698bca7f7140c3fa7daacbf7",
@@ -134,12 +134,12 @@
134
134
  "lastUpdated": "2026-02-13T19:55:05.953Z"
135
135
  },
136
136
  "findall-coffee-icons.test.mjs": {
137
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451180f3ad36c01d6d2b7",
138
- "lastUpdated": "2026-04-07T00:35:03.801Z"
137
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2e1c0ec56e77d2d2b49",
138
+ "lastUpdated": "2026-04-09T00:29:52.990Z"
139
139
  },
140
140
  "parse.test.mjs": {
141
- "url": "https://console-test.testdriver.ai/runs/69d451050f3ad36c01d6d2a8/69d451250f3ad36c01d6d2c0",
142
- "lastUpdated": "2026-04-07T00:35:48.118Z"
141
+ "url": "https://console-test.testdriver.ai/runs/69d6f2cec0ec56e77d2d2b3a/69d6f2eec0ec56e77d2d2b52",
142
+ "lastUpdated": "2026-04-09T00:30:38.622Z"
143
143
  },
144
144
  "flake-diffthreshold-001.test.mjs": {
145
145
  "url": "https://console.testdriver.ai/runs/69a62b3aaa712ecd3dea730a/69a62bcafc0ac3cc632a91aa",
@@ -329,6 +329,20 @@ Understanding the directory structure helps with efficient screenshot viewing:
329
329
  - All screenshots are PNG format
330
330
  - Disable automatic screenshots with `autoScreenshots: false` if needed
331
331
 
332
+ ## Interaction List Sidebar (Source of Truth)
333
+
334
+ When viewing a test run in the TestDriver console, the **interaction list sidebar** displays a screenshot for each interaction call (find, click, type, assert, etc.). These screenshots show exactly what was on the screen at the time each interaction was executed.
335
+
336
+ <Note>
337
+ **The sidebar screenshots are the source of truth.** If a test is behaving unexpectedly, check the screenshot attached to the specific interaction in the sidebar — it shows precisely what the AI saw when making its decision. This is more reliable than inferring screen state from test logs or local screenshots alone.
338
+ </Note>
339
+
340
+ Use the interaction list to:
341
+ - **Verify what the AI saw** — confirm the correct page/state was visible when `find()` or `assert()` ran
342
+ - **Debug misclicks** — see whether the target element was actually on screen
343
+ - **Identify timing issues** — spot cases where the UI hadn't finished loading before an interaction fired
344
+ - **Compare runs** — review interaction screenshots across multiple runs to catch flaky behavior
345
+
332
346
  ## Integration with Test Development
333
347
 
334
348
  ### During MCP Interactive Development
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* ai.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451220f3ad36c01d6d2be/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2ebc0ec56e77d2d2b50/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* assert.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451160f3ad36c01d6d2b6/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e0c0ec56e77d2d2b48/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* chrome-extension.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451070f3ad36c01d6d2a9/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d0c0ec56e77d2d2b3b/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -76,7 +76,7 @@ describe("Chrome Extension Test", () => {
76
76
  // When clicked, it shows a popup with "Hello Extensions"
77
77
 
78
78
  // Click on the extensions button (puzzle piece icon) in Chrome toolbar
79
- const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true});
79
+ const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true, verify: true});
80
80
  await extensionsButton.click();
81
81
 
82
82
  // Look for the hello world extension in the extensions menu
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* element-not-found.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451200f3ad36c01d6d2bd/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2eac0ec56e77d2d2b4f/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* exec-output.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4510f0f3ad36c01d6d2af/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d7c0ec56e77d2d2b41/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* exec-pwsh.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451080f3ad36c01d6d2aa/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d1c0ec56e77d2d2b3c/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -18,7 +18,7 @@ Watch this test execute in a real sandbox environment:
18
18
 
19
19
  {/* findall-coffee-icons.test.mjs output */}
20
20
  <iframe
21
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451180f3ad36c01d6d2b7/replay"
21
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e1c0ec56e77d2d2b49/replay"
22
22
  width="100%"
23
23
  height="600"
24
24
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* focus-window.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4511d0f3ad36c01d6d2bb/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e7c0ec56e77d2d2b4d/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* hover-image.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451100f3ad36c01d6d2b0/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d9c0ec56e77d2d2b42/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -18,7 +18,7 @@ Watch this test execute in a real sandbox environment:
18
18
 
19
19
  {/* hover-text-with-description.test.mjs output */}
20
20
  <iframe
21
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4510a0f3ad36c01d6d2ab/replay"
21
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d3c0ec56e77d2d2b3d/replay"
22
22
  width="100%"
23
23
  height="600"
24
24
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* hover-text.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451230f3ad36c01d6d2bf/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2edc0ec56e77d2d2b51/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* installer.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451120f3ad36c01d6d2b1/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2dbc0ec56e77d2d2b43/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* launch-vscode-linux.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4510c0f3ad36c01d6d2ac/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d5c0ec56e77d2d2b3e/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -17,7 +17,7 @@ Watch this test execute in a real sandbox environment:
17
17
 
18
18
  {/* parse.test.mjs output */}
19
19
  <iframe
20
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451250f3ad36c01d6d2c0/replay"
20
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2eec0ec56e77d2d2b52/replay"
21
21
  width="100%"
22
22
  height="600"
23
23
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* press-keys.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451150f3ad36c01d6d2b5/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2dec0ec56e77d2d2b47/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -17,7 +17,7 @@ Watch this test execute in a real sandbox environment:
17
17
 
18
18
  {/* prompt.test.mjs output */}
19
19
  <iframe
20
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4511c0f3ad36c01d6d2ba/replay"
20
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e5c0ec56e77d2d2b4c/replay"
21
21
  width="100%"
22
22
  height="600"
23
23
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* scroll-keyboard.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451190f3ad36c01d6d2b8/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e3c0ec56e77d2d2b4a/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* scroll-until-image.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4511b0f3ad36c01d6d2b9/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e4c0ec56e77d2d2b4b/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* scroll.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4511f0f3ad36c01d6d2bc/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2e8c0ec56e77d2d2b4e/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* type.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d451130f3ad36c01d6d2b4/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2dcc0ec56e77d2d2b46/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
@@ -12,7 +12,7 @@ Watch this test execute in a real sandbox environment:
12
12
 
13
13
  {/* windows-installer.test.mjs output */}
14
14
  <iframe
15
- src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d4510d0f3ad36c01d6d2ae/replay"
15
+ src="https://api-test.testdriver.ai/api/v1/testdriver/testcase/69d6f2d6c0ec56e77d2d2b40/replay"
16
16
  width="100%"
17
17
  height="390"
18
18
  style={{ border: "1px solid #333", borderRadius: "8px" }}
package/docs/v7/find.mdx CHANGED
@@ -367,6 +367,39 @@ This two-phase approach gives the AI a higher-resolution view of the target area
367
367
  - You need extra precision for closely spaced UI elements
368
368
  </Tip>
369
369
 
370
+ ## Verify Mode
371
+
372
+ Verify mode is **disabled by default**. When enabled, a second AI call checks that the coordinates returned by `find()` actually correspond to the requested element, catching hallucinated or incorrect positions.
373
+
374
+ ```javascript
375
+ // Enable verification for critical interactions
376
+ const deleteBtn = await testdriver.find('delete account button', { verify: true });
377
+ await deleteBtn.click();
378
+ ```
379
+
380
+ ### How Verify Mode Works
381
+
382
+ 1. **Phase 1**: AI locates the element and returns coordinates
383
+ 2. **Phase 2**: A second AI call examines the screenshot at those coordinates to confirm the element matches the description
384
+ 3. **Result**: If verification fails, the find is retried or marked as not found
385
+
386
+ ### Combining Zoom and Verify
387
+
388
+ For maximum accuracy, enable both `zoom` and `verify` together. This is useful for critical interactions where clicking the wrong element could cause cascading failures:
389
+
390
+ ```javascript
391
+ // Maximum accuracy: zoom for precision + verify to catch hallucinations
392
+ const element = await testdriver.find('small cancel icon next to the subscription', {
393
+ zoom: true,
394
+ verify: true,
395
+ });
396
+ await element.click();
397
+ ```
398
+
399
+ <Warning>
400
+ Both `zoom` and `verify` add extra AI calls per `find()` invocation, which increases latency and API usage. When both are enabled, each find may make up to 3 AI calls. **Rate limiting may occur** if many find calls use these options in rapid succession. Use them selectively for critical interactions rather than on every find call.
401
+ </Warning>
402
+
370
403
  ## Cache Options
371
404
 
372
405
  Control caching behavior to optimize performance, especially when using dynamic variables in prompts.
@@ -53,7 +53,7 @@ describe("Chrome Extension Test", () => {
53
53
  // When clicked, it shows a popup with "Hello Extensions"
54
54
 
55
55
  // Click on the extensions button (puzzle piece icon) in Chrome toolbar
56
- const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true});
56
+ const extensionsButton = await testdriver.find("The extensions button in the Chrome toolbar", {zoom: true, verify: true});
57
57
  await extensionsButton.click();
58
58
 
59
59
  // Look for the hello world extension in the extensions menu
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "testdriverai",
3
- "version": "7.9.32-test",
3
+ "version": "7.9.34-test",
4
4
  "description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
5
5
  "main": "sdk.js",
6
6
  "types": "sdk.d.ts",
@@ -145,17 +145,38 @@ done
145
145
  echo "Installing runner..."
146
146
 
147
147
  # Determine environment and version
148
- TD_CHANNEL="${TD_CHANNEL:-stable}"
149
148
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
150
- SDK_PKG_JSON="${SCRIPT_DIR}/../../../sdk/package.json"
149
+ # SDK package.json — works both from monorepo (sdk/setup/aws/) and npm install (setup/aws/)
150
+ SDK_PKG_JSON="${SCRIPT_DIR}/../../package.json"
151
151
  RUNNER_DIR="${SCRIPT_DIR}/../../../runner"
152
152
 
153
+ # Derive channel from TD_CHANNEL env, or from the SDK version's prerelease tag
154
+ # (mirrors sdk/lib/resolve-channel.js logic)
155
+ if [ -z "${TD_CHANNEL:-}" ]; then
156
+ if [ -f "$SDK_PKG_JSON" ]; then
157
+ SDK_VERSION=$(jq -r '.version' "$SDK_PKG_JSON")
158
+ # Extract prerelease tag: "7.6.0-canary.5" → "canary", "7.6.0" → ""
159
+ PRE_TAG=$(echo "$SDK_VERSION" | sed -n 's/^[0-9]*\.[0-9]*\.[0-9]*-\([a-z]*\).*/\1/p')
160
+ if [ -n "$PRE_TAG" ] && echo "$PRE_TAG" | grep -qE '^(dev|test|canary|stable)$'; then
161
+ TD_CHANNEL="$PRE_TAG"
162
+ echo "Channel derived from SDK version ($SDK_VERSION): $TD_CHANNEL"
163
+ else
164
+ TD_CHANNEL="stable"
165
+ echo "SDK version $SDK_VERSION has no prerelease tag, defaulting to: $TD_CHANNEL"
166
+ fi
167
+ else
168
+ TD_CHANNEL="stable"
169
+ echo "SDK package.json not found, defaulting channel to: $TD_CHANNEL"
170
+ fi
171
+ fi
172
+ echo "Using channel: $TD_CHANNEL"
173
+
153
174
  if [ -f "$SDK_PKG_JSON" ]; then
154
175
  RUNNER_VERSION=$(jq -r '.version' "$SDK_PKG_JSON")
155
176
  echo "Runner version from SDK: $RUNNER_VERSION"
156
177
  else
157
178
  RUNNER_VERSION="$TD_CHANNEL"
158
- echo "SDK package.json not found, using env tag: $RUNNER_VERSION"
179
+ echo "SDK package.json not found, using channel as runner version: $RUNNER_VERSION"
159
180
  fi
160
181
 
161
182
  if [ "$TD_CHANNEL" = "dev" ]; then