From 7579572688f43931c461ae76a9a006fbb2e86662 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 6 Jun 2023 16:55:53 -0700 Subject: [PATCH] chore: unflake the network status test (#23551) --- .../playwright-core/src/client/network.ts | 1 + .../playwright-core/src/protocol/validator.ts | 1 + .../server/dispatchers/networkDispatchers.ts | 1 + .../playwright-core/src/server/network.ts | 2 +- packages/playwright-core/src/server/types.ts | 1 + .../playwright-test/src/worker/testInfo.ts | 2 +- packages/protocol/src/channels.ts | 1 + packages/protocol/src/protocol.yml | 1 + packages/trace-viewer/src/ui/workbench.css | 1 + tests/library/trace-viewer.spec.ts | 27 ++++++++++++++++--- tests/library/tracing.spec.ts | 3 ++- 11 files changed, 34 insertions(+), 7 deletions(-) diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index 2b05af6284..08d90f036c 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -420,6 +420,7 @@ export class Route extends ChannelOwner implements api.Ro method: options.method, headers: options.headers ? headersObjectToArray(options.headers) : undefined, postData: options.postDataBuffer, + isFallback: internal, })); }, !!internal); } diff --git a/packages/playwright-core/src/protocol/validator.ts b/packages/playwright-core/src/protocol/validator.ts index 82a11dc829..378d8bda70 100644 --- a/packages/playwright-core/src/protocol/validator.ts +++ b/packages/playwright-core/src/protocol/validator.ts @@ -2003,6 +2003,7 @@ scheme.RouteContinueParams = tObject({ headers: tOptional(tArray(tType('NameValue'))), postData: tOptional(tBinary), requestUrl: tString, + isFallback: tBoolean, }); scheme.RouteContinueResult = tOptional(tObject({})); scheme.RouteFulfillParams = tObject({ diff --git a/packages/playwright-core/src/server/dispatchers/networkDispatchers.ts b/packages/playwright-core/src/server/dispatchers/networkDispatchers.ts index 990bc93300..244c783e82 100644 --- a/packages/playwright-core/src/server/dispatchers/networkDispatchers.ts +++ b/packages/playwright-core/src/server/dispatchers/networkDispatchers.ts @@ -132,6 +132,7 @@ export class RouteDispatcher extends Dispatcher value !== undefined)) + if (!overrides.isFallback) this._request._context.emit(BrowserContext.Events.RequestContinued, this._request); this._endHandling(); } diff --git a/packages/playwright-core/src/server/types.ts b/packages/playwright-core/src/server/types.ts index 1767783ec8..ccf8238938 100644 --- a/packages/playwright-core/src/server/types.ts +++ b/packages/playwright-core/src/server/types.ts @@ -146,6 +146,7 @@ export type NormalizedContinueOverrides = { method?: string, headers?: HeadersArray, postData?: Buffer, + isFallback?: boolean, }; export type EmulatedSize = { viewport: Size, screen: Size }; diff --git a/packages/playwright-test/src/worker/testInfo.ts b/packages/playwright-test/src/worker/testInfo.ts index e363a09a72..771dac2c3d 100644 --- a/packages/playwright-test/src/worker/testInfo.ts +++ b/packages/playwright-test/src/worker/testInfo.ts @@ -228,7 +228,7 @@ export class TestInfoImpl implements TestInfo { } _addStep(data: Omit, parentStep?: TestStepInternal): TestStepInternal { - const stepId = `${data.category}@${data.title}@${++this._lastStepId}`; + const stepId = `${data.category}@${++this._lastStepId}`; if (!parentStep) parentStep = zones.zoneData('stepZone', captureRawStack()) || undefined; diff --git a/packages/protocol/src/channels.ts b/packages/protocol/src/channels.ts index eccb93b51d..76cee1e207 100644 --- a/packages/protocol/src/channels.ts +++ b/packages/protocol/src/channels.ts @@ -3562,6 +3562,7 @@ export type RouteContinueParams = { headers?: NameValue[], postData?: Binary, requestUrl: string, + isFallback: boolean, }; export type RouteContinueOptions = { url?: string, diff --git a/packages/protocol/src/protocol.yml b/packages/protocol/src/protocol.yml index 26b0276b4f..7be9a814cd 100644 --- a/packages/protocol/src/protocol.yml +++ b/packages/protocol/src/protocol.yml @@ -2818,6 +2818,7 @@ Route: items: NameValue postData: binary? requestUrl: string + isFallback: boolean fulfill: parameters: diff --git a/packages/trace-viewer/src/ui/workbench.css b/packages/trace-viewer/src/ui/workbench.css index 031039c51d..50043ca9d0 100644 --- a/packages/trace-viewer/src/ui/workbench.css +++ b/packages/trace-viewer/src/ui/workbench.css @@ -66,6 +66,7 @@ body.dark-mode .drop-target { } .progress { + flex: none; width: 100%; height: 3px; margin-top: -3px; diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index a1642d2382..0478a4c20d 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -31,7 +31,6 @@ test.beforeAll(async function recordTrace({ browser, browserName, browserType, s const context = await browser.newContext(); await context.tracing.start({ name: 'test', screenshots: true, snapshots: true, sources: true }); const page = await context.newPage(); - await page.route('**/style.css', route => route.abort()); await page.goto(`data:text/html,Hello world`); await page.setContent(''); await expect(page.locator('button')).toHaveText('Click'); @@ -102,7 +101,6 @@ test('should open simple trace viewer', async ({ showTraceViewer }) => { const traceViewer = await showTraceViewer([traceFile]); await expect(traceViewer.actionTitles).toHaveText([ /browserContext.newPage/, - /page.route/, /page.gotodata:text\/html,Hello world<\/html>/, /page.setContent/, /expect.toHaveTextlocator\('button'\)/, @@ -115,7 +113,6 @@ test('should open simple trace viewer', async ({ showTraceViewer }) => { /page.waitForResponse/, /page.waitForTimeout/, /page.gotohttp:\/\/localhost:\d+\/frames\/frame.html/, - /route.abort/, /page.setViewportSize/, ]); }); @@ -220,10 +217,32 @@ test('should have network requests', async ({ showTraceViewer }) => { await traceViewer.selectAction('http://localhost'); await traceViewer.showNetworkTab(); await expect(traceViewer.networkRequests).toContainText([/200GETframe.htmltext\/html/]); - await expect(traceViewer.networkRequests).toContainText([/aborted.*style.cssx-unknown/]); + await expect(traceViewer.networkRequests).toContainText([/200GETstyle.csstext\/css/]); await expect(traceViewer.networkRequests).toContainText([/200GETscript.jsapplication\/javascript/]); }); +test('should have network request overrides', async ({ page, server, runAndTrace }) => { + const traceViewer = await runAndTrace(async () => { + await page.route('**/style.css', route => route.abort()); + await page.goto(server.PREFIX + '/frames/frame.html'); + }); + await traceViewer.selectAction('http://localhost'); + await traceViewer.showNetworkTab(); + await expect(traceViewer.networkRequests).toContainText([/200GETframe.htmltext\/html/]); + await expect(traceViewer.networkRequests).toContainText([/abort.*style.cssx-unknown/]); +}); + +test('should have network request overrides 2', async ({ page, server, runAndTrace }) => { + const traceViewer = await runAndTrace(async () => { + await page.route('**/script.js', route => route.continue()); + await page.goto(server.PREFIX + '/frames/frame.html'); + }); + await traceViewer.selectAction('http://localhost'); + await traceViewer.showNetworkTab(); + await expect(traceViewer.networkRequests).toContainText([/200GETframe.htmltext\/html/]); + await expect(traceViewer.networkRequests).toContainText([/continue.*script.jsapplication\/javascript/]); +}); + test('should show snapshot URL', async ({ page, runAndTrace, server }) => { const traceViewer = await runAndTrace(async () => { await page.goto(server.EMPTY_PAGE); diff --git a/tests/library/tracing.spec.ts b/tests/library/tracing.spec.ts index 1d5300269c..2282354565 100644 --- a/tests/library/tracing.spec.ts +++ b/tests/library/tracing.spec.ts @@ -637,7 +637,8 @@ test('should store postData for global request', async ({ request, server }, tes })); }); -test('should not flush console events', async ({ context, page }, testInfo) => { +test('should not flush console events', async ({ context, page, mode }, testInfo) => { + test.skip(mode === 'service', 'Uses artifactsFolderName'); const testId = test.info().testId; await context.tracing.start({ name: testId }); const promise = new Promise(f => {