cbrowser 6.0.0 → 6.1.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/README.md +85 -0
- package/dist/browser.d.ts +64 -1
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +420 -0
- package/dist/browser.js.map +1 -1
- package/dist/cli.js +262 -2
- package/dist/cli.js.map +1 -1
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -101,6 +101,91 @@ npx cbrowser compare-personas --start "..." --goal "..." --html
|
|
|
101
101
|
- "Mobile users experience 2x more friction - review mobile UX"
|
|
102
102
|
- "Common friction: 'Button too small for touch', 'Form validation unclear'"
|
|
103
103
|
|
|
104
|
+
## v6.1.0 Features
|
|
105
|
+
|
|
106
|
+
### Natural Language Test Suites
|
|
107
|
+
|
|
108
|
+
Write tests in plain English - CBrowser parses and executes them:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
# Run tests from a file
|
|
112
|
+
npx cbrowser test-suite login-test.txt --html
|
|
113
|
+
|
|
114
|
+
# Run inline tests (steps separated by semicolons)
|
|
115
|
+
npx cbrowser test-suite --inline "go to https://example.com ; click login ; verify url contains /dashboard"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Test file format:**
|
|
119
|
+
|
|
120
|
+
```txt
|
|
121
|
+
# Test: Login Flow
|
|
122
|
+
go to https://example.com
|
|
123
|
+
click the login button
|
|
124
|
+
type "user@example.com" in email field
|
|
125
|
+
type "password123" in password field
|
|
126
|
+
click submit
|
|
127
|
+
verify url contains "/dashboard"
|
|
128
|
+
|
|
129
|
+
# Test: Search Functionality
|
|
130
|
+
go to https://example.com/search
|
|
131
|
+
type "test query" in search box
|
|
132
|
+
click search button
|
|
133
|
+
verify page contains "results"
|
|
134
|
+
take screenshot
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
**Supported instructions:**
|
|
138
|
+
|
|
139
|
+
| Instruction | Examples |
|
|
140
|
+
|-------------|----------|
|
|
141
|
+
| **Navigate** | `go to https://...`, `navigate to https://...`, `open https://...` |
|
|
142
|
+
| **Click** | `click the login button`, `click submit`, `press Enter` |
|
|
143
|
+
| **Fill** | `type "value" in email field`, `fill username with "john"` |
|
|
144
|
+
| **Select** | `select "Option A" from dropdown` |
|
|
145
|
+
| **Scroll** | `scroll down`, `scroll up 5 times` |
|
|
146
|
+
| **Wait** | `wait 2 seconds`, `wait for "Loading" appears` |
|
|
147
|
+
| **Assert** | `verify page contains "Welcome"`, `verify url contains "/home"`, `verify title is "Dashboard"` |
|
|
148
|
+
| **Screenshot** | `take screenshot` |
|
|
149
|
+
|
|
150
|
+
**Output options:**
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Continue after failures
|
|
154
|
+
npx cbrowser test-suite tests.txt --continue-on-failure
|
|
155
|
+
|
|
156
|
+
# Save JSON report
|
|
157
|
+
npx cbrowser test-suite tests.txt --output results.json
|
|
158
|
+
|
|
159
|
+
# Generate HTML report
|
|
160
|
+
npx cbrowser test-suite tests.txt --html
|
|
161
|
+
|
|
162
|
+
# Combined
|
|
163
|
+
npx cbrowser test-suite tests.txt --output results.json --html
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
**API usage:**
|
|
167
|
+
|
|
168
|
+
```typescript
|
|
169
|
+
import { parseNLTestSuite, runNLTestSuite, formatNLTestReport } from 'cbrowser';
|
|
170
|
+
|
|
171
|
+
const suite = parseNLTestSuite(`
|
|
172
|
+
# Test: Homepage
|
|
173
|
+
go to https://example.com
|
|
174
|
+
verify title contains "Example"
|
|
175
|
+
click the about link
|
|
176
|
+
verify url contains "/about"
|
|
177
|
+
`, "My Test Suite");
|
|
178
|
+
|
|
179
|
+
const result = await runNLTestSuite(suite, {
|
|
180
|
+
continueOnFailure: true,
|
|
181
|
+
screenshotOnFailure: true,
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
console.log(formatNLTestReport(result));
|
|
185
|
+
// Pass rate: 100%
|
|
186
|
+
// Tests: 1 passed, 0 failed
|
|
187
|
+
```
|
|
188
|
+
|
|
104
189
|
## v5.0.0 Features
|
|
105
190
|
|
|
106
191
|
### Smart Click with Auto-Retry
|
package/dist/browser.d.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* AI-powered browser automation with constitutional safety.
|
|
5
5
|
*/
|
|
6
6
|
import { type CBrowserConfig } from "./config.js";
|
|
7
|
-
import type { SavedSession, NavigationResult, ClickResult, ExtractResult, JourneyResult, CleanupOptions, CleanupResult, JourneyOptions, NetworkMock, NetworkRequest, PerformanceMetrics, PerformanceAuditResult, SmartRetryResult, AssertionResult, SelectorCacheEntry, SelectorCacheStats, PageAnalysis, TestGenerationResult, PersonaComparisonResult } from "./types.js";
|
|
7
|
+
import type { SavedSession, NavigationResult, ClickResult, ExtractResult, JourneyResult, CleanupOptions, CleanupResult, JourneyOptions, NetworkMock, NetworkRequest, PerformanceMetrics, PerformanceAuditResult, SmartRetryResult, AssertionResult, SelectorCacheEntry, SelectorCacheStats, PageAnalysis, TestGenerationResult, PersonaComparisonResult, NLTestStep, NLTestCase, NLTestSuiteResult } from "./types.js";
|
|
8
8
|
export declare class CBrowser {
|
|
9
9
|
private config;
|
|
10
10
|
private paths;
|
|
@@ -566,4 +566,67 @@ export declare function comparePersonas(options: ComparePersonasOptions): Promis
|
|
|
566
566
|
* Generate a formatted comparison report.
|
|
567
567
|
*/
|
|
568
568
|
export declare function formatComparisonReport(comparison: PersonaComparisonResult): string;
|
|
569
|
+
/**
|
|
570
|
+
* Parse a single natural language instruction into an NLTestStep.
|
|
571
|
+
*
|
|
572
|
+
* Supported patterns:
|
|
573
|
+
* - "go to https://..." / "navigate to https://..." / "open https://..."
|
|
574
|
+
* - "click [the] <target>" / "press <target>"
|
|
575
|
+
* - "type '<value>' in[to] <target>" / "fill <target> with '<value>'"
|
|
576
|
+
* - "select '<option>' from <dropdown>"
|
|
577
|
+
* - "scroll down/up"
|
|
578
|
+
* - "wait [for] <seconds> seconds"
|
|
579
|
+
* - "verify <assertion>" / "assert <assertion>" / "check <assertion>"
|
|
580
|
+
* - "take screenshot"
|
|
581
|
+
*/
|
|
582
|
+
export declare function parseNLInstruction(instruction: string): NLTestStep;
|
|
583
|
+
/**
|
|
584
|
+
* Parse a natural language test suite from text.
|
|
585
|
+
*
|
|
586
|
+
* Format:
|
|
587
|
+
* ```
|
|
588
|
+
* # Test: Login Flow
|
|
589
|
+
* go to https://example.com
|
|
590
|
+
* click the login button
|
|
591
|
+
* type "user@example.com" in email field
|
|
592
|
+
* type "password123" in password field
|
|
593
|
+
* click submit
|
|
594
|
+
* verify url contains "/dashboard"
|
|
595
|
+
*
|
|
596
|
+
* # Test: Search Functionality
|
|
597
|
+
* go to https://example.com
|
|
598
|
+
* type "test query" in search box
|
|
599
|
+
* click search button
|
|
600
|
+
* verify page contains "results"
|
|
601
|
+
* ```
|
|
602
|
+
*/
|
|
603
|
+
export declare function parseNLTestSuite(text: string, suiteName?: string): {
|
|
604
|
+
name: string;
|
|
605
|
+
tests: NLTestCase[];
|
|
606
|
+
};
|
|
607
|
+
export interface NLTestSuiteOptions {
|
|
608
|
+
/** Maximum time per step in ms */
|
|
609
|
+
stepTimeout?: number;
|
|
610
|
+
/** Continue running after a test fails */
|
|
611
|
+
continueOnFailure?: boolean;
|
|
612
|
+
/** Take screenshots on failure */
|
|
613
|
+
screenshotOnFailure?: boolean;
|
|
614
|
+
/** Run headless */
|
|
615
|
+
headless?: boolean;
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Run a natural language test suite.
|
|
619
|
+
*/
|
|
620
|
+
export declare function runNLTestSuite(suite: {
|
|
621
|
+
name: string;
|
|
622
|
+
tests: NLTestCase[];
|
|
623
|
+
}, options?: NLTestSuiteOptions): Promise<NLTestSuiteResult>;
|
|
624
|
+
/**
|
|
625
|
+
* Format a test suite result as a report.
|
|
626
|
+
*/
|
|
627
|
+
export declare function formatNLTestReport(result: NLTestSuiteResult): string;
|
|
628
|
+
/**
|
|
629
|
+
* Run a natural language test suite from a file.
|
|
630
|
+
*/
|
|
631
|
+
export declare function runNLTestFile(filepath: string, options?: NLTestSuiteOptions): Promise<NLTestSuiteResult>;
|
|
569
632
|
//# sourceMappingURL=browser.d.ts.map
|
package/dist/browser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,KAAK,cAAc,EAAgE,MAAM,aAAa,CAAC;AAEhH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,aAAa,EAKb,cAAc,EACd,aAAa,EACb,cAAc,EAEd,WAAW,EACX,cAAc,EAId,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAEhB,eAAe,EAEf,kBAAkB,EAElB,kBAAkB,EAElB,YAAY,EAIZ,oBAAoB,EAEpB,uBAAuB,EACvB,UAAU,EACV,UAAU,EAGV,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAwBpB,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAgB;IAC7B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,OAAO,CAA+B;IAC9C,OAAO,CAAC,IAAI,CAAqB;IACjC,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,cAAc,CAAS;gBAEnB,UAAU,GAAE,OAAO,CAAC,cAAc,CAAM;IASpD;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAiH7B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY5B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAa5B;;OAEG;YACW,OAAO;IAWrB;;OAEG;YACW,iBAAiB;IA0C/B;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAKtD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IASxC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAgF5B;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAKzB;;OAEG;IACG,SAAS,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBrD;;OAEG;IACH,kBAAkB,IAAI,cAAc,EAAE;IAItC;;OAEG;IACH,mBAAmB,IAAI,IAAI;IAS3B;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAqE1D;;OAEG;IACG,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoDrE;;OAEG;IACG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IAOnE;;OAEG;IACG,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOjE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAKnC;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBhE;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS5C;;OAEG;IACG,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAc3D;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAQtC;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,MAAM,EAAE;IAQ9B;;OAEG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;IAYtG;;OAEG;IACG,qBAAqB,CACzB,QAAQ,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5E,OAAO,CAAC,OAAO,CAAC;IAiBnB;;OAEG;IACH,MAAM,CAAC,aAAa,IAAI,MAAM,EAAE;IAQhC;;OAEG;IACG,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAsCtD;;OAEG;IACG,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA+CtF;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAqCjE;;OAEG;IACG,UAAU,CACd,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO,GAC1E,OAAO,CAAC,gBAAgB,CAAC;IAqE5B;;OAEG;YACW,wBAAwB;IAyDtC,OAAO,CAAC,aAAa,CAA8B;IAEnD;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAsBhC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAMzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;OAEG;IACH,qBAAqB,IAAI,kBAAkB;IA0B3C;;OAEG;IACH,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAsB3C;;OAEG;IACH,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,kBAAkB,EAAE;IAe1D;;OAEG;IACG,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkBhE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,YAAY,CAAC;IAkH1C;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoG7B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAqC9B;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAiD9B;;OAEG;YACW,cAAc;IAwB5B;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAuBzD;;OAEG;YACW,iBAAiB;IAyF/B;;OAEG;YACW,WAAW;IA6EzB;;OAEG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8DnD;;OAEG;IACG,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAYhD;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6C9C;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2CjD;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;IAKxB;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAapC;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAqH9D;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB;;OAEG;IACH,OAAO,CAAC,KAAK;IA8Bb;;OAEG;IACH,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,aAAa;IA4DpD;;OAEG;IACH,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBlE;;OAEG;IACH,UAAU,IAAI,MAAM;IAQpB;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyB/D;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,OAAO,CAAC;QACpE,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,cAAc,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IA6BF;;OAEG;IACH,aAAa,IAAI,MAAM,EAAE;IAYzB;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC;QAClC,GAAG,EAAE,MAAM,CAAC;QACZ,UAAU,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACxF,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IA0EF,OAAO,CAAC,gBAAgB,CAAmG;IAC3H,OAAO,CAAC,WAAW,CAAS;IAE5B;;OAEG;IACG,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjD;;OAEG;IACH,aAAa,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAK5G;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,MAAM;IAkB1I;;OAEG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,MAAM;IA+BzH;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAoBnJ;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM;IAmB/H;;OAEG;WACU,QAAQ,CAAC,CAAC,EACrB,KAAK,EAAE,KAAK,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,aAAa,EAAE,cAAc,CAAC,CAAC;QACvD,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;KACxC,CAAC,EACF,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAsCjF;;OAEG;WACU,eAAe,CAAC,CAAC,EAC5B,OAAO,EAAE,MAAM,EAAE,EACjB,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtD,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAO,GACxC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAWnF;;OAEG;WACU,YAAY,CAAC,CAAC,EACzB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnD,OAAO,GAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAC,OAAO,aAAa,EAAE,cAAc,CAAC,CAAA;KAAO,GAChG,OAAO,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAehF;;OAEG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;CAIjD;AAED;;GAEG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,QAAQ;IAE/B,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;IAK/E,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAK9D,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKlD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAKzC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC;IAKzE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,IAAI,QAAQ,IAAI,QAAQ,CAEvB;CACF;AAkDD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,IAAI,CAW/G;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACxF,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CA4CD;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,QAAQ,EACjB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAWzG;AAMD;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAyH/E;AAMD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,GAAG,eAAe,GAAG,gBAAgB,GAAG,eAAe,GAAG,eAAe,GAAG,YAAY,CAAC;IAC5G,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,QAAQ,EACjB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACvE,OAAO,CAAC;IACT,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC,CAoGD;AAMD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;QAChD,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;KACpB,CAAC,CAAC;IACH,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,QAAQ,GAAE,KAAK,CAAC,UAAU,GAAG,SAAS,GAAG,QAAQ,CAAqC,GACrF,OAAO,CAAC,iBAAiB,CAAC,CAyD5B;AAMD,MAAM,WAAW,WAAW;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CtF;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,QAAQ,EACjB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,MAAM,EAAO,GACrB,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAgCD;AAMD,MAAM,WAAW,sBAAsB;IACrC,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,uBAAuB,CAAC,CAoMlC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,uBAAuB,GAAG,MAAM,CAsDlF;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,UAAU,CAuIlE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,GAAE,MAAwB,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,CA0CvC;AAED,MAAM,WAAW,kBAAkB;IACjC,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,kCAAkC;IAClC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,mBAAmB;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAA;CAAE,EAC5C,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAqL5B;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA2DpE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAU5B"}
|
package/dist/browser.js
CHANGED
|
@@ -16,6 +16,11 @@ exports.applyChaos = applyChaos;
|
|
|
16
16
|
exports.runChaosTest = runChaosTest;
|
|
17
17
|
exports.comparePersonas = comparePersonas;
|
|
18
18
|
exports.formatComparisonReport = formatComparisonReport;
|
|
19
|
+
exports.parseNLInstruction = parseNLInstruction;
|
|
20
|
+
exports.parseNLTestSuite = parseNLTestSuite;
|
|
21
|
+
exports.runNLTestSuite = runNLTestSuite;
|
|
22
|
+
exports.formatNLTestReport = formatNLTestReport;
|
|
23
|
+
exports.runNLTestFile = runNLTestFile;
|
|
19
24
|
const playwright_1 = require("playwright");
|
|
20
25
|
const fs_1 = require("fs");
|
|
21
26
|
const path_1 = require("path");
|
|
@@ -2877,4 +2882,419 @@ function formatComparisonReport(comparison) {
|
|
|
2877
2882
|
lines.push("");
|
|
2878
2883
|
return lines.join("\n");
|
|
2879
2884
|
}
|
|
2885
|
+
// =========================================================================
|
|
2886
|
+
// Natural Language Test Suites
|
|
2887
|
+
// =========================================================================
|
|
2888
|
+
/**
|
|
2889
|
+
* Parse a single natural language instruction into an NLTestStep.
|
|
2890
|
+
*
|
|
2891
|
+
* Supported patterns:
|
|
2892
|
+
* - "go to https://..." / "navigate to https://..." / "open https://..."
|
|
2893
|
+
* - "click [the] <target>" / "press <target>"
|
|
2894
|
+
* - "type '<value>' in[to] <target>" / "fill <target> with '<value>'"
|
|
2895
|
+
* - "select '<option>' from <dropdown>"
|
|
2896
|
+
* - "scroll down/up"
|
|
2897
|
+
* - "wait [for] <seconds> seconds"
|
|
2898
|
+
* - "verify <assertion>" / "assert <assertion>" / "check <assertion>"
|
|
2899
|
+
* - "take screenshot"
|
|
2900
|
+
*/
|
|
2901
|
+
function parseNLInstruction(instruction) {
|
|
2902
|
+
const lower = instruction.toLowerCase().trim();
|
|
2903
|
+
// Navigate patterns
|
|
2904
|
+
const navigateMatch = lower.match(/^(?:go to|navigate to|open|visit)\s+(.+)$/i);
|
|
2905
|
+
if (navigateMatch) {
|
|
2906
|
+
return {
|
|
2907
|
+
instruction,
|
|
2908
|
+
action: "navigate",
|
|
2909
|
+
target: navigateMatch[1].trim(),
|
|
2910
|
+
};
|
|
2911
|
+
}
|
|
2912
|
+
// Click patterns
|
|
2913
|
+
const clickMatch = lower.match(/^(?:click|tap|press)\s+(?:on\s+)?(?:the\s+)?(.+)$/i);
|
|
2914
|
+
if (clickMatch) {
|
|
2915
|
+
return {
|
|
2916
|
+
instruction,
|
|
2917
|
+
action: "click",
|
|
2918
|
+
target: clickMatch[1].trim(),
|
|
2919
|
+
};
|
|
2920
|
+
}
|
|
2921
|
+
// Fill patterns: "type 'value' in target" or "fill target with 'value'"
|
|
2922
|
+
const typeMatch = lower.match(/^(?:type|enter)\s+['"](.+?)['"]\s+(?:in|into)\s+(?:the\s+)?(.+)$/i);
|
|
2923
|
+
if (typeMatch) {
|
|
2924
|
+
return {
|
|
2925
|
+
instruction,
|
|
2926
|
+
action: "fill",
|
|
2927
|
+
value: typeMatch[1],
|
|
2928
|
+
target: typeMatch[2].trim(),
|
|
2929
|
+
};
|
|
2930
|
+
}
|
|
2931
|
+
const fillMatch = lower.match(/^fill\s+(?:the\s+)?(.+?)\s+with\s+['"](.+?)['"]$/i);
|
|
2932
|
+
if (fillMatch) {
|
|
2933
|
+
return {
|
|
2934
|
+
instruction,
|
|
2935
|
+
action: "fill",
|
|
2936
|
+
target: fillMatch[1].trim(),
|
|
2937
|
+
value: fillMatch[2],
|
|
2938
|
+
};
|
|
2939
|
+
}
|
|
2940
|
+
// Select patterns
|
|
2941
|
+
const selectMatch = lower.match(/^select\s+['"](.+?)['"]\s+(?:from|in)\s+(?:the\s+)?(.+)$/i);
|
|
2942
|
+
if (selectMatch) {
|
|
2943
|
+
return {
|
|
2944
|
+
instruction,
|
|
2945
|
+
action: "select",
|
|
2946
|
+
value: selectMatch[1],
|
|
2947
|
+
target: selectMatch[2].trim(),
|
|
2948
|
+
};
|
|
2949
|
+
}
|
|
2950
|
+
// Scroll patterns
|
|
2951
|
+
const scrollMatch = lower.match(/^scroll\s+(up|down|left|right)(?:\s+(\d+)\s+(?:times|pixels))?$/i);
|
|
2952
|
+
if (scrollMatch) {
|
|
2953
|
+
return {
|
|
2954
|
+
instruction,
|
|
2955
|
+
action: "scroll",
|
|
2956
|
+
target: scrollMatch[1],
|
|
2957
|
+
value: scrollMatch[2] || "3",
|
|
2958
|
+
};
|
|
2959
|
+
}
|
|
2960
|
+
// Wait patterns
|
|
2961
|
+
const waitMatch = lower.match(/^wait\s+(?:for\s+)?(\d+(?:\.\d+)?)\s*(?:seconds?|s)$/i);
|
|
2962
|
+
if (waitMatch) {
|
|
2963
|
+
return {
|
|
2964
|
+
instruction,
|
|
2965
|
+
action: "wait",
|
|
2966
|
+
value: waitMatch[1],
|
|
2967
|
+
};
|
|
2968
|
+
}
|
|
2969
|
+
// Wait for text pattern
|
|
2970
|
+
const waitForMatch = lower.match(/^wait\s+(?:for|until)\s+['"](.+?)['"]\s+(?:appears?|is visible|shows?)$/i);
|
|
2971
|
+
if (waitForMatch) {
|
|
2972
|
+
return {
|
|
2973
|
+
instruction,
|
|
2974
|
+
action: "wait",
|
|
2975
|
+
target: waitForMatch[1],
|
|
2976
|
+
};
|
|
2977
|
+
}
|
|
2978
|
+
// Assert/verify patterns
|
|
2979
|
+
const assertPatterns = [
|
|
2980
|
+
// Title assertions
|
|
2981
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?(?:page\s+)?title\s+(?:contains?|has)\s+['"](.+?)['"]$/i, type: "title", assertType: "contains" },
|
|
2982
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?(?:page\s+)?title\s+(?:is|equals?)\s+['"](.+?)['"]$/i, type: "title", assertType: "equals" },
|
|
2983
|
+
// URL assertions
|
|
2984
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?url\s+(?:contains?|has)\s+['"](.+?)['"]$/i, type: "url", assertType: "contains" },
|
|
2985
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?url\s+(?:is|equals?)\s+['"](.+?)['"]$/i, type: "url", assertType: "equals" },
|
|
2986
|
+
// Content assertions
|
|
2987
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?(?:page\s+)?(?:contains?|has|shows?)\s+['"](.+?)['"]$/i, type: "content", assertType: "contains" },
|
|
2988
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?['"](.+?)['"]\s+(?:is\s+)?(?:visible|displayed|shown)$/i, type: "content", assertType: "contains" },
|
|
2989
|
+
// Element exists
|
|
2990
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?['"](.+?)['"]\s+exists?$/i, type: "element", assertType: "exists" },
|
|
2991
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?(?:there\s+is\s+)?(?:a|an)\s+['"](.+?)['"]$/i, type: "element", assertType: "exists" },
|
|
2992
|
+
// Count assertions
|
|
2993
|
+
{ pattern: /^(?:verify|assert|check)\s+(?:that\s+)?(?:there\s+are\s+)?(\d+)\s+(.+?)$/i, type: "count", assertType: "count" },
|
|
2994
|
+
];
|
|
2995
|
+
for (const { pattern, type, assertType } of assertPatterns) {
|
|
2996
|
+
const match = lower.match(pattern);
|
|
2997
|
+
if (match) {
|
|
2998
|
+
return {
|
|
2999
|
+
instruction,
|
|
3000
|
+
action: "assert",
|
|
3001
|
+
target: type === "count" ? match[2] : match[1],
|
|
3002
|
+
value: type === "count" ? match[1] : undefined,
|
|
3003
|
+
assertionType: assertType,
|
|
3004
|
+
};
|
|
3005
|
+
}
|
|
3006
|
+
}
|
|
3007
|
+
// Screenshot pattern
|
|
3008
|
+
if (/^(?:take\s+(?:a\s+)?screenshot|screenshot|capture\s+(?:the\s+)?(?:page|screen))$/i.test(lower)) {
|
|
3009
|
+
return {
|
|
3010
|
+
instruction,
|
|
3011
|
+
action: "screenshot",
|
|
3012
|
+
};
|
|
3013
|
+
}
|
|
3014
|
+
// Unknown - return as-is for AI-powered interpretation later
|
|
3015
|
+
return {
|
|
3016
|
+
instruction,
|
|
3017
|
+
action: "unknown",
|
|
3018
|
+
target: instruction,
|
|
3019
|
+
};
|
|
3020
|
+
}
|
|
3021
|
+
/**
|
|
3022
|
+
* Parse a natural language test suite from text.
|
|
3023
|
+
*
|
|
3024
|
+
* Format:
|
|
3025
|
+
* ```
|
|
3026
|
+
* # Test: Login Flow
|
|
3027
|
+
* go to https://example.com
|
|
3028
|
+
* click the login button
|
|
3029
|
+
* type "user@example.com" in email field
|
|
3030
|
+
* type "password123" in password field
|
|
3031
|
+
* click submit
|
|
3032
|
+
* verify url contains "/dashboard"
|
|
3033
|
+
*
|
|
3034
|
+
* # Test: Search Functionality
|
|
3035
|
+
* go to https://example.com
|
|
3036
|
+
* type "test query" in search box
|
|
3037
|
+
* click search button
|
|
3038
|
+
* verify page contains "results"
|
|
3039
|
+
* ```
|
|
3040
|
+
*/
|
|
3041
|
+
function parseNLTestSuite(text, suiteName = "Unnamed Suite") {
|
|
3042
|
+
const lines = text.split("\n").map(l => l.trim()).filter(l => l && !l.startsWith("//"));
|
|
3043
|
+
const tests = [];
|
|
3044
|
+
let currentTest = null;
|
|
3045
|
+
for (const line of lines) {
|
|
3046
|
+
// Check for test header: "# Test: Name" or "## Name" or "Test: Name"
|
|
3047
|
+
const testHeaderMatch = line.match(/^(?:#\s*)?(?:test:\s*)?(.+)$/i);
|
|
3048
|
+
if (line.startsWith("#") || line.toLowerCase().startsWith("test:")) {
|
|
3049
|
+
// Save previous test if exists
|
|
3050
|
+
if (currentTest && currentTest.steps.length > 0) {
|
|
3051
|
+
tests.push(currentTest);
|
|
3052
|
+
}
|
|
3053
|
+
const name = testHeaderMatch?.[1]?.replace(/^#+\s*/, "").replace(/^test:\s*/i, "").trim() || "Unnamed Test";
|
|
3054
|
+
currentTest = {
|
|
3055
|
+
name,
|
|
3056
|
+
steps: [],
|
|
3057
|
+
};
|
|
3058
|
+
}
|
|
3059
|
+
else if (line.length > 0) {
|
|
3060
|
+
// Parse as instruction
|
|
3061
|
+
if (!currentTest) {
|
|
3062
|
+
// Create default test if no header found
|
|
3063
|
+
currentTest = {
|
|
3064
|
+
name: "Default Test",
|
|
3065
|
+
steps: [],
|
|
3066
|
+
};
|
|
3067
|
+
}
|
|
3068
|
+
const step = parseNLInstruction(line);
|
|
3069
|
+
currentTest.steps.push(step);
|
|
3070
|
+
}
|
|
3071
|
+
}
|
|
3072
|
+
// Save final test
|
|
3073
|
+
if (currentTest && currentTest.steps.length > 0) {
|
|
3074
|
+
tests.push(currentTest);
|
|
3075
|
+
}
|
|
3076
|
+
return { name: suiteName, tests };
|
|
3077
|
+
}
|
|
3078
|
+
/**
|
|
3079
|
+
* Run a natural language test suite.
|
|
3080
|
+
*/
|
|
3081
|
+
async function runNLTestSuite(suite, options = {}) {
|
|
3082
|
+
const { stepTimeout = 30000, continueOnFailure = true, screenshotOnFailure = true, headless = true, } = options;
|
|
3083
|
+
const startTime = Date.now();
|
|
3084
|
+
const testResults = [];
|
|
3085
|
+
console.log(`\n🧪 Running Test Suite: ${suite.name}`);
|
|
3086
|
+
console.log(` Tests: ${suite.tests.length}`);
|
|
3087
|
+
console.log(` Continue on failure: ${continueOnFailure}`);
|
|
3088
|
+
console.log("");
|
|
3089
|
+
const browser = new CBrowser({
|
|
3090
|
+
headless,
|
|
3091
|
+
});
|
|
3092
|
+
try {
|
|
3093
|
+
await browser.launch();
|
|
3094
|
+
for (const test of suite.tests) {
|
|
3095
|
+
console.log(`\n📋 Test: ${test.name}`);
|
|
3096
|
+
const testStartTime = Date.now();
|
|
3097
|
+
const stepResults = [];
|
|
3098
|
+
let testPassed = true;
|
|
3099
|
+
let testError;
|
|
3100
|
+
for (const step of test.steps) {
|
|
3101
|
+
console.log(` → ${step.instruction}`);
|
|
3102
|
+
const stepStartTime = Date.now();
|
|
3103
|
+
let stepPassed = true;
|
|
3104
|
+
let stepError;
|
|
3105
|
+
let screenshot;
|
|
3106
|
+
let actualValue;
|
|
3107
|
+
try {
|
|
3108
|
+
// Execute the step based on action type
|
|
3109
|
+
switch (step.action) {
|
|
3110
|
+
case "navigate": {
|
|
3111
|
+
await browser.navigate(step.target || "");
|
|
3112
|
+
break;
|
|
3113
|
+
}
|
|
3114
|
+
case "click": {
|
|
3115
|
+
const result = await browser.smartClick(step.target || "");
|
|
3116
|
+
if (!result.success) {
|
|
3117
|
+
throw new Error(`Failed to click: ${step.target}`);
|
|
3118
|
+
}
|
|
3119
|
+
break;
|
|
3120
|
+
}
|
|
3121
|
+
case "fill": {
|
|
3122
|
+
await browser.fill(step.target || "", step.value || "");
|
|
3123
|
+
break;
|
|
3124
|
+
}
|
|
3125
|
+
case "select": {
|
|
3126
|
+
await browser.fill(step.target || "", step.value || "");
|
|
3127
|
+
break;
|
|
3128
|
+
}
|
|
3129
|
+
case "scroll": {
|
|
3130
|
+
const direction = step.target?.toLowerCase() === "up" ? -500 : 500;
|
|
3131
|
+
// Use private page access through cast
|
|
3132
|
+
const page = browser.page;
|
|
3133
|
+
if (page) {
|
|
3134
|
+
await page.evaluate((d) => window.scrollBy(0, d), direction);
|
|
3135
|
+
}
|
|
3136
|
+
break;
|
|
3137
|
+
}
|
|
3138
|
+
case "wait": {
|
|
3139
|
+
if (step.target) {
|
|
3140
|
+
// Wait for text to appear - use private page access
|
|
3141
|
+
const page = browser.page;
|
|
3142
|
+
if (page) {
|
|
3143
|
+
await page.waitForSelector(`text=${step.target}`, { timeout: stepTimeout });
|
|
3144
|
+
}
|
|
3145
|
+
}
|
|
3146
|
+
else {
|
|
3147
|
+
// Wait for duration
|
|
3148
|
+
const ms = parseFloat(step.value || "1") * 1000;
|
|
3149
|
+
await new Promise(r => setTimeout(r, ms));
|
|
3150
|
+
}
|
|
3151
|
+
break;
|
|
3152
|
+
}
|
|
3153
|
+
case "assert": {
|
|
3154
|
+
const assertResult = await browser.assert(step.instruction);
|
|
3155
|
+
stepPassed = assertResult.passed;
|
|
3156
|
+
actualValue = String(assertResult.actual);
|
|
3157
|
+
if (!assertResult.passed) {
|
|
3158
|
+
stepError = assertResult.message;
|
|
3159
|
+
}
|
|
3160
|
+
break;
|
|
3161
|
+
}
|
|
3162
|
+
case "screenshot": {
|
|
3163
|
+
screenshot = await browser.screenshot();
|
|
3164
|
+
break;
|
|
3165
|
+
}
|
|
3166
|
+
case "unknown": {
|
|
3167
|
+
// Try to interpret as a click or fill
|
|
3168
|
+
console.log(` ⚠️ Unknown instruction, attempting smart interpretation...`);
|
|
3169
|
+
const result = await browser.smartClick(step.target || step.instruction);
|
|
3170
|
+
if (!result.success) {
|
|
3171
|
+
throw new Error(`Could not interpret: ${step.instruction}`);
|
|
3172
|
+
}
|
|
3173
|
+
break;
|
|
3174
|
+
}
|
|
3175
|
+
}
|
|
3176
|
+
console.log(` ✓ Passed (${Date.now() - stepStartTime}ms)`);
|
|
3177
|
+
}
|
|
3178
|
+
catch (e) {
|
|
3179
|
+
stepPassed = false;
|
|
3180
|
+
stepError = e.message;
|
|
3181
|
+
testPassed = false;
|
|
3182
|
+
testError = testError || e.message;
|
|
3183
|
+
console.log(` ✗ Failed: ${e.message}`);
|
|
3184
|
+
if (screenshotOnFailure) {
|
|
3185
|
+
try {
|
|
3186
|
+
screenshot = await browser.screenshot();
|
|
3187
|
+
}
|
|
3188
|
+
catch { }
|
|
3189
|
+
}
|
|
3190
|
+
}
|
|
3191
|
+
stepResults.push({
|
|
3192
|
+
instruction: step.instruction,
|
|
3193
|
+
action: step.action,
|
|
3194
|
+
passed: stepPassed,
|
|
3195
|
+
duration: Date.now() - stepStartTime,
|
|
3196
|
+
error: stepError,
|
|
3197
|
+
screenshot,
|
|
3198
|
+
actualValue,
|
|
3199
|
+
});
|
|
3200
|
+
// Stop test if step failed and not continuing on failure
|
|
3201
|
+
if (!stepPassed && !continueOnFailure) {
|
|
3202
|
+
break;
|
|
3203
|
+
}
|
|
3204
|
+
}
|
|
3205
|
+
testResults.push({
|
|
3206
|
+
name: test.name,
|
|
3207
|
+
passed: testPassed,
|
|
3208
|
+
duration: Date.now() - testStartTime,
|
|
3209
|
+
stepResults,
|
|
3210
|
+
error: testError,
|
|
3211
|
+
});
|
|
3212
|
+
console.log(` ${testPassed ? "✅" : "❌"} ${test.name}: ${testPassed ? "PASSED" : "FAILED"}`);
|
|
3213
|
+
}
|
|
3214
|
+
}
|
|
3215
|
+
finally {
|
|
3216
|
+
await browser.close();
|
|
3217
|
+
}
|
|
3218
|
+
const passed = testResults.filter(t => t.passed).length;
|
|
3219
|
+
const failed = testResults.filter(t => !t.passed).length;
|
|
3220
|
+
const result = {
|
|
3221
|
+
name: suite.name,
|
|
3222
|
+
timestamp: new Date().toISOString(),
|
|
3223
|
+
duration: Date.now() - startTime,
|
|
3224
|
+
testResults,
|
|
3225
|
+
summary: {
|
|
3226
|
+
total: suite.tests.length,
|
|
3227
|
+
passed,
|
|
3228
|
+
failed,
|
|
3229
|
+
skipped: 0,
|
|
3230
|
+
passRate: suite.tests.length > 0 ? (passed / suite.tests.length) * 100 : 0,
|
|
3231
|
+
},
|
|
3232
|
+
};
|
|
3233
|
+
return result;
|
|
3234
|
+
}
|
|
3235
|
+
/**
|
|
3236
|
+
* Format a test suite result as a report.
|
|
3237
|
+
*/
|
|
3238
|
+
function formatNLTestReport(result) {
|
|
3239
|
+
const lines = [];
|
|
3240
|
+
lines.push("");
|
|
3241
|
+
lines.push("╔══════════════════════════════════════════════════════════════════════════════╗");
|
|
3242
|
+
lines.push("║ NATURAL LANGUAGE TEST REPORT ║");
|
|
3243
|
+
lines.push("╚══════════════════════════════════════════════════════════════════════════════╝");
|
|
3244
|
+
lines.push("");
|
|
3245
|
+
lines.push(`📋 Suite: ${result.name}`);
|
|
3246
|
+
lines.push(`⏱️ Duration: ${(result.duration / 1000).toFixed(1)}s`);
|
|
3247
|
+
lines.push(`📅 Timestamp: ${result.timestamp}`);
|
|
3248
|
+
lines.push("");
|
|
3249
|
+
// Summary stats
|
|
3250
|
+
const passEmoji = result.summary.passRate === 100 ? "🎉" : result.summary.passRate >= 80 ? "✅" : "⚠️";
|
|
3251
|
+
lines.push(`${passEmoji} Pass Rate: ${result.summary.passed}/${result.summary.total} (${result.summary.passRate.toFixed(0)}%)`);
|
|
3252
|
+
lines.push("");
|
|
3253
|
+
// Results table
|
|
3254
|
+
lines.push("┌───────────────────────────────────────┬──────────┬──────────┬────────────────────┐");
|
|
3255
|
+
lines.push("│ Test │ Status │ Duration │ Error │");
|
|
3256
|
+
lines.push("├───────────────────────────────────────┼──────────┼──────────┼────────────────────┤");
|
|
3257
|
+
for (const test of result.testResults) {
|
|
3258
|
+
const name = test.name.padEnd(37).slice(0, 37);
|
|
3259
|
+
const status = test.passed ? "✓ PASS".padEnd(8) : "✗ FAIL".padEnd(8);
|
|
3260
|
+
const duration = `${(test.duration / 1000).toFixed(1)}s`.padEnd(8);
|
|
3261
|
+
const error = (test.error || "-").slice(0, 18).padEnd(18);
|
|
3262
|
+
lines.push(`│ ${name} │ ${status} │ ${duration} │ ${error} │`);
|
|
3263
|
+
}
|
|
3264
|
+
lines.push("└───────────────────────────────────────┴──────────┴──────────┴────────────────────┘");
|
|
3265
|
+
lines.push("");
|
|
3266
|
+
// Failed test details
|
|
3267
|
+
const failedTests = result.testResults.filter(t => !t.passed);
|
|
3268
|
+
if (failedTests.length > 0) {
|
|
3269
|
+
lines.push("❌ FAILED TESTS");
|
|
3270
|
+
lines.push("─".repeat(60));
|
|
3271
|
+
for (const test of failedTests) {
|
|
3272
|
+
lines.push(`\n 📋 ${test.name}`);
|
|
3273
|
+
const failedSteps = test.stepResults.filter(s => !s.passed);
|
|
3274
|
+
for (const step of failedSteps) {
|
|
3275
|
+
lines.push(` ✗ ${step.instruction}`);
|
|
3276
|
+
if (step.error) {
|
|
3277
|
+
lines.push(` Error: ${step.error}`);
|
|
3278
|
+
}
|
|
3279
|
+
if (step.screenshot) {
|
|
3280
|
+
lines.push(` Screenshot: ${step.screenshot}`);
|
|
3281
|
+
}
|
|
3282
|
+
}
|
|
3283
|
+
}
|
|
3284
|
+
lines.push("");
|
|
3285
|
+
}
|
|
3286
|
+
return lines.join("\n");
|
|
3287
|
+
}
|
|
3288
|
+
/**
|
|
3289
|
+
* Run a natural language test suite from a file.
|
|
3290
|
+
*/
|
|
3291
|
+
async function runNLTestFile(filepath, options = {}) {
|
|
3292
|
+
if (!(0, fs_1.existsSync)(filepath)) {
|
|
3293
|
+
throw new Error(`Test file not found: ${filepath}`);
|
|
3294
|
+
}
|
|
3295
|
+
const content = (0, fs_1.readFileSync)(filepath, "utf-8");
|
|
3296
|
+
const suiteName = filepath.split("/").pop()?.replace(/\.[^.]+$/, "") || "Test Suite";
|
|
3297
|
+
const suite = parseNLTestSuite(content, suiteName);
|
|
3298
|
+
return runNLTestSuite(suite, options);
|
|
3299
|
+
}
|
|
2880
3300
|
//# sourceMappingURL=browser.js.map
|