From 8f6b2c9b7c219d405c954bf7af082d3d29fd48ff Mon Sep 17 00:00:00 2001 From: Egor Andreyuk <84775894+aspic-fish@users.noreply.github.com> Date: Wed, 5 Oct 2022 21:46:34 +0300 Subject: [PATCH] fix: waitForRequest works with async predicate (#9058) --- packages/puppeteer-core/src/common/Page.ts | 4 ++-- test/src/page.spec.ts | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/packages/puppeteer-core/src/common/Page.ts b/packages/puppeteer-core/src/common/Page.ts index 90e712e65c76b..684aac43db3d3 100644 --- a/packages/puppeteer-core/src/common/Page.ts +++ b/packages/puppeteer-core/src/common/Page.ts @@ -1668,12 +1668,12 @@ export class CDPPage extends Page { return waitForEvent( this.#frameManager.networkManager, NetworkManagerEmittedEvents.Request, - request => { + async request => { if (isString(urlOrPredicate)) { return urlOrPredicate === request.url(); } if (typeof urlOrPredicate === 'function') { - return !!urlOrPredicate(request); + return !!(await urlOrPredicate(request)); } return false; }, diff --git a/test/src/page.spec.ts b/test/src/page.spec.ts index 4d79c94a973fa..b490b1af12b84 100644 --- a/test/src/page.spec.ts +++ b/test/src/page.spec.ts @@ -907,6 +907,22 @@ describe('Page', function () { ]); expect(request.url()).toBe(server.PREFIX + '/digits/2.png'); }); + it('should work with async predicate', async () => { + const {page, server} = getTestState(); + + await page.goto(server.EMPTY_PAGE); + const [request] = await Promise.all([ + page.waitForRequest(async request => { + return request.url() === server.PREFIX + '/digits/2.png'; + }), + page.evaluate(() => { + fetch('/digits/1.png'); + fetch('/digits/2.png'); + fetch('/digits/3.png'); + }), + ]); + expect(request.url()).toBe(server.PREFIX + '/digits/2.png'); + }); it('should respect timeout', async () => { const {page, puppeteer} = getTestState();