Skip to content

Commit

Permalink
feat: support promise as return value for page.waitForResponse predic…
Browse files Browse the repository at this point in the history
…ate (#6624)

Co-authored-by: Joni <josalmi@google.com>
  • Loading branch information
mickykebe and Joni committed Nov 25, 2020
1 parent 3354aa7 commit b57f3fc
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 5 deletions.
1 change: 1 addition & 0 deletions docs/api.md
Expand Up @@ -2255,6 +2255,7 @@ return firstRequest.url();
```js
const firstResponse = await page.waitForResponse('https://example.com/resource');
const finalResponse = await page.waitForResponse(response => response.url() === 'https://example.com' && response.status() === 200);
const finalResponse = await page.waitForResponse(async response => { return (await response.text()).includes('<html>') })
return finalResponse.ok();
```

Expand Down
4 changes: 2 additions & 2 deletions src/common/Page.ts
Expand Up @@ -1298,11 +1298,11 @@ export class Page extends EventEmitter {
return helper.waitForEvent(
this._frameManager.networkManager(),
NetworkManagerEmittedEvents.Response,
(response) => {
async (response) => {
if (helper.isString(urlOrPredicate))
return urlOrPredicate === response.url();
if (typeof urlOrPredicate === 'function')
return !!urlOrPredicate(response);
return !!(await urlOrPredicate(response));
return false;
},
timeout,
Expand Down
6 changes: 3 additions & 3 deletions src/common/helper.ts
Expand Up @@ -124,7 +124,7 @@ function isNumber(obj: unknown): obj is number {
async function waitForEvent<T extends any>(
emitter: CommonEventEmitter,
eventName: string | symbol,
predicate: (event: T) => boolean,
predicate: (event: T) => Promise<boolean> | boolean,
timeout: number,
abortPromise: Promise<Error>
): Promise<T> {
Expand All @@ -133,8 +133,8 @@ async function waitForEvent<T extends any>(
resolveCallback = resolve;
rejectCallback = reject;
});
const listener = addEventListener(emitter, eventName, (event) => {
if (!predicate(event)) return;
const listener = addEventListener(emitter, eventName, async (event) => {
if (!(await predicate(event))) return;
resolveCallback(event);
});
if (timeout) {
Expand Down
16 changes: 16 additions & 0 deletions test/page.spec.ts
Expand Up @@ -712,6 +712,22 @@ describe('Page', function () {
.catch((error_) => (error = error_));
expect(error).toBeInstanceOf(puppeteer.errors.TimeoutError);
});
it('should work with async predicate', async () => {
const { page, server } = getTestState();
await page.goto(server.EMPTY_PAGE);
const [response] = await Promise.all([
page.waitForResponse(async (response) => {
console.log(response.url());
return response.url() === server.PREFIX + '/digits/2.png';
}),
page.evaluate(() => {
fetch('/digits/1.png');
fetch('/digits/2.png');
fetch('/digits/3.png');
}),
]);
expect(response.url()).toBe(server.PREFIX + '/digits/2.png');
});
it('should work with no timeout', async () => {
const { page, server } = getTestState();

Expand Down

0 comments on commit b57f3fc

Please sign in to comment.