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.
Files changed (67) hide show
  1. package/.github/workflows/acceptance-tests.yml +0 -2
  2. package/.github/workflows/acceptance-v6.yml +0 -2
  3. package/.github/workflows/lint.yml +1 -4
  4. package/.github/workflows/publish-canary.yml +0 -2
  5. package/.github/workflows/publish-latest.yml +0 -1
  6. package/.prettierignore +0 -1
  7. package/.vscode/settings.json +1 -4
  8. package/agent/events.js +10 -1
  9. package/agent/index.js +76 -104
  10. package/agent/interface.js +6 -43
  11. package/agent/lib/censorship.js +10 -15
  12. package/agent/lib/commander.js +18 -31
  13. package/agent/lib/commands.js +63 -81
  14. package/agent/lib/debugger-server.js +5 -0
  15. package/agent/lib/generator.js +2 -2
  16. package/agent/lib/redraw.js +1 -0
  17. package/agent/lib/sandbox.js +2 -0
  18. package/agent/lib/sdk.js +1 -2
  19. package/agent/lib/source-mapper.js +1 -1
  20. package/agent/lib/system.js +6 -1
  21. package/docs/account/enterprise.mdx +12 -8
  22. package/docs/account/pricing.mdx +2 -2
  23. package/docs/account/projects.mdx +0 -5
  24. package/docs/cli/overview.mdx +6 -6
  25. package/docs/commands/assert.mdx +0 -1
  26. package/docs/commands/hover-text.mdx +1 -3
  27. package/docs/commands/match-image.mdx +4 -5
  28. package/docs/commands/press-keys.mdx +8 -6
  29. package/docs/commands/scroll-until-image.mdx +7 -8
  30. package/docs/commands/scroll-until-text.mdx +6 -7
  31. package/docs/commands/wait-for-image.mdx +4 -5
  32. package/docs/commands/wait-for-text.mdx +5 -6
  33. package/docs/docs.json +40 -42
  34. package/docs/getting-started/vscode.mdx +56 -67
  35. package/docs/guide/environment-variables.mdx +5 -5
  36. package/docs/overview/comparison.mdx +39 -22
  37. package/docs/overview/quickstart.mdx +32 -84
  38. package/docs/styles.css +1 -10
  39. package/interfaces/cli/lib/base.js +6 -27
  40. package/interfaces/cli/utils/factory.js +4 -17
  41. package/interfaces/logger.js +5 -4
  42. package/interfaces/readline.js +1 -1
  43. package/package.json +3 -3
  44. package/schema.json +2 -22
  45. package/testdriver/acceptance/hover-text.yaml +1 -2
  46. package/testdriver/acceptance/prompt.yaml +1 -4
  47. package/testdriver/acceptance/scroll-until-image.yaml +0 -5
  48. package/testdriver/{lifecycle/prerun.yaml → examples/web/lifecycle/provision.yaml} +0 -6
  49. package/testdriver/lifecycle/provision.yaml +20 -0
  50. package/.github/workflows/self-hosted.yml +0 -102
  51. package/docs/apps/tauri-apps.mdx +0 -361
  52. package/docs/getting-started/playwright.mdx +0 -342
  53. package/docs/getting-started/self-hosting.mdx +0 -370
  54. package/docs/guide/dashcam.mdx +0 -118
  55. package/docs/images/content/self-hosted/launchtemplateid.png +0 -0
  56. package/docs/images/content/vscode/ide-full.png +0 -0
  57. package/docs/images/content/vscode/running.png +0 -0
  58. package/interfaces/cli/commands/generate.js +0 -3
  59. package/setup/aws/cloudformation.yaml +0 -463
  60. package/setup/aws/spawn-runner.sh +0 -190
  61. package/testdriver/edge-cases/js-exception.yaml +0 -8
  62. package/testdriver/edge-cases/js-promise.yaml +0 -19
  63. package/testdriver/edge-cases/lifecycle/postrun.yaml +0 -10
  64. package/testdriver/edge-cases/success-test.yaml +0 -9
  65. package/testdriver/examples/web/lifecycle/postrun.yaml +0 -7
  66. package/testdriver/examples/web/lifecycle/prerun.yaml +0 -17
  67. 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
