@unotest/web 0.6.2 → 0.9.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/.claude/skills/write-e2e-test/SKILL.md +16 -16
- package/CHANGELOG.md +28 -0
- package/README.md +12 -12
- package/dist/config/schema.js +1 -1
- package/dist/driver/index.d.ts +7 -2
- package/dist/driver/index.js +1 -1
- package/dist/dsl/index.d.ts +15 -3
- package/dist/dsl/index.js +1 -1
- package/dist/dsl/web-dsl-language-service.d.ts +18 -0
- package/dist/dsl/web-dsl-language-service.js +1 -0
- package/dist/inspection/page-inject.d.ts +45 -1
- package/dist/inspection/page-inject.js +253 -4
- package/dist/{interfaces-iTfjd1zT.d.ts → interfaces-dbZG10RS.d.ts} +40 -1
- package/dist/{linter-DzAzJpab.d.ts → linter-CM2CpIyW.d.ts} +1 -1
- package/dist/mcp/server.js +1 -1
- package/dist/runner/cli.d.ts +8 -2
- package/dist/runner/cli.js +1 -1
- package/dist/runner/init/chrome-probe.d.ts +15 -0
- package/dist/runner/init/chrome-probe.js +1 -0
- package/dist/runner/init.js +1 -1
- package/dist/runner/install-chromium.js +1 -1
- package/dist/runner/prepare-fix.js +1 -1
- package/dist/runner/scaffold-workspace.d.ts +24 -0
- package/dist/runner/scaffold-workspace.js +1 -0
- package/dist/runner/serve-fixture.js +1 -1
- package/dist/runner/web-runner-adapter.d.ts +1 -1
- package/dist/runner/web-runner-adapter.js +1 -1
- package/guides/dsl-reference.md +7 -7
- package/package.json +20 -4
- package/src/mcp/prompts/agent-test-author.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
var
|
|
1
|
+
var _0x1c2add=_0x4399;(function(_0x2b1f5e,_0x6720ff){var _0x2e9c6a={_0xe9ec19:0x7e,_0x1bfcc2:0x7b,_0x38c38a:0x8e,_0x17240a:0x8d},_0x362e52=_0x4399,_0x4fe5db=_0x2b1f5e();while(!![]){try{var _0x3b9b42=-parseInt(_0x362e52(0x83))/0x1+parseInt(_0x362e52(_0x2e9c6a._0xe9ec19))/0x2*(parseInt(_0x362e52(0x86))/0x3)+-parseInt(_0x362e52(0x81))/0x4*(-parseInt(_0x362e52(_0x2e9c6a._0x1bfcc2))/0x5)+-parseInt(_0x362e52(_0x2e9c6a._0x38c38a))/0x6+parseInt(_0x362e52(_0x2e9c6a._0x17240a))/0x7+parseInt(_0x362e52(0x7d))/0x8+-parseInt(_0x362e52(0x82))/0x9;if(_0x3b9b42===_0x6720ff)break;else _0x4fe5db['push'](_0x4fe5db['shift']());}catch(_0x7914b8){_0x4fe5db['push'](_0x4fe5db['shift']());}}}(_0xf79d,0xd57cf));import{fileURLToPath}from'url';import{dirname,resolve}from'path';function _0x4399(_0x2669d6,_0x498fe4){_0x2669d6=_0x2669d6-0x7a;var _0xf79d8c=_0xf79d();var _0x43998b=_0xf79d8c[_0x2669d6];if(_0x4399['bmfPEK']===undefined){var _0x269471=function(_0x1cf3e0){var _0x3aa3f2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x4c1fac='',_0x3bba06='';for(var _0xaec62c=0x0,_0x52108f,_0x14e121,_0x5b8ae7=0x0;_0x14e121=_0x1cf3e0['charAt'](_0x5b8ae7++);~_0x14e121&&(_0x52108f=_0xaec62c%0x4?_0x52108f*0x40+_0x14e121:_0x14e121,_0xaec62c++%0x4)?_0x4c1fac+=String['fromCharCode'](0xff&_0x52108f>>(-0x2*_0xaec62c&0x6)):0x0){_0x14e121=_0x3aa3f2['indexOf'](_0x14e121);}for(var _0x5d2372=0x0,_0x2b04ac=_0x4c1fac['length'];_0x5d2372<_0x2b04ac;_0x5d2372++){_0x3bba06+='%'+('00'+_0x4c1fac['charCodeAt'](_0x5d2372)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x3bba06);};_0x4399['jNdWqf']=_0x269471,_0x4399['GWiGvm']={},_0x4399['bmfPEK']=!![];}var _0x4c7a25=_0xf79d8c[0x0],_0x5ba725=_0x2669d6+_0x4c7a25,_0x50388f=_0x4399['GWiGvm'][_0x5ba725];return!_0x50388f?(_0x43998b=_0x4399['jNdWqf'](_0x43998b),_0x4399['GWiGvm'][_0x5ba725]=_0x43998b):_0x43998b=_0x50388f,_0x43998b;}import{spawn}from'child_process';import{existsSync}from'fs';var here=dirname(fileURLToPath(import.meta.url)),candidates=[resolve(here,_0x1c2add(0x8c)),resolve(here,_0x1c2add(0x8a))],serverEntry=candidates[_0x1c2add(0x7c)](_0x4c1fac=>existsSync(_0x4c1fac));function _0xf79d(){var _0x28c031=['mJGYmJflEerzCg0','yxjNDG','Aw5OzxjPDa','C2XPy2u','lI4VlI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','C3rKzxjY','lI4VlI4VzxHHBxbSzxmVzML4DhvYzxmVyNjLywSTzML4lwfWCc9Zzxj2zs5TANm','mteYmJy0mtf5Bez4AeS','mtaYnZG0mMvZu1beDa','C2vYDMuTzML4DhvYztOGy2fUBM90igXVy2f0zsbMAxH0DxjLihnLCNzLCIbLBNrYEs4GvhjPzwq6cG','D3jPDgu','nxL3AgnvrG','zMLUza','nZi5mde5mMLACM5qCW','mZqYrgTPvK9T','zxHLy1bHDgG','rgLKihLVDsbWDwjSAxnOihDPDgHVDxqGzxHHBxbSzxmVzML4DhvYzxmVpWO','nJy2odu0mfPdCxj4va','mZm4ntq4ntLhtNLMr0i','otGZmZC0D1Pzs2Xr','AM9PBG','zxHPDa'];_0xf79d=function(){return _0x28c031;};return _0xf79d();}!serverEntry&&(process[_0x1c2add(0x8b)][_0x1c2add(0x7a)](_0x1c2add(0x8f)+candidates['map'](_0x3bba06=>'\x20\x20'+_0x3bba06+'\x0a')[_0x1c2add(0x84)]('')+_0x1c2add(0x80)),process[_0x1c2add(0x85)](0x1));var child=spawn(process[_0x1c2add(0x7f)],[serverEntry,...process[_0x1c2add(0x87)][_0x1c2add(0x89)](0x2)],{'stdio':_0x1c2add(0x88)});child['on'](_0x1c2add(0x85),_0xaec62c=>process[_0x1c2add(0x85)](_0xaec62c??0x1));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x1a3a6a=_0x4c4d;(function(_0x77bd65,_0x31cd77){const _0x287cf9={_0x33f0fb:0x89,_0x23ca05:0x86,_0x68a832:0x6f,_0x2f3a15:0x79,_0x3bde9f:0x8d,_0x2edb3d:0x8a},_0x36eab6=_0x4c4d,_0xbf8604=_0x77bd65();while(!![]){try{const _0x1cac7c=-parseInt(_0x36eab6(_0x287cf9._0x33f0fb))/0x1*(-parseInt(_0x36eab6(_0x287cf9._0x23ca05))/0x2)+-parseInt(_0x36eab6(_0x287cf9._0x68a832))/0x3*(parseInt(_0x36eab6(0x74))/0x4)+-parseInt(_0x36eab6(0x81))/0x5+-parseInt(_0x36eab6(_0x287cf9._0x2f3a15))/0x6+-parseInt(_0x36eab6(0x85))/0x7+-parseInt(_0x36eab6(_0x287cf9._0x3bde9f))/0x8*(-parseInt(_0x36eab6(0x80))/0x9)+-parseInt(_0x36eab6(_0x287cf9._0x2edb3d))/0xa*(-parseInt(_0x36eab6(0x92))/0xb);if(_0x1cac7c===_0x31cd77)break;else _0xbf8604['push'](_0xbf8604['shift']());}catch(_0x40c6b7){_0xbf8604['push'](_0xbf8604['shift']());}}}(_0x4aac,0x629fc));var __defProp=Object[_0x1a3a6a(0x8e)],__name=(_0x3c1568,_0x5207d2)=>__defProp(_0x3c1568,_0x1a3a6a(0x7c),{'value':_0x5207d2,'configurable':!![]});function _0x4c4d(_0x1168cf,_0x8b509d){_0x1168cf=_0x1168cf-0x6e;const _0x4aac71=_0x4aac();let _0x4c4d25=_0x4aac71[_0x1168cf];if(_0x4c4d['ZARcpF']===undefined){var _0xad25c5=function(_0x14b61d){const _0x6ea2e4='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3c1568='',_0x5207d2='';for(let _0x2a00bc=0x0,_0x597e87,_0xbcb705,_0x26a24f=0x0;_0xbcb705=_0x14b61d['charAt'](_0x26a24f++);~_0xbcb705&&(_0x597e87=_0x2a00bc%0x4?_0x597e87*0x40+_0xbcb705:_0xbcb705,_0x2a00bc++%0x4)?_0x3c1568+=String['fromCharCode'](0xff&_0x597e87>>(-0x2*_0x2a00bc&0x6)):0x0){_0xbcb705=_0x6ea2e4['indexOf'](_0xbcb705);}for(let _0x5563fe=0x0,_0x1cbc02=_0x3c1568['length'];_0x5563fe<_0x1cbc02;_0x5563fe++){_0x5207d2+='%'+('00'+_0x3c1568['charCodeAt'](_0x5563fe)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x5207d2);};_0x4c4d['xYGUug']=_0xad25c5,_0x4c4d['Mmlfos']={},_0x4c4d['ZARcpF']=!![];}const _0x18904b=_0x4aac71[0x0],_0x3cc953=_0x1168cf+_0x18904b,_0x1a4e1a=_0x4c4d['Mmlfos'][_0x3cc953];return!_0x1a4e1a?(_0x4c4d25=_0x4c4d['xYGUug'](_0x4c4d25),_0x4c4d['Mmlfos'][_0x3cc953]=_0x4c4d25):_0x4c4d25=_0x1a4e1a,_0x4c4d25;}import{UnsupportedRunKindError}from'@unotest/protocol';import{readFileSync}from'fs';import{createRequire}from'module';import{dirname,join}from'path';function _0x4aac(){const _0x3093e2=['ls1IywLS','mZC2mfLeBxHbwq','zgvMAw5LuhjVCgvYDhK','AgvHzgvK','yxv0Ag9YAw5N','ChvZAa','mtfkwKfjv2K','C3vWCg9YDgvKs2LUzhm','AM9PBG','C3rYAw5N','C2nLBMfYAw8','DMfSDwvZ','yNvPBgrbCMDZ','y29SBgvJDgLVBG','A2LUza','mtK0ndzWswLzA1O','yMLU','CgfYC2u','BgvUz3rO','B2jQzwn0','mJG0uerdvvP3','vu5pvevtvf9iruferuq','qhvUB3rLC3qVD2vI','CgLJA0jPBG','Dw5VDgvZDc13zwi','mty2ndu4nLPUBe9pva','CMvZB2X2zujPBG','D29YA2vYCW','BMfTzq','ihbHy2THz2uUANnVBIbKzwnSyxjLCYbUBYaNyMLUjYbMAwvSzcdIGjqGyNjVA2vUigLUC3rHBgW/','yNvPBgrfBNy','yNjLywTWB2LUDhm','nJKWm0zkwMj4rG','mZG0mti2nuPwEgnHsa','l3bHy2THz2uUANnVBG','DxrMoa','yxv0Ag9Y','mty5nZCYneLPAw5UsG','ntqXotrqAgD0AgG','yMfPBa','v2vIuNvUBMvYqwrHChrLCG','mxr5EuLVBG','mtC2ndGXntbtAuH3ANK','ls13B3jRzxjZpq'];_0x4aac=function(){return _0x3093e2;};return _0x4aac();}var PACKAGE_NAME=_0x1a3a6a(0x76),WebRunnerAdapter=class{static{__name(this,_0x1a3a6a(0x88));}[_0x1a3a6a(0x7c)]=PACKAGE_NAME;[_0x1a3a6a(0x93)]=[_0x1a3a6a(0x96),'collection',_0x1a3a6a(0x90)];[_0x1a3a6a(0x7a)](){const _0x15bfa5={_0x38f5f9:0x71,_0x32ee16:0x7d},_0x1b0539=_0x1a3a6a,_0x2a00bc=createRequire(import.meta.url),_0x597e87=_0x2a00bc['resolve'](PACKAGE_NAME+_0x1b0539(0x82)),_0xbcb705=JSON[_0x1b0539(_0x15bfa5._0x38f5f9)](readFileSync(_0x597e87,_0x1b0539(0x83))),_0x26a24f=pickBin(_0xbcb705);if(!_0x26a24f)throw new Error(PACKAGE_NAME+_0x1b0539(_0x15bfa5._0x32ee16));return join(dirname(_0x597e87),_0x26a24f);}[_0x1a3a6a(0x98)](_0x5563fe){const _0x17bc8a={_0x5030e3:0x91,_0x41f4c4:0x72,_0x5daa8a:0x91,_0x37409a:0x99,_0x204332:0x91,_0x355087:0x7c},_0x2d304a=_0x1a3a6a;if(_0x5563fe[_0x2d304a(0x6e)]==='scenario'){const _0x1f9a73=['e2e',_0x5563fe[_0x2d304a(0x96)]];if(_0x5563fe['debug'])_0x1f9a73[_0x2d304a(_0x17bc8a._0x5030e3)]('--debug');return _0x5563fe[_0x2d304a(0x7f)]&&_0x5563fe['breakpoints'][_0x2d304a(_0x17bc8a._0x41f4c4)]>0x0&&_0x1f9a73[_0x2d304a(_0x17bc8a._0x5daa8a)]('--break',_0x5563fe[_0x2d304a(0x7f)][_0x2d304a(0x94)](',')),_0x1f9a73;}if(_0x5563fe['kind']==='collection'){const _0x364b23=[_0x2d304a(0x99),_0x5563fe[_0x2d304a(_0x17bc8a._0x37409a)]];_0x5563fe[_0x2d304a(0x7b)]!==void 0x0&&_0x5563fe[_0x2d304a(0x7b)]>0x1&&_0x364b23[_0x2d304a(_0x17bc8a._0x204332)](_0x2d304a(0x8b)+_0x5563fe[_0x2d304a(0x7b)]);if(_0x5563fe[_0x2d304a(0x87)])_0x364b23[_0x2d304a(_0x17bc8a._0x5daa8a)](_0x2d304a(0x8c));return _0x364b23;}if(_0x5563fe[_0x2d304a(0x6e)]===_0x2d304a(0x90))return[_0x2d304a(0x84),_0x5563fe['scenario']];const _0x1cbc02=_0x5563fe;throw new UnsupportedRunKindError(_0x1cbc02[_0x2d304a(0x6e)],this[_0x2d304a(_0x17bc8a._0x355087)]);}[_0x1a3a6a(0x7e)](_0x57c9d4){const _0x2d010e=_0x1a3a6a,_0x5e801a={};if(_0x57c9d4[_0x2d010e(0x8f)])_0x5e801a[_0x2d010e(0x75)]='1';return _0x5e801a;}},webRunnerAdapter=new WebRunnerAdapter(),web_runner_adapter_default=webRunnerAdapter;function pickBin(_0xe7ebed){const _0x115429={_0xbb11e7:0x70,_0x408b2c:0x70,_0x75fabd:0x78,_0x57f732:0x97,_0x3bfbe8:0x70},_0x9034d3=_0x1a3a6a;if(typeof _0xe7ebed[_0x9034d3(0x70)]===_0x9034d3(0x95))return _0xe7ebed[_0x9034d3(0x70)];if(_0xe7ebed[_0x9034d3(0x70)]&&typeof _0xe7ebed[_0x9034d3(_0x115429._0xbb11e7)]===_0x9034d3(0x73))return _0xe7ebed[_0x9034d3(_0x115429._0x408b2c)][_0x9034d3(_0x115429._0x75fabd)]??Object[_0x9034d3(_0x115429._0x57f732)](_0xe7ebed[_0x9034d3(_0x115429._0x3bfbe8)])[0x0]??null;return null;}__name(pickBin,_0x1a3a6a(0x77));export{web_runner_adapter_default as default,webRunnerAdapter};
|
package/guides/dsl-reference.md
CHANGED
|
@@ -21,16 +21,16 @@ A scenario file looks like:
|
|
|
21
21
|
|
|
22
22
|
```js
|
|
23
23
|
function test_my_scenario() {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
step("Sign in and land on the dashboard", () => {
|
|
25
|
+
goto('https://example.com');
|
|
26
|
+
fill(getByLabel('Email'), 'a@b.c');
|
|
27
|
+
click(getByRole('button', {name: 'Sign in'}));
|
|
28
|
+
assertUrl('/dashboard');
|
|
29
|
+
});
|
|
30
30
|
}
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
> **Every step must sit inside a
|
|
33
|
+
> **Every step must sit inside a `step("...", () => { … })` block** in a `test_*`
|
|
34
34
|
> entry (the AST validator enforces it; `flow_*` composites and helpers are
|
|
35
35
|
> exempt). The title is the plain-English intent of the group — what the
|
|
36
36
|
> agent reads back to repair a step when a selector drifts. Group by intent,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@unotest/web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "AI-native E2E testing for web applications. MCP server (run_test / step / resume / inspect_runtime / agent_fix) + CLI runner + JavaScript DSL scenarios on a sandboxed AST engine + semantic DOM snapshots.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -34,6 +34,22 @@
|
|
|
34
34
|
"types": "./dist/runner/web-runner-adapter.d.ts",
|
|
35
35
|
"import": "./dist/runner/web-runner-adapter.js"
|
|
36
36
|
},
|
|
37
|
+
"./dsl": {
|
|
38
|
+
"types": "./dist/dsl/web-dsl-language-service.d.ts",
|
|
39
|
+
"import": "./dist/dsl/web-dsl-language-service.js"
|
|
40
|
+
},
|
|
41
|
+
"./scaffold": {
|
|
42
|
+
"types": "./dist/runner/scaffold-workspace.d.ts",
|
|
43
|
+
"import": "./dist/runner/scaffold-workspace.js"
|
|
44
|
+
},
|
|
45
|
+
"./init": {
|
|
46
|
+
"types": "./dist/runner/init.d.ts",
|
|
47
|
+
"import": "./dist/runner/init.js"
|
|
48
|
+
},
|
|
49
|
+
"./browser-probe": {
|
|
50
|
+
"types": "./dist/runner/init/chrome-probe.d.ts",
|
|
51
|
+
"import": "./dist/runner/init/chrome-probe.js"
|
|
52
|
+
},
|
|
37
53
|
"./internal/page-inject": {
|
|
38
54
|
"types": "./dist/inspection/page-inject.d.ts",
|
|
39
55
|
"import": "./dist/inspection/page-inject.js"
|
|
@@ -62,9 +78,9 @@
|
|
|
62
78
|
"tsx": "^4.19.2",
|
|
63
79
|
"yaml": "^2.6.0",
|
|
64
80
|
"zod": "^3.23.8",
|
|
65
|
-
"@unotest/dsl": "^0.
|
|
66
|
-
"@unotest/
|
|
67
|
-
"@unotest/
|
|
81
|
+
"@unotest/dsl": "^0.9.0",
|
|
82
|
+
"@unotest/viewer": "^0.9.0",
|
|
83
|
+
"@unotest/protocol": "^0.9.0"
|
|
68
84
|
},
|
|
69
85
|
"devDependencies": {
|
|
70
86
|
"@types/node": "^22.10.0",
|
|
@@ -72,7 +72,7 @@ Disambiguate multi-matches with `.filter({hasText: '…'})` or
|
|
|
72
72
|
## Recording: name the `section` like a test-plan line
|
|
73
73
|
|
|
74
74
|
Each `explore_step`/`explore_record` carries a `section` that becomes a
|
|
75
|
-
|
|
75
|
+
`step("…", () => { … })` block in the generated test. Name it after the
|
|
76
76
|
USER-FACING GOAL of the block — `"Login"`, `"Open first car card"`,
|
|
77
77
|
`"Apply status filter"` — never a generic mechanic like `"Navigation"`,
|
|
78
78
|
`"Actions"`, `"Click"`, or `"Load data"`. Use the **same** label for every
|