playwriter 0.0.63 → 0.0.89
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/dist/a11y-client.js +18 -8
- package/dist/aria-snapshot.d.ts +41 -3
- package/dist/aria-snapshot.d.ts.map +1 -1
- package/dist/aria-snapshot.js +134 -55
- package/dist/aria-snapshot.js.map +1 -1
- package/dist/aria-snapshot.test.js +5 -2
- package/dist/aria-snapshot.test.js.map +1 -1
- package/dist/aria-snapshot.unit.test.js +83 -41
- package/dist/aria-snapshot.unit.test.js.map +1 -1
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts +5 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.d.ts.map +1 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js +5 -0
- package/dist/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.js.map +1 -0
- package/dist/bippy.js +1 -1
- package/dist/cdp-log.d.ts +1 -1
- package/dist/cdp-log.d.ts.map +1 -1
- package/dist/cdp-log.js +1 -1
- package/dist/cdp-log.js.map +1 -1
- package/dist/cdp-relay.d.ts.map +1 -1
- package/dist/cdp-relay.js +492 -298
- package/dist/cdp-relay.js.map +1 -1
- package/dist/cdp-session.d.ts.map +1 -1
- package/dist/cdp-session.js.map +1 -1
- package/dist/cdp-types.d.ts.map +1 -1
- package/dist/cdp-types.js +7 -7
- package/dist/cdp-types.js.map +1 -1
- package/dist/clean-html.d.ts.map +1 -1
- package/dist/clean-html.js +4 -5
- package/dist/clean-html.js.map +1 -1
- package/dist/cli.js +45 -27
- package/dist/cli.js.map +1 -1
- package/dist/create-logger.d.ts.map +1 -1
- package/dist/create-logger.js +3 -1
- package/dist/create-logger.js.map +1 -1
- package/dist/debugger-examples-types.d.ts.map +1 -1
- package/dist/debugger.d.ts.map +1 -1
- package/dist/debugger.js +1 -3
- package/dist/debugger.js.map +1 -1
- package/dist/diff-utils.d.ts.map +1 -1
- package/dist/diff-utils.js +1 -4
- package/dist/diff-utils.js.map +1 -1
- package/dist/editor-api.md +12 -2
- package/dist/editor-examples.d.ts +1 -1
- package/dist/editor-examples.d.ts.map +1 -1
- package/dist/editor-examples.js +1 -1
- package/dist/editor-examples.js.map +1 -1
- package/dist/editor.d.ts +1 -1
- package/dist/editor.d.ts.map +1 -1
- package/dist/editor.js +1 -1
- package/dist/editor.js.map +1 -1
- package/dist/executor.d.ts +26 -3
- package/dist/executor.d.ts.map +1 -1
- package/dist/executor.js +297 -64
- package/dist/executor.js.map +1 -1
- package/dist/executor.unit.test.js +38 -1
- package/dist/executor.unit.test.js.map +1 -1
- package/dist/extension-connection.test.js +139 -36
- package/dist/extension-connection.test.js.map +1 -1
- package/dist/ffmpeg.d.ts +148 -0
- package/dist/ffmpeg.d.ts.map +1 -0
- package/dist/ffmpeg.js +523 -0
- package/dist/ffmpeg.js.map +1 -0
- package/dist/ghost-browser.d.ts.map +1 -1
- package/dist/ghost-browser.js.map +1 -1
- package/dist/ghost-cursor-client.js +287 -0
- package/dist/ghost-cursor.d.ts +27 -0
- package/dist/ghost-cursor.d.ts.map +1 -0
- package/dist/ghost-cursor.js +63 -0
- package/dist/ghost-cursor.js.map +1 -0
- package/dist/htmlrewrite.d.ts.map +1 -1
- package/dist/htmlrewrite.js +17 -55
- package/dist/htmlrewrite.js.map +1 -1
- package/dist/htmlrewrite.test.js.map +1 -1
- package/dist/kill-port.d.ts.map +1 -1
- package/dist/kill-port.js +1 -3
- package/dist/kill-port.js.map +1 -1
- package/dist/locator-selector.test.d.ts +2 -0
- package/dist/locator-selector.test.d.ts.map +1 -0
- package/dist/locator-selector.test.js +96 -0
- package/dist/locator-selector.test.js.map +1 -0
- package/dist/mcp-client.js.map +1 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +8 -3
- package/dist/mcp.js.map +1 -1
- package/dist/on-mouse-action.test.d.ts +2 -0
- package/dist/on-mouse-action.test.d.ts.map +1 -0
- package/dist/on-mouse-action.test.js +155 -0
- package/dist/on-mouse-action.test.js.map +1 -0
- package/dist/page-markdown.js +4 -4
- package/dist/page-markdown.js.map +1 -1
- package/dist/prompt.md +450 -377
- package/dist/protocol.d.ts +4 -0
- package/dist/protocol.d.ts.map +1 -1
- package/dist/readability.js +16 -2
- package/dist/recording-ghost-cursor.d.ts +41 -0
- package/dist/recording-ghost-cursor.d.ts.map +1 -0
- package/dist/recording-ghost-cursor.js +79 -0
- package/dist/recording-ghost-cursor.js.map +1 -0
- package/dist/recording-relay.d.ts.map +1 -1
- package/dist/recording-relay.js +8 -8
- package/dist/recording-relay.js.map +1 -1
- package/dist/relay-client.d.ts +17 -4
- package/dist/relay-client.d.ts.map +1 -1
- package/dist/relay-client.js +45 -11
- package/dist/relay-client.js.map +1 -1
- package/dist/relay-core.test.d.ts.map +1 -1
- package/dist/relay-core.test.js +515 -26
- package/dist/relay-core.test.js.map +1 -1
- package/dist/relay-navigation.test.d.ts.map +1 -1
- package/dist/relay-navigation.test.js +169 -31
- package/dist/relay-navigation.test.js.map +1 -1
- package/dist/relay-session.test.d.ts.map +1 -1
- package/dist/relay-session.test.js +113 -65
- package/dist/relay-session.test.js.map +1 -1
- package/dist/relay-state.d.ts +158 -0
- package/dist/relay-state.d.ts.map +1 -0
- package/dist/relay-state.js +306 -0
- package/dist/relay-state.js.map +1 -0
- package/dist/relay-state.test.d.ts +2 -0
- package/dist/relay-state.test.d.ts.map +1 -0
- package/dist/relay-state.test.js +472 -0
- package/dist/relay-state.test.js.map +1 -0
- package/dist/scoped-fs.d.ts.map +1 -1
- package/dist/scoped-fs.js.map +1 -1
- package/dist/screen-recording.d.ts +66 -4
- package/dist/screen-recording.d.ts.map +1 -1
- package/dist/screen-recording.js +150 -13
- package/dist/screen-recording.js.map +1 -1
- package/dist/screen-recording.test.d.ts +2 -0
- package/dist/screen-recording.test.d.ts.map +1 -0
- package/dist/screen-recording.test.js +102 -0
- package/dist/screen-recording.test.js.map +1 -0
- package/dist/selector-generator.js +1 -1
- package/dist/snapshot-tools.test.js +71 -28
- package/dist/snapshot-tools.test.js.map +1 -1
- package/dist/start-relay-server.d.ts +1 -1
- package/dist/start-relay-server.d.ts.map +1 -1
- package/dist/start-relay-server.js +1 -1
- package/dist/start-relay-server.js.map +1 -1
- package/dist/styles-api.md +8 -1
- package/dist/styles-examples.d.ts +1 -1
- package/dist/styles-examples.d.ts.map +1 -1
- package/dist/styles-examples.js +1 -1
- package/dist/styles-examples.js.map +1 -1
- package/dist/styles.d.ts.map +1 -1
- package/dist/styles.js +1 -3
- package/dist/styles.js.map +1 -1
- package/dist/test-declarations.d.ts.map +1 -1
- package/dist/test-utils.d.ts +1 -1
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/test-utils.js +7 -5
- package/dist/test-utils.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/wait-for-page-load.d.ts.map +1 -1
- package/dist/wait-for-page-load.js +1 -1
- package/dist/wait-for-page-load.js.map +1 -1
- package/package.json +4 -3
- package/src/a11y-client.ts +5 -4
- package/src/aria-snapshot.test.ts +5 -2
- package/src/aria-snapshot.ts +306 -117
- package/src/aria-snapshot.unit.test.ts +199 -141
- package/src/aria-snapshots/github-interactive.txt +2 -0
- package/src/aria-snapshots/github-raw.txt +5 -1
- package/src/aria-snapshots/hackernews-interactive.txt +238 -241
- package/src/aria-snapshots/hackernews-raw.txt +265 -269
- package/src/assets/aria-labels-example.png +0 -0
- package/src/assets/aria-labels-github.png +0 -0
- package/src/assets/aria-labels-hacker-news.png +0 -0
- package/src/assets/aria-labels-old-reddit.png +0 -0
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe-data-url.ts +5 -0
- package/src/assets/cursors/screen-studio/pointer-macos-tahoe.svg +18 -0
- package/src/cdp-log.ts +4 -1
- package/src/cdp-relay.ts +1059 -737
- package/src/cdp-session.ts +12 -3
- package/src/cdp-types.ts +51 -51
- package/src/clean-html.ts +4 -5
- package/src/cli.ts +82 -55
- package/src/create-logger.ts +5 -3
- package/src/debugger-examples-types.ts +4 -1
- package/src/debugger.ts +1 -5
- package/src/diff-utils.ts +2 -5
- package/src/editor-examples.ts +11 -1
- package/src/editor.ts +10 -2
- package/src/executor.ts +374 -73
- package/src/executor.unit.test.ts +48 -1
- package/src/extension-connection.test.ts +612 -488
- package/src/ffmpeg.ts +769 -0
- package/src/ghost-browser.ts +4 -6
- package/src/ghost-cursor-client.ts +369 -0
- package/src/ghost-cursor.ts +110 -0
- package/src/htmlrewrite.test.ts +6 -2
- package/src/htmlrewrite.ts +348 -386
- package/src/kill-port.ts +1 -3
- package/src/locator-selector.test.ts +115 -0
- package/src/mcp-client.ts +1 -1
- package/src/mcp.ts +21 -15
- package/src/on-mouse-action.test.ts +196 -0
- package/src/page-markdown.ts +7 -7
- package/src/protocol.ts +73 -57
- package/src/recording-ghost-cursor.ts +113 -0
- package/src/recording-relay.ts +20 -12
- package/src/relay-client.ts +85 -18
- package/src/relay-core.test.ts +1117 -578
- package/src/relay-navigation.test.ts +648 -483
- package/src/relay-session.test.ts +984 -929
- package/src/relay-state.test.ts +570 -0
- package/src/relay-state.ts +497 -0
- package/src/resource.md +21 -49
- package/src/scoped-fs.ts +9 -3
- package/src/screen-recording.test.ts +111 -0
- package/src/screen-recording.ts +256 -31
- package/src/skill.md +476 -396
- package/src/snapshot-tools.test.ts +580 -528
- package/src/snapshots/shadcn-ui-accessibility-full.md +8 -8
- package/src/snapshots/shadcn-ui-accessibility-interactive.md +8 -8
- package/src/start-relay-server.ts +14 -11
- package/src/styles-examples.ts +8 -1
- package/src/styles.ts +20 -21
- package/src/test-declarations.ts +6 -6
- package/src/test-utils.ts +104 -91
- package/src/utils.ts +2 -1
- package/src/wait-for-page-load.ts +6 -1
|
@@ -6,7 +6,7 @@ import { getCDPSessionForPage } from './cdp-session.js';
|
|
|
6
6
|
import { Debugger } from './debugger.js';
|
|
7
7
|
import { Editor } from './editor.js';
|
|
8
8
|
import { PlaywrightExecutor } from './executor.js';
|
|
9
|
-
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, createSseServer, safeCloseCDPBrowser, withTimeout, js } from './test-utils.js';
|
|
9
|
+
import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, createSseServer, safeCloseCDPBrowser, withTimeout, js, } from './test-utils.js';
|
|
10
10
|
import './test-declarations.js';
|
|
11
11
|
const TEST_PORT = 19993;
|
|
12
12
|
// --- CDP Session Tests ---
|
|
@@ -18,7 +18,7 @@ describe('CDP Session Tests', () => {
|
|
|
18
18
|
await serviceWorker.evaluate(async () => {
|
|
19
19
|
await globalThis.disconnectEverything();
|
|
20
20
|
});
|
|
21
|
-
await new Promise(r => setTimeout(r, 100));
|
|
21
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
22
22
|
}, 600000);
|
|
23
23
|
afterAll(async () => {
|
|
24
24
|
await cleanupTestContext(testCtx);
|
|
@@ -39,7 +39,7 @@ describe('CDP Session Tests', () => {
|
|
|
39
39
|
await serviceWorker.evaluate(async () => {
|
|
40
40
|
await globalThis.toggleExtensionForActiveTab();
|
|
41
41
|
});
|
|
42
|
-
await new Promise(r => setTimeout(r, 100));
|
|
42
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
43
43
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
44
44
|
const cdpSession = await getCDPSessionForPage({ page });
|
|
45
45
|
const dbg = new Debugger({ cdp: cdpSession });
|
|
@@ -56,11 +56,11 @@ describe('CDP Session Tests', () => {
|
|
|
56
56
|
const numberVar = 42;
|
|
57
57
|
debugger;
|
|
58
58
|
return localVar + numberVar;
|
|
59
|
-
})()
|
|
59
|
+
})()`,
|
|
60
60
|
});
|
|
61
61
|
await Promise.race([
|
|
62
62
|
pausedPromise,
|
|
63
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000))
|
|
63
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000)),
|
|
64
64
|
]);
|
|
65
65
|
expect(dbg.isPaused()).toBe(true);
|
|
66
66
|
const location = await dbg.getLocation();
|
|
@@ -76,7 +76,7 @@ describe('CDP Session Tests', () => {
|
|
|
76
76
|
const evalResult = await dbg.evaluate({ expression: 'localVar + " world"' });
|
|
77
77
|
expect(evalResult.value).toBe('hello world');
|
|
78
78
|
await dbg.resume();
|
|
79
|
-
await new Promise(r => setTimeout(r, 100));
|
|
79
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
80
80
|
expect(dbg.isPaused()).toBe(false);
|
|
81
81
|
await evalPromise;
|
|
82
82
|
await cdpSession.detach();
|
|
@@ -92,7 +92,7 @@ describe('CDP Session Tests', () => {
|
|
|
92
92
|
await serviceWorker.evaluate(async () => {
|
|
93
93
|
await globalThis.toggleExtensionForActiveTab();
|
|
94
94
|
});
|
|
95
|
-
await new Promise(r => setTimeout(r, 100));
|
|
95
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
96
96
|
const executor = new PlaywrightExecutor({
|
|
97
97
|
cdpConfig: { port: TEST_PORT },
|
|
98
98
|
logger: {
|
|
@@ -114,16 +114,27 @@ describe('CDP Session Tests', () => {
|
|
|
114
114
|
it('should list scripts with Debugger class', async () => {
|
|
115
115
|
const browserContext = getBrowserContext();
|
|
116
116
|
const serviceWorker = await getExtensionServiceWorker(browserContext);
|
|
117
|
-
// Use
|
|
117
|
+
// Use setContent with external script URLs so Debugger.listScripts returns them
|
|
118
118
|
const page = await browserContext.newPage();
|
|
119
|
-
await page.
|
|
119
|
+
await page.setContent(`
|
|
120
|
+
<html>
|
|
121
|
+
<head>
|
|
122
|
+
<script src="data:text/javascript,function hello() { return 1; }"></script>
|
|
123
|
+
<script src="data:text/javascript,function world() { return 2; }"></script>
|
|
124
|
+
</head>
|
|
125
|
+
<body><h1>Script test</h1></body>
|
|
126
|
+
</html>
|
|
127
|
+
`);
|
|
120
128
|
await page.bringToFront();
|
|
121
129
|
await serviceWorker.evaluate(async () => {
|
|
122
130
|
await globalThis.toggleExtensionForActiveTab();
|
|
123
131
|
});
|
|
124
|
-
await new Promise(r => setTimeout(r, 100));
|
|
132
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
125
133
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
126
|
-
const cdpPage = browser
|
|
134
|
+
const cdpPage = browser
|
|
135
|
+
.contexts()[0]
|
|
136
|
+
.pages()
|
|
137
|
+
.find((p) => p.url().startsWith('about:'));
|
|
127
138
|
expect(cdpPage).toBeDefined();
|
|
128
139
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
129
140
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -153,7 +164,7 @@ describe('CDP Session Tests', () => {
|
|
|
153
164
|
await serviceWorker.evaluate(async () => {
|
|
154
165
|
await globalThis.toggleExtensionForActiveTab();
|
|
155
166
|
});
|
|
156
|
-
await new Promise(r => setTimeout(r, 100));
|
|
167
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
157
168
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
158
169
|
const cdpSession = await getCDPSessionForPage({ page });
|
|
159
170
|
const dbg = new Debugger({ cdp: cdpSession });
|
|
@@ -181,7 +192,7 @@ describe('CDP Session Tests', () => {
|
|
|
181
192
|
await serviceWorker.evaluate(async () => {
|
|
182
193
|
await globalThis.toggleExtensionForActiveTab();
|
|
183
194
|
});
|
|
184
|
-
await new Promise(r => setTimeout(r, 100));
|
|
195
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
185
196
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
186
197
|
const cdpSession = await getCDPSessionForPage({ page });
|
|
187
198
|
const dbg = new Debugger({ cdp: cdpSession });
|
|
@@ -199,7 +210,7 @@ describe('CDP Session Tests', () => {
|
|
|
199
210
|
}
|
|
200
211
|
const result = inner();
|
|
201
212
|
return result;
|
|
202
|
-
})()
|
|
213
|
+
})()`,
|
|
203
214
|
});
|
|
204
215
|
await pausedPromise;
|
|
205
216
|
expect(dbg.isPaused()).toBe(true);
|
|
@@ -236,7 +247,7 @@ describe('CDP Session Tests', () => {
|
|
|
236
247
|
await serviceWorker.evaluate(async () => {
|
|
237
248
|
await globalThis.toggleExtensionForActiveTab();
|
|
238
249
|
});
|
|
239
|
-
await new Promise(r => setTimeout(r, 100));
|
|
250
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
240
251
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
241
252
|
const cdpSession = await getCDPSessionForPage({ page });
|
|
242
253
|
await cdpSession.send('Profiler.enable');
|
|
@@ -253,13 +264,13 @@ describe('CDP Session Tests', () => {
|
|
|
253
264
|
for (let i = 0; i < 1000; i++) {
|
|
254
265
|
document.querySelectorAll('*')
|
|
255
266
|
}
|
|
256
|
-
})()
|
|
267
|
+
})()`,
|
|
257
268
|
});
|
|
258
269
|
const stopResult = await cdpSession.send('Profiler.stop');
|
|
259
270
|
const profile = stopResult.profile;
|
|
260
271
|
const functionNames = profile.nodes
|
|
261
|
-
.map(n => n.callFrame.functionName)
|
|
262
|
-
.filter(name => name && name.length > 0)
|
|
272
|
+
.map((n) => n.callFrame.functionName)
|
|
273
|
+
.filter((name) => name && name.length > 0)
|
|
263
274
|
.slice(0, 10);
|
|
264
275
|
expect(profile.nodes.length).toBeGreaterThan(0);
|
|
265
276
|
expect(profile.endTime - profile.startTime).toBeGreaterThan(0);
|
|
@@ -280,24 +291,27 @@ describe('CDP Session Tests', () => {
|
|
|
280
291
|
await serviceWorker.evaluate(async () => {
|
|
281
292
|
await globalThis.toggleExtensionForActiveTab();
|
|
282
293
|
});
|
|
283
|
-
await new Promise(r => setTimeout(r, 100));
|
|
294
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
284
295
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
285
|
-
const cdpPage = browser
|
|
296
|
+
const cdpPage = browser
|
|
297
|
+
.contexts()[0]
|
|
298
|
+
.pages()
|
|
299
|
+
.find((p) => p.url().includes('example.com'));
|
|
286
300
|
expect(cdpPage).toBeDefined();
|
|
287
301
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
288
302
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
289
303
|
const initialTargets = await cdpSession.send('Target.getTargets');
|
|
290
|
-
const initialPageTarget = initialTargets.targetInfos.find(t => t.type === 'page' && t.url.includes('example.com'));
|
|
304
|
+
const initialPageTarget = initialTargets.targetInfos.find((t) => t.type === 'page' && t.url.includes('example.com'));
|
|
291
305
|
expect(initialPageTarget?.url).toBe('https://example.com/');
|
|
292
306
|
await cdpPage.goto('https://example.org/', { waitUntil: 'domcontentloaded' });
|
|
293
|
-
await new Promise(r => setTimeout(r, 100));
|
|
307
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
294
308
|
const afterNavTargets = await cdpSession.send('Target.getTargets');
|
|
295
|
-
const allPageTargets = afterNavTargets.targetInfos.filter(t => t.type === 'page');
|
|
296
|
-
const aboutBlankTargets = allPageTargets.filter(t => t.url === 'about:blank');
|
|
309
|
+
const allPageTargets = afterNavTargets.targetInfos.filter((t) => t.type === 'page');
|
|
310
|
+
const aboutBlankTargets = allPageTargets.filter((t) => t.url === 'about:blank');
|
|
297
311
|
expect(aboutBlankTargets).toHaveLength(0);
|
|
298
|
-
const exampleComTargets = allPageTargets.filter(t => t.url.includes('example.com'));
|
|
312
|
+
const exampleComTargets = allPageTargets.filter((t) => t.url.includes('example.com'));
|
|
299
313
|
expect(exampleComTargets).toHaveLength(0);
|
|
300
|
-
const exampleOrgTargets = allPageTargets.filter(t => t.url.includes('example.org'));
|
|
314
|
+
const exampleOrgTargets = allPageTargets.filter((t) => t.url.includes('example.org'));
|
|
301
315
|
expect(exampleOrgTargets).toHaveLength(1);
|
|
302
316
|
await cdpSession.detach();
|
|
303
317
|
await browser.close();
|
|
@@ -321,18 +335,21 @@ describe('CDP Session Tests', () => {
|
|
|
321
335
|
await serviceWorker.evaluate(async () => {
|
|
322
336
|
await globalThis.toggleExtensionForActiveTab();
|
|
323
337
|
});
|
|
324
|
-
await new Promise(r => setTimeout(r, 100));
|
|
338
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
325
339
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
326
|
-
const cdpPage = browser
|
|
340
|
+
const cdpPage = browser
|
|
341
|
+
.contexts()[0]
|
|
342
|
+
.pages()
|
|
343
|
+
.find((p) => p.url().includes('example.com'));
|
|
327
344
|
expect(cdpPage).toBeDefined();
|
|
328
345
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
329
346
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
330
347
|
const { targetInfos } = await cdpSession.send('Target.getTargets');
|
|
331
|
-
const allPageTargets = targetInfos.filter(t => t.type === 'page');
|
|
332
|
-
const aboutBlankTargets = allPageTargets.filter(t => t.url === 'about:blank');
|
|
348
|
+
const allPageTargets = targetInfos.filter((t) => t.type === 'page');
|
|
349
|
+
const aboutBlankTargets = allPageTargets.filter((t) => t.url === 'about:blank');
|
|
333
350
|
expect(aboutBlankTargets).toHaveLength(0);
|
|
334
351
|
const pageTargets = allPageTargets
|
|
335
|
-
.map(t => ({ type: t.type, url: t.url }))
|
|
352
|
+
.map((t) => ({ type: t.type, url: t.url }))
|
|
336
353
|
.sort((a, b) => a.url.localeCompare(b.url));
|
|
337
354
|
expect(pageTargets).toMatchInlineSnapshot(`
|
|
338
355
|
[
|
|
@@ -360,11 +377,14 @@ describe('CDP Session Tests', () => {
|
|
|
360
377
|
await serviceWorker.evaluate(async () => {
|
|
361
378
|
await globalThis.toggleExtensionForActiveTab();
|
|
362
379
|
});
|
|
363
|
-
await new Promise(r => setTimeout(r, 100));
|
|
380
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
364
381
|
await page.goto('https://example.org/', { waitUntil: 'domcontentloaded' });
|
|
365
|
-
await new Promise(r => setTimeout(r, 100));
|
|
382
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
366
383
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
367
|
-
const cdpPage = browser
|
|
384
|
+
const cdpPage = browser
|
|
385
|
+
.contexts()[0]
|
|
386
|
+
.pages()
|
|
387
|
+
.find((p) => p.url().includes('example.org'));
|
|
368
388
|
expect(cdpPage).toBeDefined();
|
|
369
389
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
370
390
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -387,9 +407,12 @@ describe('CDP Session Tests', () => {
|
|
|
387
407
|
await serviceWorker.evaluate(async () => {
|
|
388
408
|
await globalThis.toggleExtensionForActiveTab();
|
|
389
409
|
});
|
|
390
|
-
await new Promise(r => setTimeout(r, 100));
|
|
410
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
391
411
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
392
|
-
const cdpPage = browser
|
|
412
|
+
const cdpPage = browser
|
|
413
|
+
.contexts()[0]
|
|
414
|
+
.pages()
|
|
415
|
+
.find((p) => p.url().includes('example.com'));
|
|
393
416
|
expect(cdpPage).toBeDefined();
|
|
394
417
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
395
418
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -427,9 +450,12 @@ describe('CDP Session Tests', () => {
|
|
|
427
450
|
await serviceWorker.evaluate(async () => {
|
|
428
451
|
await globalThis.toggleExtensionForActiveTab();
|
|
429
452
|
});
|
|
430
|
-
await new Promise(r => setTimeout(r, 100));
|
|
453
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
431
454
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
432
|
-
const cdpPage = browser
|
|
455
|
+
const cdpPage = browser
|
|
456
|
+
.contexts()[0]
|
|
457
|
+
.pages()
|
|
458
|
+
.find((p) => p.url().includes('example.com'));
|
|
433
459
|
expect(cdpPage).toBeDefined();
|
|
434
460
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
435
461
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -446,11 +472,11 @@ describe('CDP Session Tests', () => {
|
|
|
446
472
|
} catch (e) {
|
|
447
473
|
// caught but should still pause with state 'all'
|
|
448
474
|
}
|
|
449
|
-
})()
|
|
475
|
+
})()`,
|
|
450
476
|
});
|
|
451
477
|
await Promise.race([
|
|
452
478
|
pausedPromise,
|
|
453
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000))
|
|
479
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Debugger.paused timeout')), 5000)),
|
|
454
480
|
]);
|
|
455
481
|
expect(dbg.isPaused()).toBe(true);
|
|
456
482
|
const location = await dbg.getLocation();
|
|
@@ -490,7 +516,7 @@ describe('CDP Session Tests', () => {
|
|
|
490
516
|
await serviceWorker.evaluate(async () => {
|
|
491
517
|
await globalThis.toggleExtensionForActiveTab();
|
|
492
518
|
});
|
|
493
|
-
await new Promise(r => setTimeout(r, 100));
|
|
519
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
494
520
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
495
521
|
let cdpPage;
|
|
496
522
|
for (const p of browser.contexts()[0].pages()) {
|
|
@@ -546,16 +572,21 @@ describe('CDP Session Tests', () => {
|
|
|
546
572
|
await serviceWorker.evaluate(async () => {
|
|
547
573
|
await globalThis.toggleExtensionForActiveTab();
|
|
548
574
|
});
|
|
549
|
-
await new Promise(r => setTimeout(r, 100));
|
|
575
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
550
576
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
551
|
-
const cdpPage = browser
|
|
577
|
+
const cdpPage = browser
|
|
578
|
+
.contexts()[0]
|
|
579
|
+
.pages()
|
|
580
|
+
.find((p) => p.url().includes('example.com'));
|
|
552
581
|
expect(cdpPage).toBeDefined();
|
|
553
582
|
const h1Bounds = await cdpPage.locator('h1').boundingBox();
|
|
554
583
|
expect(h1Bounds).toBeDefined();
|
|
555
584
|
console.log('H1 bounding box:', h1Bounds);
|
|
556
585
|
await cdpPage.evaluate(() => {
|
|
586
|
+
;
|
|
557
587
|
window.clickedAt = null;
|
|
558
588
|
document.addEventListener('click', (e) => {
|
|
589
|
+
;
|
|
559
590
|
window.clickedAt = { x: e.clientX, y: e.clientY };
|
|
560
591
|
});
|
|
561
592
|
});
|
|
@@ -577,9 +608,12 @@ describe('CDP Session Tests', () => {
|
|
|
577
608
|
await serviceWorker.evaluate(async () => {
|
|
578
609
|
await globalThis.toggleExtensionForActiveTab();
|
|
579
610
|
});
|
|
580
|
-
await new Promise(r => setTimeout(r, 100));
|
|
611
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
581
612
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
582
|
-
const cdpPage = browser
|
|
613
|
+
const cdpPage = browser
|
|
614
|
+
.contexts()[0]
|
|
615
|
+
.pages()
|
|
616
|
+
.find((p) => p.url().includes('example.com'));
|
|
583
617
|
expect(cdpPage).toBeDefined();
|
|
584
618
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
585
619
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -593,7 +627,7 @@ describe('CDP Session Tests', () => {
|
|
|
593
627
|
}
|
|
594
628
|
`,
|
|
595
629
|
});
|
|
596
|
-
await new Promise(r => setTimeout(r, 100));
|
|
630
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
597
631
|
const scripts = await editor.list();
|
|
598
632
|
expect(scripts.length).toBeGreaterThan(0);
|
|
599
633
|
const matches = await editor.grep({ regex: /greetUser/ });
|
|
@@ -608,13 +642,14 @@ describe('CDP Session Tests', () => {
|
|
|
608
642
|
newString: "console.log('Hello, ' + name); console.log('EDITOR_TEST_MARKER');",
|
|
609
643
|
});
|
|
610
644
|
const consoleLogs = [];
|
|
611
|
-
cdpPage.on('console', msg => {
|
|
645
|
+
cdpPage.on('console', (msg) => {
|
|
612
646
|
consoleLogs.push(msg.text());
|
|
613
647
|
});
|
|
614
648
|
await cdpPage.evaluate(() => {
|
|
649
|
+
;
|
|
615
650
|
window.greetUser('World');
|
|
616
651
|
});
|
|
617
|
-
await new Promise(r => setTimeout(r, 100));
|
|
652
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
618
653
|
expect(consoleLogs).toContain('Hello, World');
|
|
619
654
|
expect(consoleLogs).toContain('EDITOR_TEST_MARKER');
|
|
620
655
|
await cdpSession.detach();
|
|
@@ -630,9 +665,12 @@ describe('CDP Session Tests', () => {
|
|
|
630
665
|
await serviceWorker.evaluate(async () => {
|
|
631
666
|
await globalThis.toggleExtensionForActiveTab();
|
|
632
667
|
});
|
|
633
|
-
await new Promise(r => setTimeout(r, 100));
|
|
668
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
634
669
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
635
|
-
const cdpPage = browser
|
|
670
|
+
const cdpPage = browser
|
|
671
|
+
.contexts()[0]
|
|
672
|
+
.pages()
|
|
673
|
+
.find((p) => p.url().includes('example.com'));
|
|
636
674
|
expect(cdpPage).toBeDefined();
|
|
637
675
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
638
676
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
@@ -646,7 +684,7 @@ describe('CDP Session Tests', () => {
|
|
|
646
684
|
}
|
|
647
685
|
`,
|
|
648
686
|
});
|
|
649
|
-
await new Promise(r => setTimeout(r, 100));
|
|
687
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
650
688
|
const stylesheets = await editor.list({ pattern: /inline-css:/ });
|
|
651
689
|
expect(stylesheets.length).toBeGreaterThan(0);
|
|
652
690
|
const cssMatches = await editor.grep({ regex: /editor-test-element/, pattern: /inline-css:/ });
|
|
@@ -709,10 +747,10 @@ describe('CDP Session Tests', () => {
|
|
|
709
747
|
await serviceWorker.evaluate(async () => {
|
|
710
748
|
await globalThis.toggleExtensionForActiveTab();
|
|
711
749
|
});
|
|
712
|
-
await new Promise(r => setTimeout(r, 500));
|
|
750
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
713
751
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
714
752
|
const pages = browser.contexts()[0].pages();
|
|
715
|
-
const cdpPage = pages.find(p => p.url().startsWith('about:'));
|
|
753
|
+
const cdpPage = pages.find((p) => p.url().startsWith('about:'));
|
|
716
754
|
expect(cdpPage).toBeDefined();
|
|
717
755
|
const btn = cdpPage.locator('#react-btn');
|
|
718
756
|
const btnCount = await btn.count();
|
|
@@ -774,7 +812,7 @@ describe('Service Worker Target Tests', () => {
|
|
|
774
812
|
await serviceWorker.evaluate(async () => {
|
|
775
813
|
await globalThis.toggleExtensionForActiveTab();
|
|
776
814
|
});
|
|
777
|
-
await new Promise(r => setTimeout(r, 500));
|
|
815
|
+
await new Promise((r) => setTimeout(r, 500));
|
|
778
816
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
779
817
|
const context = browser.contexts()[0];
|
|
780
818
|
const pages = context.pages();
|
|
@@ -784,7 +822,7 @@ describe('Service Worker Target Tests', () => {
|
|
|
784
822
|
expect(url).not.toMatch(/sw\.js$/i);
|
|
785
823
|
expect(url).not.toMatch(/service.?worker/i);
|
|
786
824
|
}
|
|
787
|
-
const targetPage = pages.find(p => p.url().includes('web.dev'));
|
|
825
|
+
const targetPage = pages.find((p) => p.url().includes('web.dev'));
|
|
788
826
|
expect(targetPage).toBeDefined();
|
|
789
827
|
const title = await targetPage.title();
|
|
790
828
|
expect(title).toBeTruthy();
|
|
@@ -800,20 +838,23 @@ describe('Service Worker Target Tests', () => {
|
|
|
800
838
|
await serviceWorker.evaluate(async () => {
|
|
801
839
|
await globalThis.toggleExtensionForActiveTab();
|
|
802
840
|
});
|
|
803
|
-
await new Promise(r => setTimeout(r, 100));
|
|
841
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
804
842
|
const browser = await chromium.connectOverCDP(getCdpUrl({ port: TEST_PORT }));
|
|
805
|
-
const cdpPage = browser
|
|
843
|
+
const cdpPage = browser
|
|
844
|
+
.contexts()[0]
|
|
845
|
+
.pages()
|
|
846
|
+
.find((p) => p.url().includes('example.com'));
|
|
806
847
|
expect(cdpPage).toBeDefined();
|
|
807
848
|
const wsUrl = getCdpUrl({ port: TEST_PORT });
|
|
808
849
|
const cdpSession = await getCDPSessionForPage({ page: cdpPage });
|
|
809
850
|
await cdpSession.send('Network.disable');
|
|
810
851
|
await cdpSession.send('Network.enable', {
|
|
811
852
|
maxTotalBufferSize: 10000000,
|
|
812
|
-
maxResourceBufferSize: 5000000
|
|
853
|
+
maxResourceBufferSize: 5000000,
|
|
813
854
|
});
|
|
814
855
|
const [response] = await Promise.all([
|
|
815
|
-
cdpPage.waitForResponse(resp => resp.url() === 'https://example.com/'),
|
|
816
|
-
cdpPage.goto('https://example.com/')
|
|
856
|
+
cdpPage.waitForResponse((resp) => resp.url() === 'https://example.com/'),
|
|
857
|
+
cdpPage.goto('https://example.com/'),
|
|
817
858
|
]);
|
|
818
859
|
const body = await response.text();
|
|
819
860
|
expect(body).toBeDefined();
|
|
@@ -864,7 +905,10 @@ describe('Service Worker Target Tests', () => {
|
|
|
864
905
|
timeoutMs: 5000,
|
|
865
906
|
errorMessage: 'connectOverCDP timed out',
|
|
866
907
|
});
|
|
867
|
-
const cdpPage = browser
|
|
908
|
+
const cdpPage = browser
|
|
909
|
+
.contexts()[0]
|
|
910
|
+
.pages()
|
|
911
|
+
.find((p) => {
|
|
868
912
|
return p.url().startsWith(sseServer.baseUrl);
|
|
869
913
|
});
|
|
870
914
|
expect(cdpPage).toBeDefined();
|
|
@@ -940,7 +984,7 @@ describe('Auto-enable Tests', () => {
|
|
|
940
984
|
await serviceWorker.evaluate(async () => {
|
|
941
985
|
await globalThis.disconnectEverything();
|
|
942
986
|
});
|
|
943
|
-
await new Promise(r => setTimeout(r, 100));
|
|
987
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
944
988
|
}, 600000);
|
|
945
989
|
afterAll(async () => {
|
|
946
990
|
delete process.env.PLAYWRITER_AUTO_ENABLE;
|
|
@@ -959,7 +1003,7 @@ describe('Auto-enable Tests', () => {
|
|
|
959
1003
|
await serviceWorker.evaluate(async () => {
|
|
960
1004
|
await globalThis.disconnectEverything();
|
|
961
1005
|
});
|
|
962
|
-
await new Promise(r => setTimeout(r, 100));
|
|
1006
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
963
1007
|
const tabCountBefore = await serviceWorker.evaluate(() => {
|
|
964
1008
|
const state = globalThis.getExtensionState();
|
|
965
1009
|
return state.tabs.size;
|
|
@@ -987,7 +1031,9 @@ describe('Auto-enable Tests', () => {
|
|
|
987
1031
|
await serviceWorker.evaluate(async () => {
|
|
988
1032
|
await globalThis.disconnectEverything();
|
|
989
1033
|
});
|
|
990
|
-
await new Promise((r) => {
|
|
1034
|
+
await new Promise((r) => {
|
|
1035
|
+
setTimeout(r, 100);
|
|
1036
|
+
});
|
|
991
1037
|
const tabCountBefore = await serviceWorker.evaluate(() => {
|
|
992
1038
|
const state = globalThis.getExtensionState();
|
|
993
1039
|
return state.tabs.size;
|
|
@@ -1019,7 +1065,9 @@ describe('Auto-enable Tests', () => {
|
|
|
1019
1065
|
`,
|
|
1020
1066
|
},
|
|
1021
1067
|
});
|
|
1022
|
-
await new Promise((r) => {
|
|
1068
|
+
await new Promise((r) => {
|
|
1069
|
+
setTimeout(r, 100);
|
|
1070
|
+
});
|
|
1023
1071
|
const afterCloseResult = await client.callTool({
|
|
1024
1072
|
name: 'execute',
|
|
1025
1073
|
arguments: {
|