- | Application | TestDriver | Playwright | Selenium |
14
- |:-----------------:|:---------:|:-----------:|:--------:| | Web Apps | ✅ |
15
- | | | Mobile Apps | ✅ | ✅ | ✅ | | VS Code | ✅ | ✅ | ✅ | | Desktop
16
- Apps | | | | | Chrome Extensions | | | |
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
- | Feature | TestDriver | Playwright | Selenium |
25
- |:--------------------:|:---------:|:----------:|:--------:| | Test Generation
26
- | | | | | Adaptive Testing | | | | | Visual Assertions | ✅ | | | | Self
27
- Healing | | | | | Application Switching | | | | | GitHub Actions | ✅ |
28
- | | | Team Dashboard | | | | | Team Collaboration | ✅ | | |
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
- | Feature | TestDriver | Playwright | Selenium |
57
- |:------------------:|:----------:|:----------:|:--------:| | AI Summary | ✅
58
- | | | | Video Replay | || | | Browser Logs | ✅ | ✅ | | | Desktop Logs
59
- | | | | | Network Requests | | ✅ | | | Team Dashboard | ✅ | | | | Team
60
- Collaboration | | | |
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
- | Feature | TestDriver | Playwright | Selenium |
69
- |:--------:|:----------:|:----------:|:--------:| | Chrome | ✅ | ✅ | ✅ | |
70
- Firefox | | ✅ | ✅ | | Webkit | | ✅ | ✅ | | IE | ✅ | | ✅ | | Edge |
71
- | | ✅ | | Opera | | | | | Safari | ✅ | | ✅ |
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
- | Feature | TestDriver | Playwright | Selenium |
80
- |:--------:|:----------:|:----------:|:--------:| | Windows | ✅ | ✅ | ✅ | |
81
- Mac | | ✅ | ✅ | | Linux | | | ✅ |
82
- </div>
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="Create a TestDriver Account">
11
-
12
- You will need a [TestDriver Pro](https://app.testdriver.ai/team) account ($20/month) to get an API key.
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
- </Step>
23
- <Step title="Set up your environment">
24
-
25
- Copy your API key from [the TestDriver dashboard](https://app.testdriver.ai/team), and set it as an environment variable.
26
-
27
- <Tabs>
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
- TestDriver tests are written in YAML, a human-readable data format. The `prompt.yaml` file contains an example series of steps for the agent to execute.
34
+ > </Card>
53
35
 
54
- ```yaml testdriver/acceptance/prompt.yaml
55
- steps:
56
- - prompt: log in
57
- - prompt: add an item to the cart
58
- - prompt: click on the cart icon
59
- - prompt: complete checkout
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
- Each step has a `prompt` that describes what the agent should do. The agent will use the prompt to generate [commands](/commands/assert) that make the tests faster and more reliable the next time you run the test.
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="Generate regression test from prompts">
47
+ <Step title="Run your tests in CI/CD">
66
48
 
67
- Run the following command to run the test file. TestDriver will spawn a virtual machine, launch the sandbox test page, and execute the steps defined in the `prompt.yaml` file.
49
+ Next, use `testdriverai` to run your tests in CI/CD pipelines.
68
50
 
69
51
  ```bash
70
- npx testdriverai@latest run prompt.yaml --write --heal
52
+ TD_API_KEY=YOUR_KEY npx testdriverai@latest run testdriver/test.yaml
71
53
  ```
72
54
 
73
- The `--write` flag tells TestDriver to save any generated commands to the test file, and the `--heal` flag allows TestDriver to recover from unexpected issues during the test run.
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
@@ -53,13 +53,4 @@
53
53
  transform: translateX(-50%);
54
54
  justify-content: center;
55
55
  display: flex;
56
- }
57
-
58
- img[src$=".svg"] {
59
- background: transparent !important;
60
- }
61
-
62
- img[src$="https://tauri.app/favicon.svg"]
63
- {
64
- opacity: 0.3;
65
- }
56
+ }
@@ -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(firstArg, flags) {
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
- let args;
183
- if (this.id === "generate") {
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 generate commands, use the unified command system
32
- let commandArgs;
33
- if (commandName === "generate") {
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);
@@ -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 { censorSensitiveDataDeep } = require("../agent/lib/censorship");
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 = censorSensitiveDataDeep(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 = censorSensitiveDataDeep(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 = censorSensitiveDataDeep(diff);
361
+ diff = censorSensitiveData(diff);
361
362
  process.stdout.write(diff);
362
363
  }
363
364
  process.stdout.write("\n\n");
@@ -110,7 +110,7 @@ class ReadlineInterface {
110
110
 
111
111
  try {
112
112
  // Parse interactive commands (starting with /)
113
- if (input.startsWith("/") && !input.startsWith("/explore")) {
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.1.10",
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@latest dev",
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@latest build",
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: 6.0.0
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: log in
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
@@ -19,8 +19,3 @@ steps:
19
19
  - command: scroll-until-image
20
20
  description: a brown colored house
21
21
  direction: down
22
-
23
- - prompt: assert image of brown colored house appears on screen
24
- commands:
25
- - command: assert
26
- expect: image of brown colored house appears on screen
@@ -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