testdriverai 7.5.24 → 7.5.26
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/CHANGELOG.md +35 -0
- package/agent/index.js +3 -3
- package/ai/skills/testdriver-aws-setup/SKILL.md +1 -1
- package/ai/skills/testdriver-wait/SKILL.md +50 -0
- package/ai/skills/testdriver-waiting-for-elements/SKILL.md +3 -1
- package/debugger/index.html +20 -3
- package/docs/docs.json +1 -1
- package/docs/v7/aws-setup.mdx +1 -1
- package/examples/config.mjs +1 -1
- package/examples/no-provision.test.mjs +18 -11
- package/package.json +1 -1
- package/sdk.js +2 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,38 @@
|
|
|
1
|
+
## 7.5.26 (2026-03-11)
|
|
2
|
+
|
|
3
|
+
## ✨ Features
|
|
4
|
+
|
|
5
|
+
- Add stable and canary deployment channels for better release management [API] (50347881)
|
|
6
|
+
- Add version API endpoint to provide deployment channel information [API] (50347881)
|
|
7
|
+
- Add new AI skill for waiting operations in test automation [SDK] (50347881)
|
|
8
|
+
- Add customer testimonials section to marketing site (50347881)
|
|
9
|
+
- Add contact and demo pages to marketing site (50347881)
|
|
10
|
+
- Add user limit checking for team invitations [API] (50347881)
|
|
11
|
+
- Improve test analytics dashboard with enhanced data visualization [Web] (50347881)
|
|
12
|
+
- Improve test case management interface with better filtering and search [Web] (50347881)
|
|
13
|
+
- Improve test run detail view with more comprehensive information [Web] (50347881)
|
|
14
|
+
- Add PostHog analytics integration for better user tracking (50347881)
|
|
15
|
+
|
|
16
|
+
## 🐛 Bug Fixes
|
|
17
|
+
|
|
18
|
+
- Fix network logs screenshot filename in marketing assets (50347881)
|
|
19
|
+
- Improve invite validation flow for team management [API] (50347881)
|
|
20
|
+
|
|
21
|
+
## 🔧 Maintenance
|
|
22
|
+
|
|
23
|
+
- Update pricing configuration with shared pricing data structure (50347881)
|
|
24
|
+
- Enhance release workflow to support dual-branch publishing (50347881)
|
|
25
|
+
- Update environment configuration for stable and canary deployments (50347881)
|
|
26
|
+
- Improve sandbox agent error handling and logging [Runner] (50347881)
|
|
27
|
+
- Update SDK examples with better configuration handling [SDK] (50347881)
|
|
28
|
+
- Enhance debugger interface with improved styling [SDK] (50347881)
|
|
29
|
+
|
|
30
|
+
## 7.5.25 (2026-03-09)
|
|
31
|
+
|
|
32
|
+
## 🐛 Bug Fixes
|
|
33
|
+
|
|
34
|
+
- Fix runner restart functionality to ensure proper VM recovery after interruptions [Runner] (47173fa5)
|
|
35
|
+
|
|
1
36
|
## 7.5.24 (2026-03-09)
|
|
2
37
|
|
|
3
38
|
## ✨ Features
|
package/agent/index.js
CHANGED
|
@@ -1918,12 +1918,12 @@ ${regression}
|
|
|
1918
1918
|
const encodedData = Buffer.from(JSON.stringify(data)).toString("base64");
|
|
1919
1919
|
|
|
1920
1920
|
// Build debugger URL — hosted on S3 (v7-vnc bucket)
|
|
1921
|
-
const debuggerBase = process.env.TD_DEBUGGER_BASE_URL || "
|
|
1922
|
-
|
|
1921
|
+
const debuggerBase = process.env.TD_DEBUGGER_BASE_URL || "http://v7-vnc.s3.us-east-2.amazonaws.com";
|
|
1922
|
+
// URL-encode the base64 data to handle +, /, = characters safely
|
|
1923
|
+
const urlToOpen = `${debuggerBase}/index.html?data=${encodeURIComponent(encodedData)}`;
|
|
1923
1924
|
|
|
1924
1925
|
// Check preview mode from CLI options (SDK passes it directly)
|
|
1925
1926
|
const previewMode = (this.cliArgs.options && this.cliArgs.options.preview) || this.config.TD_PREVIEW || "browser";
|
|
1926
|
-
console.log("[DEBUG renderSandbox] preview:", previewMode);
|
|
1927
1927
|
|
|
1928
1928
|
if (previewMode === "ide") {
|
|
1929
1929
|
// Send session to VS Code extension via HTTP
|
|
@@ -369,7 +369,7 @@ You can customize the AMI to include additional software or configurations:
|
|
|
369
369
|
<Step title="Connect via RDP">
|
|
370
370
|
Use the default credentials:
|
|
371
371
|
- **Username**: `testdriver`
|
|
372
|
-
- **Password**: `
|
|
372
|
+
- **Password**: `wwv9uJ0sqlulbN3`
|
|
373
373
|
</Step>
|
|
374
374
|
|
|
375
375
|
<Step title="Change the Password">
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: testdriver:wait
|
|
3
|
+
description: Pause the execution of the script for a specified duration.
|
|
4
|
+
---
|
|
5
|
+
<!-- Generated from wait.mdx. DO NOT EDIT. -->
|
|
6
|
+
|
|
7
|
+
## Description
|
|
8
|
+
|
|
9
|
+
The `wait` method pauses test execution for a specified number of milliseconds before continuing. This is useful for adding delays between actions, waiting for animations to complete, or pausing for state changes to settle.
|
|
10
|
+
|
|
11
|
+
## Syntax
|
|
12
|
+
|
|
13
|
+
```javascript
|
|
14
|
+
await testdriver.wait(timeout);
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Arguments
|
|
18
|
+
|
|
19
|
+
| Argument | Type | Default | Description |
|
|
20
|
+
| --------- | -------- | ------- | ------------------------------------- |
|
|
21
|
+
| `timeout` | `number` | `3000` | The duration in milliseconds to wait. |
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
```javascript
|
|
26
|
+
// Wait 2 seconds for an animation to complete
|
|
27
|
+
await testdriver.find('submit button').click();
|
|
28
|
+
await testdriver.wait(2000);
|
|
29
|
+
|
|
30
|
+
// Wait 5 seconds
|
|
31
|
+
await testdriver.wait(5000);
|
|
32
|
+
|
|
33
|
+
// Wait with default timeout (3 seconds)
|
|
34
|
+
await testdriver.wait();
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Best Practices
|
|
38
|
+
|
|
39
|
+
- **Use for simple delays** — waiting for animations, transitions, or state changes after an action.
|
|
40
|
+
- **Avoid for element waiting** — if you're waiting for a specific element to appear, use `find()` with a `timeout` option instead:
|
|
41
|
+
```javascript
|
|
42
|
+
// ✅ Better for waiting for elements
|
|
43
|
+
const element = await testdriver.find('success message', { timeout: 30000 });
|
|
44
|
+
|
|
45
|
+
// ❌ Don't do this for element waiting
|
|
46
|
+
await testdriver.wait(5000);
|
|
47
|
+
const element = await testdriver.find('success message');
|
|
48
|
+
```
|
|
49
|
+
- Avoid excessively long timeouts to keep tests efficient.
|
|
50
|
+
- Use sparingly — TestDriver's [redraw detection](/v7/waiting-for-elements) automatically waits for screen and network stability after each action.
|
|
@@ -85,4 +85,6 @@ await testdriver.find('next page button').click();
|
|
|
85
85
|
await testdriver.wait(1000);
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
<Note>
|
|
89
|
+
For waiting for specific **elements** to appear, prefer `find()` with a `timeout` option. Use `wait()` only for simple time-based pauses.
|
|
90
|
+
</Note>
|
package/debugger/index.html
CHANGED
|
@@ -354,8 +354,21 @@
|
|
|
354
354
|
console.error("Error parsing data:", e);
|
|
355
355
|
}
|
|
356
356
|
}
|
|
357
|
+
// Demo mode: use mock data if no data param provided (for local dev)
|
|
357
358
|
if (!parsedData || !parsedData.url) {
|
|
358
|
-
|
|
359
|
+
const isLocalDev = window.location.hostname === "localhost" || window.location.hostname === "127.0.0.1";
|
|
360
|
+
if (isLocalDev) {
|
|
361
|
+
console.log("[Debugger] No data param — using demo mode");
|
|
362
|
+
parsedData = {
|
|
363
|
+
url: "about:blank",
|
|
364
|
+
resolution: [1366, 768],
|
|
365
|
+
testFile: "demo-test.mjs",
|
|
366
|
+
os: "linux",
|
|
367
|
+
token: null,
|
|
368
|
+
};
|
|
369
|
+
} else {
|
|
370
|
+
alert("Missing or invalid data parameter.");
|
|
371
|
+
}
|
|
359
372
|
}
|
|
360
373
|
|
|
361
374
|
// Elements
|
|
@@ -402,9 +415,13 @@
|
|
|
402
415
|
: "TestDriver";
|
|
403
416
|
document.title = `${testFileName} - Debugger`;
|
|
404
417
|
|
|
405
|
-
// Embed the VNC URL in the iframe
|
|
418
|
+
// Embed the VNC URL in the iframe with token
|
|
406
419
|
iframe.style.display = "block";
|
|
407
|
-
|
|
420
|
+
const vncUrl = new URL(parsedData.url);
|
|
421
|
+
if (parsedData.token) {
|
|
422
|
+
vncUrl.searchParams.set("token", parsedData.token);
|
|
423
|
+
}
|
|
424
|
+
iframe.src = vncUrl.toString();
|
|
408
425
|
|
|
409
426
|
// Hide loading screen once iframe loads
|
|
410
427
|
iframe.addEventListener("load", () => {
|
package/docs/docs.json
CHANGED
package/docs/v7/aws-setup.mdx
CHANGED
|
@@ -370,7 +370,7 @@ You can customize the AMI to include additional software or configurations:
|
|
|
370
370
|
<Step title="Connect via RDP">
|
|
371
371
|
Use the default credentials:
|
|
372
372
|
- **Username**: `testdriver`
|
|
373
|
-
- **Password**: `
|
|
373
|
+
- **Password**: `wwv9uJ0sqlulbN3`
|
|
374
374
|
</Step>
|
|
375
375
|
|
|
376
376
|
<Step title="Change the Password">
|
package/examples/config.mjs
CHANGED
|
@@ -1,24 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* TestDriver SDK -
|
|
3
|
-
*
|
|
2
|
+
* TestDriver SDK - No-Provision Test with Dashcam (Vitest)
|
|
3
|
+
*
|
|
4
|
+
* Demonstrates manual dashcam control without using provision methods.
|
|
5
|
+
* When not using provision.chrome(), provision.vscode(), etc., you need
|
|
6
|
+
* to manually start and stop dashcam recording.
|
|
4
7
|
*/
|
|
5
8
|
|
|
6
|
-
import { describe,
|
|
9
|
+
import { describe, it } from "vitest";
|
|
7
10
|
import { TestDriver } from "../lib/vitest/hooks.mjs";
|
|
8
11
|
import { getDefaults } from "./config.mjs";
|
|
9
12
|
|
|
10
|
-
describe("
|
|
11
|
-
it("should
|
|
13
|
+
describe("No-Provision with Dashcam", () => {
|
|
14
|
+
it("should record dashcam while asserting desktop is visible", async (context) => {
|
|
12
15
|
const testdriver = TestDriver(context, { ...getDefaults(context) });
|
|
13
16
|
|
|
14
|
-
|
|
17
|
+
// Start dashcam recording manually (provision methods do this automatically)
|
|
18
|
+
await testdriver.dashcam.start();
|
|
15
19
|
|
|
16
|
-
//
|
|
17
|
-
const result = await testdriver.assert(
|
|
18
|
-
"A desktop is visible",
|
|
19
|
-
);
|
|
20
|
+
await testdriver.exec('sh', 'gedit >/dev/null 2>&1 &'); // Example command to keep the test running for a bit
|
|
20
21
|
|
|
21
|
-
|
|
22
|
+
await testdriver.assert('untitled document is visible');
|
|
23
|
+
|
|
24
|
+
// Stop dashcam and get the recording URL
|
|
25
|
+
const dashcamUrl = await testdriver.dashcam.stop();
|
|
26
|
+
if (dashcamUrl) {
|
|
27
|
+
console.log(`🎥 Dashcam recording: ${dashcamUrl}`);
|
|
28
|
+
}
|
|
22
29
|
});
|
|
23
30
|
});
|
|
24
31
|
|
package/package.json
CHANGED
package/sdk.js
CHANGED