diff --git a/packages/playwright-core/src/client/frame.ts b/packages/playwright-core/src/client/frame.ts index bef0084b0e..362a05aef6 100644 --- a/packages/playwright-core/src/client/frame.ts +++ b/packages/playwright-core/src/client/frame.ts @@ -148,14 +148,16 @@ export class Frame extends ChannelOwner implements api.Fr async waitForLoadState(state: LifecycleEvent = 'load', options: { timeout?: number } = {}): Promise { state = verifyLoadState('state', state); - if (this._loadStates.has(state)) - return; return this._page!._wrapApiCall(async () => { const waiter = this._setupNavigationWaiter(options); - await waiter.waitForEvent(this._eventEmitter, 'loadstate', s => { - waiter.log(` "${s}" event fired`); - return s === state; - }); + if (this._loadStates.has(state)) { + waiter.log(` not waiting, "${state}" event already fired`); + } else { + await waiter.waitForEvent(this._eventEmitter, 'loadstate', s => { + waiter.log(` "${s}" event fired`); + return s === state; + }); + } waiter.dispose(); }); } diff --git a/tests/library/trace-viewer.spec.ts b/tests/library/trace-viewer.spec.ts index 93946f75c0..c3814175ef 100644 --- a/tests/library/trace-viewer.spec.ts +++ b/tests/library/trace-viewer.spec.ts @@ -717,3 +717,15 @@ test('should serve overridden request', async ({ page, runAndTrace, server }) => expect(color).toBe('rgb(255, 0, 0)'); }); +test('should display waitForLoadState even if did not wait for it', async ({ runAndTrace, server, page }) => { + const traceViewer = await runAndTrace(async () => { + await page.goto(server.EMPTY_PAGE); + await page.waitForLoadState('load'); + await page.waitForLoadState('load'); + }); + await expect(traceViewer.actionTitles).toHaveText([ + /page.goto/, + /page.waitForLoadState/, + /page.waitForLoadState/, + ]); +});