From 6fd9c2af595ee79b8353abf4bf02a82103257bd8 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov Date: Tue, 21 Oct 2025 18:36:26 +0200 Subject: [PATCH 1/3] fix(network): includePreviousNavigations work with fewer than 3 navigations --- src/PageCollector.ts | 6 ++++- tests/PageCollector.test.ts | 32 +++++++++++++++++++++++ tests/tools/network.test.js.snapshot | 9 +++++++ tests/tools/network.test.ts | 38 ++++++++++++++++++++++++++++ tests/tools/script.test.ts | 5 +--- 5 files changed, 85 insertions(+), 5 deletions(-) diff --git a/src/PageCollector.ts b/src/PageCollector.ts index 39168dc8..e10edc1b 100644 --- a/src/PageCollector.ts +++ b/src/PageCollector.ts @@ -144,7 +144,11 @@ export class PageCollector { } const data: T[] = []; - for (let index = this.#maxNavigationSaved; index >= 0; index--) { + const navigationNum = Math.min( + navigations.length - 1, + this.#maxNavigationSaved, + ); + for (let index = navigationNum; index >= 0; index--) { data.push(...navigations[index]); } return data; diff --git a/tests/PageCollector.test.ts b/tests/PageCollector.test.ts index 5da1d31a..d1a882d4 100644 --- a/tests/PageCollector.test.ts +++ b/tests/PageCollector.test.ts @@ -286,4 +286,36 @@ describe('NetworkCollector', () => { page.emit('request', request); assert.equal(collector.getData(page).length, 2); }); + + it.only('works with previous navigations', async () => { + const browser = getMockBrowser(); + const page = (await browser.pages())[0]; + const mainFrame = page.mainFrame(); + const navRequest = getMockRequest({ + navigationRequest: true, + frame: page.mainFrame(), + }); + const navRequest2 = getMockRequest({ + navigationRequest: true, + frame: page.mainFrame(), + }); + const request = getMockRequest(); + + const collector = new NetworkCollector(browser); + await collector.init(); + page.emit('request', navRequest); + assert.equal(collector.getData(page, true).length, 1); + + page.emit('framenavigated', mainFrame); + assert.equal(collector.getData(page, true).length, 1); + + page.emit('request', navRequest2); + assert.equal(collector.getData(page, true).length, 2); + + page.emit('framenavigated', mainFrame); + assert.equal(collector.getData(page, true).length, 2); + + page.emit('request', request); + assert.equal(collector.getData(page, true).length, 3); + }); }); diff --git a/tests/tools/network.test.js.snapshot b/tests/tools/network.test.js.snapshot index 0a74003c..df4002ba 100644 --- a/tests/tools/network.test.js.snapshot +++ b/tests/tools/network.test.js.snapshot @@ -34,3 +34,12 @@ reqid=1 GET http://localhost:/one [success - 200] reqid=2 GET http://localhost:/two [success - 200] reqid=3 GET http://localhost:/three [success - 200] `; + +exports[`network > network_list_requests > list requests from previous navigations from redirects 1`] = ` +# list_request response +## Network requests +Showing 1-3 of 3 (Page 1 of 1). +reqid=1 GET http://localhost:/redirect [failed - 302] +reqid=2 GET http://localhost:/redirected [success - 200] +reqid=3 GET http://localhost:/redirected-page [success - 200] +`; diff --git a/tests/tools/network.test.ts b/tests/tools/network.test.ts index c5f666b9..69af7fb4 100644 --- a/tests/tools/network.test.ts +++ b/tests/tools/network.test.ts @@ -71,6 +71,44 @@ describe('network', () => { t.assert.snapshot?.(stabilizeResponseOutput(responseData[0].text)); }); }); + + it('list requests from previous navigations from redirects', async t => { + server.addRoute('/redirect', async (_req, res) => { + res.writeHead(302, { + Location: server.getRoute('/redirected'), + }); + res.end(); + }); + + server.addHtmlRoute( + '/redirected', + html``, + ); + + server.addHtmlRoute( + '/redirected-page', + html`
I was redirected 2 times
`, + ); + + await withBrowser(async (response, context) => { + await context.setUpNetworkCollectorForTesting(); + const page = context.getSelectedPage(); + await page.goto(server.getRoute('/redirect')); + await listNetworkRequests.handler( + { + params: { + includePreviousNavigations: true, + }, + }, + response, + context, + ); + const responseData = await response.handle('list_request', context); + t.assert.snapshot?.(stabilizeResponseOutput(responseData[0].text)); + }); + }); }); describe('network_get_request', () => { it('attaches request', async () => { diff --git a/tests/tools/script.test.ts b/tests/tools/script.test.ts index a31cff1c..981ca92e 100644 --- a/tests/tools/script.test.ts +++ b/tests/tools/script.test.ts @@ -161,10 +161,7 @@ describe('script', () => { '/iframe', html`
`, ); - server.addRoute('/main', async (_req, res) => { - res.write(html``); - res.end(); - }); + server.addHtmlRoute('/main', html``); await withBrowser(async (response, context) => { const page = context.getSelectedPage(); From 4d97fcf6ebea7e1a0e4e30bb2179c64172019f7b Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov Date: Tue, 21 Oct 2025 18:38:35 +0200 Subject: [PATCH 2/3] fix --- tests/PageCollector.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PageCollector.test.ts b/tests/PageCollector.test.ts index d1a882d4..9cd7c423 100644 --- a/tests/PageCollector.test.ts +++ b/tests/PageCollector.test.ts @@ -287,7 +287,7 @@ describe('NetworkCollector', () => { assert.equal(collector.getData(page).length, 2); }); - it.only('works with previous navigations', async () => { + it('works with previous navigations', async () => { const browser = getMockBrowser(); const page = (await browser.pages())[0]; const mainFrame = page.mainFrame(); From 5a9de2d2a9e49ca3503959bba8337b803fd011e2 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov Date: Tue, 21 Oct 2025 18:49:32 +0200 Subject: [PATCH 3/3] simplify --- src/PageCollector.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/PageCollector.ts b/src/PageCollector.ts index e10edc1b..16841149 100644 --- a/src/PageCollector.ts +++ b/src/PageCollector.ts @@ -144,12 +144,11 @@ export class PageCollector { } const data: T[] = []; - const navigationNum = Math.min( - navigations.length - 1, - this.#maxNavigationSaved, - ); - for (let index = navigationNum; index >= 0; index--) { - data.push(...navigations[index]); + + for (let index = this.#maxNavigationSaved; index >= 0; index--) { + if (navigations[index]) { + data.push(...navigations[index]); + } } return data; }