@e2edev/web 0.11.0-canary-20260921180210
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/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +112 -0
- package/dist/.build.json +1 -0
- package/dist/actions.d.ts +23 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +174 -0
- package/dist/actions.js.map +1 -0
- package/dist/attempt-session.d.ts +76 -0
- package/dist/attempt-session.d.ts.map +1 -0
- package/dist/attempt-session.js +290 -0
- package/dist/attempt-session.js.map +1 -0
- package/dist/browser-connection.d.ts +34 -0
- package/dist/browser-connection.d.ts.map +1 -0
- package/dist/browser-connection.js +87 -0
- package/dist/browser-connection.js.map +1 -0
- package/dist/capture-scope.d.ts +21 -0
- package/dist/capture-scope.d.ts.map +1 -0
- package/dist/capture-scope.js +61 -0
- package/dist/capture-scope.js.map +1 -0
- package/dist/cdp-recovery.d.ts +29 -0
- package/dist/cdp-recovery.d.ts.map +1 -0
- package/dist/cdp-recovery.js +84 -0
- package/dist/cdp-recovery.js.map +1 -0
- package/dist/cdp-selectors.d.ts +14 -0
- package/dist/cdp-selectors.d.ts.map +1 -0
- package/dist/cdp-selectors.js +48 -0
- package/dist/cdp-selectors.js.map +1 -0
- package/dist/dialogs.d.ts +37 -0
- package/dist/dialogs.d.ts.map +1 -0
- package/dist/dialogs.js +78 -0
- package/dist/dialogs.js.map +1 -0
- package/dist/engine.d.ts +26 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +166 -0
- package/dist/engine.js.map +1 -0
- package/dist/evaluation.d.ts +11 -0
- package/dist/evaluation.d.ts.map +1 -0
- package/dist/evaluation.js +27 -0
- package/dist/evaluation.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +40 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +117 -0
- package/dist/install.js.map +1 -0
- package/dist/locators.d.ts +74 -0
- package/dist/locators.d.ts.map +1 -0
- package/dist/locators.js +260 -0
- package/dist/locators.js.map +1 -0
- package/dist/observation-capture.d.ts +12 -0
- package/dist/observation-capture.d.ts.map +1 -0
- package/dist/observation-capture.js +93 -0
- package/dist/observation-capture.js.map +1 -0
- package/dist/observation.d.ts +63 -0
- package/dist/observation.d.ts.map +1 -0
- package/dist/observation.js +262 -0
- package/dist/observation.js.map +1 -0
- package/dist/observe.d.ts +51 -0
- package/dist/observe.d.ts.map +1 -0
- package/dist/observe.js +104 -0
- package/dist/observe.js.map +1 -0
- package/dist/operation-budget.d.ts +11 -0
- package/dist/operation-budget.d.ts.map +1 -0
- package/dist/operation-budget.js +40 -0
- package/dist/operation-budget.js.map +1 -0
- package/dist/protected-app.d.ts +32 -0
- package/dist/protected-app.d.ts.map +1 -0
- package/dist/protected-app.js +39 -0
- package/dist/protected-app.js.map +1 -0
- package/dist/read-node.d.ts +170 -0
- package/dist/read-node.d.ts.map +1 -0
- package/dist/read-node.js +823 -0
- package/dist/read-node.js.map +1 -0
- package/dist/refs.d.ts +43 -0
- package/dist/refs.d.ts.map +1 -0
- package/dist/refs.js +85 -0
- package/dist/refs.js.map +1 -0
- package/dist/route-pattern.d.ts +15 -0
- package/dist/route-pattern.d.ts.map +1 -0
- package/dist/route-pattern.js +68 -0
- package/dist/route-pattern.js.map +1 -0
- package/dist/support.d.ts +119 -0
- package/dist/support.d.ts.map +1 -0
- package/dist/support.js +299 -0
- package/dist/support.js.map +1 -0
- package/dist/surface.d.ts +257 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +587 -0
- package/dist/surface.js.map +1 -0
- package/dist/video.d.ts +59 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +115 -0
- package/dist/video.js.map +1 -0
- package/dist/web.d.ts +191 -0
- package/dist/web.d.ts.map +1 -0
- package/dist/web.js +354 -0
- package/dist/web.js.map +1 -0
- package/package.json +67 -0
package/dist/web.js
ADDED
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `web` fixture: the browser-shaped deterministic surface this engine
|
|
3
|
+
* contributes. It lives here, not in core, because the harness knows the
|
|
4
|
+
* engine contract and never a platform's fixture shape. Every async method
|
|
5
|
+
* runs as a harness-recorded `web.<method>` step; `expect(web)` reaches the
|
|
6
|
+
* matchers attached through `context.expectable`.
|
|
7
|
+
*
|
|
8
|
+
* Layering rule: validation (`resolveUrl`, JSON checks, cookie URLs, the
|
|
9
|
+
* download trigger) runs outside `surface.guard`, so a runner error keeps its
|
|
10
|
+
* classification and only Playwright faults are translated. The URL rule is
|
|
11
|
+
* never re-implemented here: `context.app.resolveUrl` is the one place that
|
|
12
|
+
* says which URLs a test may open.
|
|
13
|
+
*/
|
|
14
|
+
import { Deadline, describePattern, matchesText, pollCondition, TestError, toTextPattern, urlMatches, validateJsonValue, } from 'e2e/engine';
|
|
15
|
+
import { message as causeMessage, translatePwError } from './support.js';
|
|
16
|
+
import { compileEvaluation } from './evaluation.js';
|
|
17
|
+
import { routePatternMatches, routePatternsEqual, toRoutePattern } from './route-pattern.js';
|
|
18
|
+
/** Builds the `web` fixture for one attempt over the shared surface. */
|
|
19
|
+
export function createWebFixture(surface, context) {
|
|
20
|
+
const latch = surface.latch;
|
|
21
|
+
const routes = [];
|
|
22
|
+
/**
|
|
23
|
+
* Relative URLs and URL matching need the configured base. Resolving the
|
|
24
|
+
* empty reference yields the base itself, and lets the harness raise
|
|
25
|
+
* `APP_URL_REQUIRED` when there is none.
|
|
26
|
+
*/
|
|
27
|
+
const baseHref = () => context.app.resolveUrl('');
|
|
28
|
+
/**
|
|
29
|
+
* A navigation's budget: the call's own timeout, else the test timeout the
|
|
30
|
+
* harness gives `app.open` - a document load is not an action and must not
|
|
31
|
+
* be cut at the action timeout.
|
|
32
|
+
*/
|
|
33
|
+
const navigation = (options, run) => {
|
|
34
|
+
const operation = context.operation(options?.timeout ?? context.timeouts.test);
|
|
35
|
+
return surface.guard(operation, 'navigation', run);
|
|
36
|
+
};
|
|
37
|
+
/** An assertion-style budget: the given timeout or the assertion timeout, clamped to the test. */
|
|
38
|
+
const deadlineFor = (timeout) => new Deadline(context.operation(timeout ?? context.timeouts.assertion).timeoutMs);
|
|
39
|
+
const currentUrl = () => surface.guard(context.operation(), 'url', async () => surface.requirePage().url());
|
|
40
|
+
const currentTitle = () => surface.guard(context.operation(), 'title', () => surface.requirePage().title());
|
|
41
|
+
const expectation = createWebExpectation({ currentUrl, currentTitle, baseHref, deadlineFor, context });
|
|
42
|
+
const web = {
|
|
43
|
+
goto(url, options) {
|
|
44
|
+
const resolved = context.app.resolveUrl(url);
|
|
45
|
+
return navigation(options, async (operation) => {
|
|
46
|
+
const page = await surface.ensurePage();
|
|
47
|
+
await page.goto(resolved, {
|
|
48
|
+
waitUntil: options?.waitUntil ?? 'load',
|
|
49
|
+
timeout: operation.timeoutMs,
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
reload: (options) => navigation(options, async (operation) => {
|
|
54
|
+
await surface.requirePage().reload({ waitUntil: 'load', timeout: operation.timeoutMs });
|
|
55
|
+
}),
|
|
56
|
+
back: (options) => navigation(options, async (operation) => {
|
|
57
|
+
await surface.requirePage().goBack({ waitUntil: 'load', timeout: operation.timeoutMs });
|
|
58
|
+
}),
|
|
59
|
+
forward: (options) => navigation(options, async (operation) => {
|
|
60
|
+
await surface.requirePage().goForward({ waitUntil: 'load', timeout: operation.timeoutMs });
|
|
61
|
+
}),
|
|
62
|
+
url: currentUrl,
|
|
63
|
+
title: currentTitle,
|
|
64
|
+
// The same poll as `expect(web).toHaveURL`, exposed as a wait.
|
|
65
|
+
waitForURL: (url, options) => expectation.toHaveURL(url, options),
|
|
66
|
+
locator: (selector) => context.locator({ kind: 'selector', selector: requireSelector('web.locator', selector) }),
|
|
67
|
+
frameLocator: (selector) => frameScreen(context, [requireSelector('web.frameLocator', selector)]),
|
|
68
|
+
async evaluate(fn, arg) {
|
|
69
|
+
const source = typeof fn === 'string' ? fn : fn.toString();
|
|
70
|
+
validateJsonValue(arg, 'evaluate argument');
|
|
71
|
+
const evaluate = compileEvaluation(source, arg !== undefined);
|
|
72
|
+
// JSON safety is checked above; Playwright's recursive argument type cannot expand JsonValue.
|
|
73
|
+
const input = arg;
|
|
74
|
+
const result = await surface.guard(context.operation(), 'evaluate', () => surface.requirePage().evaluate(evaluate, input));
|
|
75
|
+
if (!result.ok)
|
|
76
|
+
throw new TestError('EVALUATE_FAILED', result.message);
|
|
77
|
+
validateJsonValue(result.value, 'evaluate result');
|
|
78
|
+
return result.value;
|
|
79
|
+
},
|
|
80
|
+
route(pattern, handler) {
|
|
81
|
+
const wirePattern = toRoutePattern(pattern);
|
|
82
|
+
const predicate = (url) => routePatternMatches(wirePattern, url.href);
|
|
83
|
+
// Playwright never surfaces a throwing route handler to the test, so a
|
|
84
|
+
// contract violation (no decision, two decisions) or a failing handler
|
|
85
|
+
// is latched on the surface and fails the next step with its real cause.
|
|
86
|
+
const pwHandler = async (route) => {
|
|
87
|
+
let decided = false;
|
|
88
|
+
const decide = (name) => {
|
|
89
|
+
if (decided) {
|
|
90
|
+
throw new TestError('ACTION_FAILED', `route handler already decided; ${name} called twice`);
|
|
91
|
+
}
|
|
92
|
+
decided = true;
|
|
93
|
+
};
|
|
94
|
+
const postData = route.request().postData();
|
|
95
|
+
const publicRoute = {
|
|
96
|
+
request: {
|
|
97
|
+
url: route.request().url(),
|
|
98
|
+
method: route.request().method(),
|
|
99
|
+
headers: route.request().headers(),
|
|
100
|
+
...(postData === null ? {} : { postData }),
|
|
101
|
+
},
|
|
102
|
+
fulfill: async (response) => {
|
|
103
|
+
decide('fulfill');
|
|
104
|
+
await route.fulfill({
|
|
105
|
+
status: response.status ?? 200,
|
|
106
|
+
headers: response.headers ?? {},
|
|
107
|
+
...('json' in response && response.json !== undefined
|
|
108
|
+
? { json: response.json }
|
|
109
|
+
: 'body' in response && response.body !== undefined
|
|
110
|
+
? { body: response.body }
|
|
111
|
+
: { body: '' }),
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
continue: async () => {
|
|
115
|
+
decide('continue');
|
|
116
|
+
await route.fallback();
|
|
117
|
+
},
|
|
118
|
+
abort: async () => {
|
|
119
|
+
decide('abort');
|
|
120
|
+
await route.abort();
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
try {
|
|
124
|
+
await handler(publicRoute);
|
|
125
|
+
if (!decided) {
|
|
126
|
+
throw new TestError('ACTION_FAILED', 'route handler returned without calling fulfill, continue, or abort');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (cause) {
|
|
130
|
+
latch.latch(cause instanceof Error
|
|
131
|
+
? cause
|
|
132
|
+
: new TestError('ACTION_FAILED', `route handler failed: ${causeMessage(cause)}`));
|
|
133
|
+
if (!decided)
|
|
134
|
+
await route.abort().catch(() => undefined);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
return surface.guard(context.operation(), 'route', async () => {
|
|
138
|
+
routes.push({ pattern: wirePattern, pwHandler, predicate });
|
|
139
|
+
await surface.route(predicate, pwHandler);
|
|
140
|
+
});
|
|
141
|
+
},
|
|
142
|
+
unroute(pattern) {
|
|
143
|
+
const wirePattern = toRoutePattern(pattern);
|
|
144
|
+
return surface.guard(context.operation(), 'unroute', async () => {
|
|
145
|
+
for (let i = routes.length - 1; i >= 0; i -= 1) {
|
|
146
|
+
const stored = routes[i];
|
|
147
|
+
if (routePatternsEqual(stored.pattern, wirePattern)) {
|
|
148
|
+
await surface.unroute(stored.predicate, stored.pwHandler);
|
|
149
|
+
routes.splice(i, 1);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
},
|
|
154
|
+
waitForResponse(pattern, options) {
|
|
155
|
+
const wirePattern = toRoutePattern(pattern);
|
|
156
|
+
const operation = context.operation(options?.timeout);
|
|
157
|
+
return surface.guard(operation, 'waitForResponse', async (currentOperation) => {
|
|
158
|
+
const response = await surface.requirePage().waitForResponse((candidate) => routePatternMatches(wirePattern, candidate.url()), { timeout: currentOperation.timeoutMs });
|
|
159
|
+
const body = await response.body().catch(() => Buffer.alloc(0));
|
|
160
|
+
const decoder = new TextDecoder();
|
|
161
|
+
return {
|
|
162
|
+
url: response.url(),
|
|
163
|
+
status: response.status(),
|
|
164
|
+
headers: response.headers(),
|
|
165
|
+
json: async () => JSON.parse(decoder.decode(body)),
|
|
166
|
+
text: async () => decoder.decode(body),
|
|
167
|
+
};
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
cookies: () => surface.guard(context.operation(), 'cookies', async () => {
|
|
171
|
+
const cookies = await surface.requireContext().cookies();
|
|
172
|
+
return cookies.map((cookie) => ({
|
|
173
|
+
name: cookie.name,
|
|
174
|
+
value: cookie.value,
|
|
175
|
+
domain: cookie.domain,
|
|
176
|
+
path: cookie.path,
|
|
177
|
+
...(cookie.expires >= 0 ? { expires: Math.floor(cookie.expires) } : {}),
|
|
178
|
+
httpOnly: cookie.httpOnly,
|
|
179
|
+
secure: cookie.secure,
|
|
180
|
+
...(cookie.sameSite !== undefined ? { sameSite: cookie.sameSite } : {}),
|
|
181
|
+
}));
|
|
182
|
+
}),
|
|
183
|
+
setCookies(cookies) {
|
|
184
|
+
const scheme = new URL(baseHref()).protocol === 'https:' ? 'https' : 'http';
|
|
185
|
+
// The harness's URL rule decides which cookie targets are admitted; a
|
|
186
|
+
// domain cookie is checked as the origin it would be sent to.
|
|
187
|
+
for (const cookie of cookies) {
|
|
188
|
+
context.app.resolveUrl(cookie.url === undefined ? `${scheme}://${cookie.domain.replace(/^\./, '')}` : cookie.url);
|
|
189
|
+
}
|
|
190
|
+
return surface.guard(context.operation(), 'setCookies', async () => {
|
|
191
|
+
await surface.requireContext().addCookies(cookies.map((cookie) => ({
|
|
192
|
+
name: cookie.name,
|
|
193
|
+
value: cookie.value,
|
|
194
|
+
...(cookie.url === undefined
|
|
195
|
+
? { domain: cookie.domain, path: cookie.path ?? '/' }
|
|
196
|
+
: { url: cookie.url }),
|
|
197
|
+
...(cookie.expires !== undefined ? { expires: cookie.expires } : {}),
|
|
198
|
+
...(cookie.httpOnly !== undefined ? { httpOnly: cookie.httpOnly } : {}),
|
|
199
|
+
...(cookie.secure !== undefined ? { secure: cookie.secure } : {}),
|
|
200
|
+
...(cookie.sameSite !== undefined ? { sameSite: cookie.sameSite } : {}),
|
|
201
|
+
})));
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
setViewport: (size) => surface.guard(context.operation(), 'setViewport', async () => {
|
|
205
|
+
await surface.requirePage().setViewportSize(size);
|
|
206
|
+
context.attachViewport({ width: size.width, height: size.height, scale: 1 });
|
|
207
|
+
}),
|
|
208
|
+
// Async so the harness records the registration as a `web.onDialog` step.
|
|
209
|
+
async onDialog(handler) {
|
|
210
|
+
const unsubscribe = surface.dialogs.add(handler);
|
|
211
|
+
return async () => unsubscribe();
|
|
212
|
+
},
|
|
213
|
+
async waitForDownload(trigger, options) {
|
|
214
|
+
const operation = context.operation(options?.timeout);
|
|
215
|
+
let triggerFailure;
|
|
216
|
+
return surface.guard(operation, 'download', async (currentOperation) => {
|
|
217
|
+
const waiter = surface.requirePage()
|
|
218
|
+
.waitForEvent('download', { timeout: currentOperation.timeoutMs });
|
|
219
|
+
// The trigger may fail before the waiter settles; absorb its later rejection.
|
|
220
|
+
waiter.catch(() => undefined);
|
|
221
|
+
try {
|
|
222
|
+
await trigger();
|
|
223
|
+
}
|
|
224
|
+
catch (cause) {
|
|
225
|
+
triggerFailure = { cause };
|
|
226
|
+
throw cause;
|
|
227
|
+
}
|
|
228
|
+
const download = await waiter;
|
|
229
|
+
const suggestedFilename = download.suggestedFilename();
|
|
230
|
+
const { relative, absolute } = surface.artifactPath('downloads', suggestedFilename, '');
|
|
231
|
+
await download.saveAs(absolute);
|
|
232
|
+
context.attachArtifact('download', relative);
|
|
233
|
+
return { path: relative, suggestedFilename };
|
|
234
|
+
}, (cause, label) => {
|
|
235
|
+
// The trigger is test code, so its errors keep their original classification.
|
|
236
|
+
if (triggerFailure !== undefined && Object.is(cause, triggerFailure.cause))
|
|
237
|
+
throw cause;
|
|
238
|
+
return translatePwError(cause, label);
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
keyboard: {
|
|
242
|
+
press: (key) => surface.guard(context.operation(), 'keyboard.press', () => surface.requirePage().keyboard.press(key)),
|
|
243
|
+
type: (text) => surface.guard(context.operation(), 'keyboard.type', () => surface.requirePage().keyboard.type(text)),
|
|
244
|
+
},
|
|
245
|
+
mouse: {
|
|
246
|
+
move: (x, y) => surface.guard(context.operation(), 'mouse.move', () => surface.requirePage().mouse.move(x, y)),
|
|
247
|
+
wheel: (deltaX, deltaY) => surface.guard(context.operation(), 'mouse.wheel', () => surface.requirePage().mouse.wheel(deltaX, deltaY)),
|
|
248
|
+
down: () => surface.guard(context.operation(), 'mouse.down', () => surface.requirePage().mouse.down()),
|
|
249
|
+
up: () => surface.guard(context.operation(), 'mouse.up', () => surface.requirePage().mouse.up()),
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
const action = { kind: 'resource' };
|
|
253
|
+
const navigationCall = { kind: 'resource', timeout: false };
|
|
254
|
+
const matchers = {
|
|
255
|
+
toHaveURL: { kind: 'assertion', timeout: false, label: (expected) => String(expected) },
|
|
256
|
+
toHaveTitle: { kind: 'assertion', timeout: false, label: (expected) => String(expected) },
|
|
257
|
+
toHaveClass: { kind: 'assertion', timeout: false, label: (_target, expected) => String(expected) },
|
|
258
|
+
get not() { return matchers; },
|
|
259
|
+
};
|
|
260
|
+
return context.fixture('web', context.expectable(web, () => context.fixture('expect', expectation, matchers)), {
|
|
261
|
+
goto: { ...navigationCall, label: (url) => url },
|
|
262
|
+
reload: navigationCall,
|
|
263
|
+
back: navigationCall,
|
|
264
|
+
forward: navigationCall,
|
|
265
|
+
url: action,
|
|
266
|
+
title: action,
|
|
267
|
+
waitForURL: { ...navigationCall, verifies: true, label: (url) => String(url) },
|
|
268
|
+
evaluate: action,
|
|
269
|
+
route: { ...action, label: (pattern) => String(pattern) },
|
|
270
|
+
unroute: { ...action, label: (pattern) => String(pattern) },
|
|
271
|
+
waitForResponse: { ...action, timeout: (_pattern, options) => options?.timeout, label: (pattern) => String(pattern) },
|
|
272
|
+
cookies: action,
|
|
273
|
+
setCookies: action,
|
|
274
|
+
setViewport: action,
|
|
275
|
+
onDialog: action,
|
|
276
|
+
waitForDownload: { ...action, timeout: (_trigger, options) => options?.timeout },
|
|
277
|
+
keyboard: { press: { ...action, label: (key) => key }, type: { ...action, label: (text) => `${text.length} chars` } },
|
|
278
|
+
mouse: { move: action, wheel: action, down: action, up: action },
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/** `expect(web)` matchers: URL, title, and class polling against the assertion budget. */
|
|
282
|
+
function createWebExpectation(deps, negated = false) {
|
|
283
|
+
const poll = async (api, label, condition, observed, timeout) => {
|
|
284
|
+
await pollCondition({
|
|
285
|
+
deadline: deps.deadlineFor(timeout),
|
|
286
|
+
signal: deps.context.signal,
|
|
287
|
+
negated,
|
|
288
|
+
evaluate: condition,
|
|
289
|
+
onTimeout: async () => new TestError('ASSERTION_FAILED', `expect.${negated ? 'not.' : ''}${api} failed\nexpected: ${negated ? 'not ' : ''}${label}\nobserved: ${await observed()}`),
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
return {
|
|
293
|
+
get not() {
|
|
294
|
+
return createWebExpectation(deps, !negated);
|
|
295
|
+
},
|
|
296
|
+
toHaveURL(expected, options) {
|
|
297
|
+
const label = typeof expected === 'string' ? expected : String(expected);
|
|
298
|
+
const target = deps.baseHref();
|
|
299
|
+
return poll('toHaveURL', `URL ${label}`, async () => urlMatches(await deps.currentUrl(), expected, target), async () => `URL ${await deps.currentUrl()}`, options?.timeout);
|
|
300
|
+
},
|
|
301
|
+
toHaveTitle(expected, options) {
|
|
302
|
+
const pattern = toTextPattern(expected, { exact: true });
|
|
303
|
+
return poll('toHaveTitle', `title ${describePattern(pattern)}`, async () => matchesText(await deps.currentTitle(), pattern), async () => `title ${JSON.stringify(await deps.currentTitle())}`, options?.timeout);
|
|
304
|
+
},
|
|
305
|
+
toHaveClass(target, expected, options) {
|
|
306
|
+
const pattern = toTextPattern(expected, { exact: true });
|
|
307
|
+
return poll('toHaveClass', `class ${describePattern(pattern)}`, async () => {
|
|
308
|
+
try {
|
|
309
|
+
const value = await target.getAttribute('class');
|
|
310
|
+
if (value === null)
|
|
311
|
+
return false;
|
|
312
|
+
const normalized = value.trim().split(/\s+/).join(' ');
|
|
313
|
+
return matchesText(normalized, pattern);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
if (error instanceof TestError)
|
|
317
|
+
return undefined;
|
|
318
|
+
throw error;
|
|
319
|
+
}
|
|
320
|
+
}, async () => {
|
|
321
|
+
try {
|
|
322
|
+
const value = await target.getAttribute('class');
|
|
323
|
+
if (value === null)
|
|
324
|
+
return 'no class attribute';
|
|
325
|
+
return `class ${JSON.stringify(value)}`;
|
|
326
|
+
}
|
|
327
|
+
catch (error) {
|
|
328
|
+
if (error instanceof TestError)
|
|
329
|
+
return 'no node';
|
|
330
|
+
throw error;
|
|
331
|
+
}
|
|
332
|
+
}, options?.timeout);
|
|
333
|
+
},
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function requireSelector(method, selector) {
|
|
337
|
+
if (typeof selector !== 'string' || selector.length === 0) {
|
|
338
|
+
throw new TestError('INVALID_LOCATOR', `${method}() requires a nonempty selector`);
|
|
339
|
+
}
|
|
340
|
+
return selector;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* The scope for the innermost of `frames` (outermost first). Every query and
|
|
344
|
+
* both escape hatches compile through the same `frame` chain, so a `locator`
|
|
345
|
+
* inside it resolves against the innermost document.
|
|
346
|
+
*/
|
|
347
|
+
function frameScreen(context, frames) {
|
|
348
|
+
const scope = (expression) => frames.reduceRight((source, selector) => ({ kind: 'frame', selector, source }), expression);
|
|
349
|
+
return Object.assign(context.screen(scope), {
|
|
350
|
+
locator: (selector) => context.locator(scope({ kind: 'selector', selector: requireSelector('locator', selector) })),
|
|
351
|
+
frameLocator: (selector) => frameScreen(context, [...frames, requireSelector('frameLocator', selector)]),
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=web.js.map
|
package/dist/web.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../src/web.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@e2edev/web",
|
|
3
|
+
"version": "0.11.0-canary-20260921180210",
|
|
4
|
+
"description": "Web engine for e2e agentic end-to-end testing, built on Playwright",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"e2e",
|
|
7
|
+
"testing",
|
|
8
|
+
"agentic",
|
|
9
|
+
"end-to-end",
|
|
10
|
+
"playwright",
|
|
11
|
+
"engine"
|
|
12
|
+
],
|
|
13
|
+
"license": "Apache-2.0",
|
|
14
|
+
"contributors": [
|
|
15
|
+
"Oskar Kwaśniewski <oskar@tester.army>",
|
|
16
|
+
"Szymon Rybczak <szymon@tester.army>"
|
|
17
|
+
],
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/tester-army/e2e.git",
|
|
21
|
+
"directory": "packages/web"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/tester-army/e2e/issues"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/tester-army/e2e/tree/main/packages/web#readme",
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"registry": "https://registry.npmjs.org/",
|
|
29
|
+
"access": "public",
|
|
30
|
+
"provenance": false,
|
|
31
|
+
"tag": "beta"
|
|
32
|
+
},
|
|
33
|
+
"type": "module",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"default": "./dist/index.js"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"files": [
|
|
41
|
+
"dist",
|
|
42
|
+
"NOTICE"
|
|
43
|
+
],
|
|
44
|
+
"peerDependencies": {
|
|
45
|
+
"e2e": "0.15.0-canary-20260921180210",
|
|
46
|
+
"playwright": ">=1.63.0 <2"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"@types/node": "26.4.1",
|
|
50
|
+
"e2e": "0.15.0-canary-20260921180210",
|
|
51
|
+
"@types/pngjs": "6.0.5",
|
|
52
|
+
"pngjs": "7.0.0",
|
|
53
|
+
"playwright": "1.63.0",
|
|
54
|
+
"typescript": "7.0.2",
|
|
55
|
+
"vitest": "5.0.0"
|
|
56
|
+
},
|
|
57
|
+
"engines": {
|
|
58
|
+
"node": ">=22.12.0"
|
|
59
|
+
},
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && tsc --project tsconfig.build.json && node ../../scripts/stamp-dist.ts",
|
|
62
|
+
"typecheck": "tsc --noEmit",
|
|
63
|
+
"test": "vitest run",
|
|
64
|
+
"test:watch": "vitest",
|
|
65
|
+
"test:unit": "vitest run tests/unit"
|
|
66
|
+
}
|
|
67
|
+
}
|