diff --git a/packages/playwright-core/src/server/supplements/har/har.ts b/packages/playwright-core/src/server/supplements/har/har.ts index 2e003b9bbe..82389c19fb 100644 --- a/packages/playwright-core/src/server/supplements/har/har.ts +++ b/packages/playwright-core/src/server/supplements/har/har.ts @@ -85,6 +85,7 @@ export type Response = { headersSize: number; bodySize: number; _transferSize: number; + _failureText?: string }; export type Cookie = { diff --git a/packages/playwright-core/src/server/supplements/har/harTracer.ts b/packages/playwright-core/src/server/supplements/har/harTracer.ts index 07cfdf84ee..4233f1744b 100644 --- a/packages/playwright-core/src/server/supplements/har/harTracer.ts +++ b/packages/playwright-core/src/server/supplements/har/harTracer.ts @@ -64,6 +64,7 @@ export class HarTracer { eventsHelper.addEventListener(this._context, BrowserContext.Events.Page, (page: Page) => this._ensurePageEntry(page)), eventsHelper.addEventListener(this._context, BrowserContext.Events.Request, (request: network.Request) => this._onRequest(request)), eventsHelper.addEventListener(this._context, BrowserContext.Events.RequestFinished, ({ request, response }) => this._onRequestFinished(request, response).catch(() => {})), + eventsHelper.addEventListener(this._context, BrowserContext.Events.RequestFailed, request => this._onRequestFailed(request)), eventsHelper.addEventListener(this._context, BrowserContext.Events.Response, (response: network.Response) => this._onResponse(response)), eventsHelper.addEventListener(this._context.fetchRequest, APIRequestContext.Events.Request, (event: APIRequestEvent) => this._onAPIRequest(event)), eventsHelper.addEventListener(this._context.fetchRequest, APIRequestContext.Events.RequestFinished, (event: APIRequestFinishedEvent) => this._onAPIRequestFinished(event)), @@ -264,6 +265,17 @@ export class HarTracer { })); } + private async _onRequestFailed(request: network.Request) { + const harEntry = this._entryForRequest(request); + if (!harEntry) + return; + + if (request._failureText !== null) + harEntry.response._failureText = request._failureText; + if (this._started) + this._delegate.onEntryFinished(harEntry); + } + private _storeResponseContent(buffer: Buffer | undefined, content: har.Content) { if (!buffer) { content.size = 0; diff --git a/packages/playwright-core/src/web/traceViewer/ui/networkResourceDetails.tsx b/packages/playwright-core/src/web/traceViewer/ui/networkResourceDetails.tsx index 37126fe988..77b03a5452 100644 --- a/packages/playwright-core/src/web/traceViewer/ui/networkResourceDetails.tsx +++ b/packages/playwright-core/src/web/traceViewer/ui/networkResourceDetails.tsx @@ -106,16 +106,26 @@ export const NetworkResourceDetails: React.FunctionComponent<{ if (charset) contentType = charset[1]; - return