testdriverai 6.1.10 → 6.2.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-tests.yml +0 -2
- package/.github/workflows/acceptance-v6.yml +0 -2
- package/.github/workflows/lint.yml +1 -4
- package/.github/workflows/publish-canary.yml +0 -2
- package/.github/workflows/publish-latest.yml +0 -1
- package/.prettierignore +0 -1
- package/.vscode/settings.json +1 -4
- package/agent/events.js +10 -1
- package/agent/index.js +76 -104
- package/agent/interface.js +6 -43
- package/agent/lib/censorship.js +10 -15
- package/agent/lib/commander.js +18 -31
- package/agent/lib/commands.js +63 -81
- package/agent/lib/debugger-server.js +5 -0
- package/agent/lib/generator.js +2 -2
- package/agent/lib/redraw.js +1 -0
- package/agent/lib/sandbox.js +2 -0
- package/agent/lib/sdk.js +1 -2
- package/agent/lib/source-mapper.js +1 -1
- package/agent/lib/system.js +6 -1
- package/docs/account/enterprise.mdx +12 -8
- package/docs/account/pricing.mdx +2 -2
- package/docs/account/projects.mdx +0 -5
- package/docs/cli/overview.mdx +6 -6
- package/docs/commands/assert.mdx +0 -1
- package/docs/commands/hover-text.mdx +1 -3
- package/docs/commands/match-image.mdx +4 -5
- package/docs/commands/press-keys.mdx +8 -6
- package/docs/commands/scroll-until-image.mdx +7 -8
- package/docs/commands/scroll-until-text.mdx +6 -7
- package/docs/commands/wait-for-image.mdx +4 -5
- package/docs/commands/wait-for-text.mdx +5 -6
- package/docs/docs.json +40 -42
- package/docs/getting-started/vscode.mdx +56 -67
- package/docs/guide/environment-variables.mdx +5 -5
- package/docs/overview/comparison.mdx +39 -22
- package/docs/overview/quickstart.mdx +32 -84
- package/docs/styles.css +1 -10
- package/interfaces/cli/lib/base.js +6 -27
- package/interfaces/cli/utils/factory.js +4 -17
- package/interfaces/logger.js +5 -4
- package/interfaces/readline.js +1 -1
- package/package.json +3 -3
- package/schema.json +2 -22
- package/testdriver/acceptance/hover-text.yaml +1 -2
- package/testdriver/acceptance/prompt.yaml +1 -4
- package/testdriver/acceptance/scroll-until-image.yaml +0 -5
- package/testdriver/{lifecycle/prerun.yaml → examples/web/lifecycle/provision.yaml} +0 -6
- package/testdriver/lifecycle/provision.yaml +20 -0
- package/.github/workflows/self-hosted.yml +0 -102
- package/docs/apps/tauri-apps.mdx +0 -361
- package/docs/getting-started/playwright.mdx +0 -342
- package/docs/getting-started/self-hosting.mdx +0 -370
- package/docs/guide/dashcam.mdx +0 -118
- package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
- package/docs/images/content/vscode/ide-full.png +0 -0
- package/docs/images/content/vscode/running.png +0 -0
- package/interfaces/cli/commands/generate.js +0 -3
- package/setup/aws/cloudformation.yaml +0 -463
- package/setup/aws/spawn-runner.sh +0 -190
- package/testdriver/edge-cases/js-exception.yaml +0 -8
- package/testdriver/edge-cases/js-promise.yaml +0 -19
- package/testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
- package/testdriver/edge-cases/success-test.yaml +0 -9
- package/testdriver/examples/web/lifecycle/postrun.yaml +0 -7
- package/testdriver/examples/web/lifecycle/prerun.yaml +0 -17
- package/testdriver/lifecycle/postrun.yaml +0 -7
|
@@ -10,10 +10,11 @@ icon: boxing-glove
|
|
|
10
10
|
TestDriver operates a full desktop environment, so it can run any application.
|
|
11
11
|
|
|
12
12
|
<div className="comparison-table">
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
| Application | TestDriver | Playwright | Selenium |
|
|
14
|
+
|:-----------------:|:---------:|:-----------:|:--------:|
|
|
15
|
+
| Web Apps | ✅ | ✅ | ✅ |
|
|
16
|
+
| Desktop Apps | ✅ | | |
|
|
17
|
+
| Chrome Extensions | ✅ | | |
|
|
17
18
|
</div>
|
|
18
19
|
|
|
19
20
|
## Testing features
|
|
@@ -21,11 +22,16 @@ TestDriver operates a full desktop environment, so it can run any application.
|
|
|
21
22
|
TestDriver is AI first.
|
|
22
23
|
|
|
23
24
|
<div className="comparison-table">
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
26
|
+
|:--------------------:|:---------:|:----------:|:--------:|
|
|
27
|
+
| Test Generation | ✅ | | |
|
|
28
|
+
| Adaptive Testing | ✅ | | |
|
|
29
|
+
| Visual Assertions | ✅ | | |
|
|
30
|
+
| Self Healing | ✅ | | |
|
|
31
|
+
| Application Switching | ✅ | | |
|
|
32
|
+
| GitHub Actions | ✅ | ✅ | |
|
|
33
|
+
| Team Dashboard | ✅ | | |
|
|
34
|
+
| Team Collaboration | ✅ | | |
|
|
29
35
|
</div>
|
|
30
36
|
|
|
31
37
|
## Test coverage
|
|
@@ -53,11 +59,15 @@ TestDriver has more coverage than selector-based frameworks.
|
|
|
53
59
|
Debugging features are powered by [Dashcam.io](https://dashcam.io).
|
|
54
60
|
|
|
55
61
|
<div className="comparison-table">
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
63
|
+
|:------------------:|:----------:|:----------:|:--------:|
|
|
64
|
+
| AI Summary | ✅ | | |
|
|
65
|
+
| Video Replay | ✅ | ✅ | |
|
|
66
|
+
| Browser Logs | ✅ | ✅ | |
|
|
67
|
+
| Desktop Logs | ✅ | | |
|
|
68
|
+
| Network Requests | ✅ | ✅ | |
|
|
69
|
+
| Team Dashboard | ✅ | | |
|
|
70
|
+
| Team Collaboration | ✅ | | |
|
|
61
71
|
</div>
|
|
62
72
|
|
|
63
73
|
## Web browser support
|
|
@@ -65,10 +75,15 @@ Debugging features are powered by [Dashcam.io](https://dashcam.io).
|
|
|
65
75
|
TestDriver is browser agnostic and supports any version of any browser.
|
|
66
76
|
|
|
67
77
|
<div className="comparison-table">
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
78
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
79
|
+
|:--------:|:----------:|:----------:|:--------:|
|
|
80
|
+
| Chrome | ✅ | ✅ | ✅ |
|
|
81
|
+
| Firefox | ✅ | ✅ | ✅ |
|
|
82
|
+
| Webkit | ✅ | ✅ | ✅ |
|
|
83
|
+
| IE | ✅ | | ✅ |
|
|
84
|
+
| Edge | ✅ | ✅ | ✅ |
|
|
85
|
+
| Opera | ✅ | | ✅ |
|
|
86
|
+
| Safari | ✅ | | ✅ |
|
|
72
87
|
</div>
|
|
73
88
|
|
|
74
89
|
## Operating system support
|
|
@@ -76,7 +91,9 @@ TestDriver is browser agnostic and supports any version of any browser.
|
|
|
76
91
|
TestDriver currently supports Mac and Windows!
|
|
77
92
|
|
|
78
93
|
<div className="comparison-table">
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
94
|
+
| Feature | TestDriver | Playwright | Selenium |
|
|
95
|
+
|:--------:|:----------:|:----------:|:--------:|
|
|
96
|
+
| Windows | ✅ | ✅ | ✅ |
|
|
97
|
+
| Mac | ✅ | ✅ | ✅ |
|
|
98
|
+
| Linux | | ✅ | ✅ |
|
|
99
|
+
</div>
|
|
@@ -6,105 +6,53 @@ icon: "gauge-high"
|
|
|
6
6
|
mode: "wide"
|
|
7
7
|
---
|
|
8
8
|
|
|
9
|
+
<Tip>
|
|
10
|
+
You will need a [TestDriver Pro](https://app.testdriver.ai/team) account
|
|
11
|
+
($20/m) to complete setup.
|
|
12
|
+
</Tip>
|
|
13
|
+
|
|
9
14
|
<Steps>
|
|
10
|
-
<Step title="
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
15
|
+
<Step title="Install TestDriver">
|
|
16
|
+
|
|
17
|
+
Click the button below to install the TestDriver extension for your preferred IDE. Then, follow the setup guide and chat with TestDriver to create your first test.
|
|
18
|
+
|
|
14
19
|
<Card
|
|
15
|
-
title="Sign Up for TestDriver"
|
|
16
|
-
icon="user-plus"
|
|
17
|
-
href="https://app.testdriver.ai/team"
|
|
18
|
-
arrow
|
|
19
20
|
horizontal
|
|
21
|
+
title="VS Code"
|
|
22
|
+
arrow
|
|
23
|
+
href="vscode:extension/testdriver.testdriver"
|
|
24
|
+
icon="/images/content/extension/vscode.svg"
|
|
20
25
|
></Card>
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
<Tab title="macOS / Linux">
|
|
29
|
-
```bash Export an environment variable on macOS or Linux systems
|
|
30
|
-
export TD_API_KEY="your_api_key_here"
|
|
31
|
-
```
|
|
32
|
-
</Tab>
|
|
33
|
-
<Tab title="Windows">
|
|
34
|
-
```powershell Export an environment variable in PowerShell
|
|
35
|
-
setx TD_API_KEY "your_api_key_here"
|
|
36
|
-
```
|
|
37
|
-
</Tab>
|
|
38
|
-
</Tabs>
|
|
39
|
-
|
|
40
|
-
<Tip>Using VS Code, Cursor, or Windsurf? [Try our VS Code Extension (beta)](/getting-started/vscode).</Tip>
|
|
41
|
-
|
|
42
|
-
</Step>
|
|
43
|
-
<Step title="Check out an example test">
|
|
44
|
-
|
|
45
|
-
Download the TestDriver GitHub repository and run the example test.
|
|
46
|
-
|
|
47
|
-
```bash
|
|
48
|
-
git clone --depth 1 https://github.com/testdriverai/cli testdriverai
|
|
49
|
-
cd testdriverai/testdriver/acceptance
|
|
50
|
-
```
|
|
27
|
+
<Card
|
|
28
|
+
horizontal
|
|
29
|
+
title="Cursor"
|
|
30
|
+
arrow
|
|
31
|
+
href="cursor:extension/testdriver.testdriver"
|
|
32
|
+
icon="/images/content/extension/cursor.svg"
|
|
51
33
|
|
|
52
|
-
|
|
34
|
+
> </Card>
|
|
53
35
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
36
|
+
<Card
|
|
37
|
+
horizontal
|
|
38
|
+
title="Windsurf"
|
|
39
|
+
arrow
|
|
40
|
+
href="windsurf:extension/testdriver.testdriver"
|
|
41
|
+
icon="/images/content/extension/windsurf.svg"
|
|
42
|
+
></Card>
|
|
61
43
|
|
|
62
|
-
|
|
44
|
+
The extension will generate most of your tests for you, but you'll probably want to customize them. [Learn more about editing tests](/getting-started/editing).
|
|
63
45
|
|
|
64
46
|
</Step>
|
|
65
|
-
<Step title="
|
|
47
|
+
<Step title="Run your tests in CI/CD">
|
|
66
48
|
|
|
67
|
-
|
|
49
|
+
Next, use `testdriverai` to run your tests in CI/CD pipelines.
|
|
68
50
|
|
|
69
51
|
```bash
|
|
70
|
-
npx testdriverai@latest run
|
|
52
|
+
TD_API_KEY=YOUR_KEY npx testdriverai@latest run testdriver/test.yaml
|
|
71
53
|
```
|
|
72
54
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
<Tip>You can use an interactive CLI to generate test steps with the [explore command](/interactive/explore)</Tip>
|
|
76
|
-
|
|
77
|
-
</Step>
|
|
78
|
-
<Step title="Run the generated regression test">
|
|
79
|
-
|
|
80
|
-
After TestDriver has run the exploratory test, you'll see that the `prompt.yaml` file has been updated with commands generated by the agent to make the test faster and more reliable.
|
|
81
|
-
|
|
82
|
-
```yaml
|
|
83
|
-
version: 6.0.0
|
|
84
|
-
steps:
|
|
85
|
-
- prompt: focus chrome
|
|
86
|
-
commands:
|
|
87
|
-
- command: focus-application
|
|
88
|
-
name: Google Chrome
|
|
89
|
-
- prompt: enter a username
|
|
90
|
-
commands:
|
|
91
|
-
- command: hover-text
|
|
92
|
-
text: Username
|
|
93
|
-
description: username input field
|
|
94
|
-
action: click
|
|
95
|
-
- command: type
|
|
96
|
-
text: standard_user
|
|
97
|
-
- prompt: enter a password
|
|
98
|
-
commands:
|
|
99
|
-
- command: hover-text
|
|
100
|
-
text: Password
|
|
101
|
-
description: password input field
|
|
102
|
-
action: click
|
|
103
|
-
- command: type
|
|
104
|
-
text: secret_password
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
The `--write` command tells the agent to save the generated commands to the test file, and the `--heal` command gives the agent permission to recover if something goes wrong.
|
|
55
|
+
Note that you'll want to store your API key within secret storeage. [Learn more about running tests in CI/CD pipelines](/action/setup).
|
|
108
56
|
|
|
109
57
|
</Step>
|
|
110
58
|
|
package/docs/styles.css
CHANGED
|
@@ -42,6 +42,7 @@ class BaseCommand extends Command {
|
|
|
42
42
|
message = JSON.stringify(message);
|
|
43
43
|
}
|
|
44
44
|
this.agent.sandbox.send({
|
|
45
|
+
os: "linux",
|
|
45
46
|
type: "output",
|
|
46
47
|
output: Buffer.from(message).toString("base64"),
|
|
47
48
|
});
|
|
@@ -55,8 +56,7 @@ class BaseCommand extends Command {
|
|
|
55
56
|
`testdriverai-cli-${process.pid}.log`,
|
|
56
57
|
);
|
|
57
58
|
|
|
58
|
-
console.log(`Log file: ${this.logFilePath}`);
|
|
59
|
-
console.log("");
|
|
59
|
+
console.log(`Log file created at: ${this.logFilePath}`);
|
|
60
60
|
fs.writeFileSync(this.logFilePath, ""); // Initialize the log file
|
|
61
61
|
}
|
|
62
62
|
|
|
@@ -69,15 +69,11 @@ class BaseCommand extends Command {
|
|
|
69
69
|
);
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
-
let isConnected = false;
|
|
73
|
-
|
|
74
72
|
// Use pattern matching for log events, but skip log:Debug
|
|
75
73
|
this.agent.emitter.on("log:*", (message) => {
|
|
76
74
|
const event = this.agent.emitter.event;
|
|
77
75
|
|
|
78
76
|
if (event === events.log.debug) return;
|
|
79
|
-
|
|
80
|
-
if (event === events.log.narration && isConnected) return;
|
|
81
77
|
console.log(message);
|
|
82
78
|
});
|
|
83
79
|
|
|
@@ -95,7 +91,6 @@ class BaseCommand extends Command {
|
|
|
95
91
|
|
|
96
92
|
// Handle sandbox connection with pattern matching for subsequent events
|
|
97
93
|
this.agent.emitter.on("sandbox:connected", () => {
|
|
98
|
-
isConnected = true;
|
|
99
94
|
// Once sandbox is connected, send all log and error events to sandbox
|
|
100
95
|
this.agent.emitter.on("log:*", (message) => {
|
|
101
96
|
this.sendToSandbox(message);
|
|
@@ -130,17 +125,8 @@ class BaseCommand extends Command {
|
|
|
130
125
|
process.exit(exitCode);
|
|
131
126
|
});
|
|
132
127
|
|
|
133
|
-
// Handle unhandled promise rejections to prevent them from interfering with the exit flow
|
|
134
|
-
// This is particularly important when JavaScript execution in VM contexts leaves dangling promises
|
|
135
|
-
process.on("unhandledRejection", (reason) => {
|
|
136
|
-
// Log the rejection but don't let it crash the process
|
|
137
|
-
console.error("Unhandled Promise Rejection:", reason);
|
|
138
|
-
// The exit flow should continue normally
|
|
139
|
-
});
|
|
140
|
-
|
|
141
128
|
// Handle show window events
|
|
142
129
|
this.agent.emitter.on("show-window", async (url) => {
|
|
143
|
-
console.log("");
|
|
144
130
|
console.log(`Live test execution: `);
|
|
145
131
|
if (this.agent.config.CI) {
|
|
146
132
|
let u = new URL(url);
|
|
@@ -172,27 +158,20 @@ class BaseCommand extends Command {
|
|
|
172
158
|
return file;
|
|
173
159
|
}
|
|
174
160
|
|
|
175
|
-
async setupAgent(
|
|
161
|
+
async setupAgent(file, flags) {
|
|
176
162
|
// Load .env file into process.env for CLI usage
|
|
177
163
|
require("dotenv").config();
|
|
178
164
|
|
|
179
165
|
// Create the agent only when actually needed
|
|
180
166
|
const TestDriverAgent = require("../../../agent/index.js");
|
|
181
167
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
// For generate command, the first parameter is a prompt, not a file
|
|
185
|
-
args = firstArg ? [firstArg] : [];
|
|
186
|
-
} else {
|
|
187
|
-
// For run and other commands, handle file path
|
|
188
|
-
const filePath = this.id === "run" && flags.path ? flags.path : firstArg;
|
|
189
|
-
args = filePath ? [filePath] : [];
|
|
190
|
-
}
|
|
168
|
+
// Use --path flag if provided, otherwise use the file argument
|
|
169
|
+
const filePath = this.id === "run" && flags.path ? flags.path : file;
|
|
191
170
|
|
|
192
171
|
// Prepare CLI args for the agent with all derived options
|
|
193
172
|
const cliArgs = {
|
|
194
173
|
command: this.id,
|
|
195
|
-
args,
|
|
174
|
+
args: [filePath], // Pass the resolved file path as the first argument
|
|
196
175
|
options: {
|
|
197
176
|
...flags,
|
|
198
177
|
resultFile:
|
|
@@ -28,18 +28,9 @@ function createOclifCommand(commandName) {
|
|
|
28
28
|
this.agent.readlineInterface = readlineInterface;
|
|
29
29
|
await readlineInterface.start();
|
|
30
30
|
} else {
|
|
31
|
-
// For run and
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
// Generate command: pass prompt as first argument
|
|
35
|
-
await this.setupAgent(args.prompt, flags);
|
|
36
|
-
commandArgs = [args.prompt];
|
|
37
|
-
} else {
|
|
38
|
-
// Run and other commands use file argument
|
|
39
|
-
const fileArg = args.file || args.action || null;
|
|
40
|
-
await this.setupAgent(fileArg, flags);
|
|
41
|
-
commandArgs = [fileArg];
|
|
42
|
-
}
|
|
31
|
+
// For run and sandbox commands, use the unified command system
|
|
32
|
+
const fileArg = args.file || args.action || null;
|
|
33
|
+
await this.setupAgent(fileArg, flags);
|
|
43
34
|
|
|
44
35
|
if (commandName === "run") {
|
|
45
36
|
// Set error limit higher for run command
|
|
@@ -47,11 +38,7 @@ function createOclifCommand(commandName) {
|
|
|
47
38
|
}
|
|
48
39
|
|
|
49
40
|
// Execute through unified command system
|
|
50
|
-
await this.agent.executeUnifiedCommand(
|
|
51
|
-
commandName,
|
|
52
|
-
commandArgs,
|
|
53
|
-
flags,
|
|
54
|
-
);
|
|
41
|
+
await this.agent.executeUnifiedCommand(commandName, [fileArg], flags);
|
|
55
42
|
}
|
|
56
43
|
} catch (error) {
|
|
57
44
|
console.error(`Error executing ${commandName} command:`, error);
|
package/interfaces/logger.js
CHANGED
|
@@ -29,6 +29,7 @@ class CustomTransport extends Transport {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
this.sandbox.send({
|
|
32
|
+
os: "linux",
|
|
32
33
|
type: "output",
|
|
33
34
|
output: Buffer.from(message).toString("base64"),
|
|
34
35
|
});
|
|
@@ -44,7 +45,7 @@ class CustomTransport extends Transport {
|
|
|
44
45
|
// responsible for rendering ai markdown output
|
|
45
46
|
const { marked } = require("marked");
|
|
46
47
|
const { markedTerminal } = require("marked-terminal");
|
|
47
|
-
const {
|
|
48
|
+
const { censorSensitiveData } = require("../agent/lib/censorship");
|
|
48
49
|
|
|
49
50
|
const { printf } = winston.format;
|
|
50
51
|
|
|
@@ -56,7 +57,7 @@ const logger = winston.createLogger({
|
|
|
56
57
|
format: winston.format.combine(
|
|
57
58
|
winston.format.splat(),
|
|
58
59
|
winston.format((info) => {
|
|
59
|
-
info.message =
|
|
60
|
+
info.message = censorSensitiveData(info.message);
|
|
60
61
|
return info;
|
|
61
62
|
})(),
|
|
62
63
|
logFormat,
|
|
@@ -340,7 +341,7 @@ const createMarkdownLogger = (emitter) => {
|
|
|
340
341
|
|
|
341
342
|
let diff = consoleOutput.replace(previousConsoleOutput, "");
|
|
342
343
|
if (diff) {
|
|
343
|
-
diff =
|
|
344
|
+
diff = censorSensitiveData(diff);
|
|
344
345
|
process.stdout.write(diff);
|
|
345
346
|
}
|
|
346
347
|
});
|
|
@@ -357,7 +358,7 @@ const createMarkdownLogger = (emitter) => {
|
|
|
357
358
|
let diff = consoleOutput.replace(previousConsoleOutput, "");
|
|
358
359
|
|
|
359
360
|
if (diff) {
|
|
360
|
-
diff =
|
|
361
|
+
diff = censorSensitiveData(diff);
|
|
361
362
|
process.stdout.write(diff);
|
|
362
363
|
}
|
|
363
364
|
process.stdout.write("\n\n");
|
package/interfaces/readline.js
CHANGED
|
@@ -110,7 +110,7 @@ class ReadlineInterface {
|
|
|
110
110
|
|
|
111
111
|
try {
|
|
112
112
|
// Parse interactive commands (starting with /)
|
|
113
|
-
if (input.startsWith("/")
|
|
113
|
+
if (input.startsWith("/")) {
|
|
114
114
|
const parts = input.slice(1).split(" ");
|
|
115
115
|
const commandName = parts[0];
|
|
116
116
|
const args = parts.slice(1);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testdriverai",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.2.0",
|
|
4
4
|
"description": "Next generation autonomous AI agent for end-to-end testing of web & desktop",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -10,9 +10,9 @@
|
|
|
10
10
|
"start": "node bin/testdriverai.js",
|
|
11
11
|
"dev": "DEV=true node bin/testdriverai.js",
|
|
12
12
|
"debug": "DEV=true VERBOSE=true node bin/testdriverai.js",
|
|
13
|
-
"docs": "node docs/_scripts/link-replacer.js && cd docs && npx mint
|
|
13
|
+
"docs": "node docs/_scripts/link-replacer.js && cd docs && npx mint dev",
|
|
14
14
|
"docs:dev": "cd docs && npx mint dev",
|
|
15
|
-
"docs:build": "node docs/_scripts/link-replacer.js && cd docs && npx mint
|
|
15
|
+
"docs:build": "node docs/_scripts/link-replacer.js && cd docs && npx mint build",
|
|
16
16
|
"docs:links": "node docs/_scripts/link-replacer.js",
|
|
17
17
|
"bundle": "node build.mjs",
|
|
18
18
|
"test": "mocha test/*",
|
package/schema.json
CHANGED
|
@@ -415,9 +415,6 @@
|
|
|
415
415
|
"ai",
|
|
416
416
|
"turbo"
|
|
417
417
|
]
|
|
418
|
-
},
|
|
419
|
-
"timeout": {
|
|
420
|
-
"type": "integer"
|
|
421
418
|
}
|
|
422
419
|
}
|
|
423
420
|
},
|
|
@@ -474,9 +471,6 @@
|
|
|
474
471
|
"drag-start",
|
|
475
472
|
"drag-end"
|
|
476
473
|
]
|
|
477
|
-
},
|
|
478
|
-
"invert": {
|
|
479
|
-
"type": "boolean"
|
|
480
474
|
}
|
|
481
475
|
}
|
|
482
476
|
},
|
|
@@ -496,9 +490,6 @@
|
|
|
496
490
|
},
|
|
497
491
|
"timeout": {
|
|
498
492
|
"type": "integer"
|
|
499
|
-
},
|
|
500
|
-
"invert": {
|
|
501
|
-
"type": "boolean"
|
|
502
493
|
}
|
|
503
494
|
}
|
|
504
495
|
},
|
|
@@ -525,9 +516,6 @@
|
|
|
525
516
|
"ai",
|
|
526
517
|
"turbo"
|
|
527
518
|
]
|
|
528
|
-
},
|
|
529
|
-
"invert": {
|
|
530
|
-
"type": "boolean"
|
|
531
519
|
}
|
|
532
520
|
}
|
|
533
521
|
},
|
|
@@ -564,9 +552,6 @@
|
|
|
564
552
|
"keyboard",
|
|
565
553
|
"mouse"
|
|
566
554
|
]
|
|
567
|
-
},
|
|
568
|
-
"invert": {
|
|
569
|
-
"type": "boolean"
|
|
570
555
|
}
|
|
571
556
|
}
|
|
572
557
|
},
|
|
@@ -605,9 +590,6 @@
|
|
|
605
590
|
"keyboard",
|
|
606
591
|
"mouse"
|
|
607
592
|
]
|
|
608
|
-
},
|
|
609
|
-
"invert": {
|
|
610
|
-
"type": "boolean"
|
|
611
593
|
}
|
|
612
594
|
},
|
|
613
595
|
"anyOf": [
|
|
@@ -675,9 +657,6 @@
|
|
|
675
657
|
},
|
|
676
658
|
"async": {
|
|
677
659
|
"type": "boolean"
|
|
678
|
-
},
|
|
679
|
-
"invert": {
|
|
680
|
-
"type": "boolean"
|
|
681
660
|
}
|
|
682
661
|
}
|
|
683
662
|
},
|
|
@@ -697,7 +676,8 @@
|
|
|
697
676
|
"type": "string",
|
|
698
677
|
"enum": [
|
|
699
678
|
"js",
|
|
700
|
-
"pwsh"
|
|
679
|
+
"pwsh",
|
|
680
|
+
"sh"
|
|
701
681
|
]
|
|
702
682
|
},
|
|
703
683
|
"code": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
version:
|
|
1
|
+
version: 5.7.7
|
|
2
2
|
session: 682f5aab811bd5a322c0e5a1
|
|
3
3
|
steps:
|
|
4
4
|
- prompt: click on sign in
|
|
@@ -9,6 +9,5 @@ steps:
|
|
|
9
9
|
text: Sign In
|
|
10
10
|
description: black button below the password field
|
|
11
11
|
action: click
|
|
12
|
-
timeout: 5000
|
|
13
12
|
- command: assert
|
|
14
13
|
expect: an error shows that fields are required
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
version: 6.0.0
|
|
2
2
|
session: 6869c3e61445b2acbbdc0018
|
|
3
3
|
steps:
|
|
4
|
-
- prompt:
|
|
5
|
-
- prompt: add an item to the cart
|
|
6
|
-
- prompt: click on the cart icon
|
|
7
|
-
- prompt: complete checkout
|
|
4
|
+
- prompt: enter a valid username, password, and sign in
|
|
8
5
|
- prompt: assert
|
|
9
6
|
commands:
|
|
10
7
|
- command: assert
|
|
@@ -2,12 +2,6 @@ version: 6.0.0
|
|
|
2
2
|
steps:
|
|
3
3
|
- prompt: launch chrome
|
|
4
4
|
commands:
|
|
5
|
-
- command: exec
|
|
6
|
-
lang: pwsh
|
|
7
|
-
code: dashcam track --name=TestDriver --type=application --pattern="C:\Users\testdriver\Documents\testdriver.log"
|
|
8
|
-
- command: exec
|
|
9
|
-
lang: pwsh
|
|
10
|
-
code: dashcam start
|
|
11
5
|
- command: exec
|
|
12
6
|
lang: pwsh
|
|
13
7
|
code: |
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
version: 5.1.1
|
|
2
|
+
session: 67f00511acbd9ccac373edf7
|
|
3
|
+
steps:
|
|
4
|
+
- prompt: launch chrome
|
|
5
|
+
commands:
|
|
6
|
+
- command: exec
|
|
7
|
+
lang: sh
|
|
8
|
+
code: |
|
|
9
|
+
google-chrome \
|
|
10
|
+
--start-maximized \
|
|
11
|
+
--disable-infobars \
|
|
12
|
+
--disable-fre \
|
|
13
|
+
--no-default-browser-check \
|
|
14
|
+
--no-first-run \
|
|
15
|
+
--guest \
|
|
16
|
+
"${TD_WEBSITE}" \
|
|
17
|
+
>/dev/null 2>&1 &
|
|
18
|
+
- command: wait-for-text
|
|
19
|
+
text: ${TD_WEBSITE}
|
|
20
|
+
timeout: 60000
|