Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Question]: how can I access async response's body in the predicate? #1545

Open
Yxue-1906 opened this issue Sep 13, 2022 · 2 comments
Open

Comments

@Yxue-1906
Copy link

Your question

I can simply do this with sync api but I have no idea how to with async api;
I've tried code like:

def check(response):
  body_text = response.text()
  # check if it is the response I need

async def foo():
  page = await browser.new_page()
  async with page.expect_response(url_or_predicate=check) as res:
    #other job

but only got error said coroutine returned by response.text() needs await;
if I change check to async function I got another error said check needs await.
what is the correct way accessing response's body with async api?

@rwoll
Copy link
Member

rwoll commented Sep 14, 2022

Based on the impl, it looks like the predicate cannot be an async function today.

As a workaround, you can create and await a Future instead of using the built in page.expect_response for this case:

# set up your listener and future
matched_response_fut = asyncio.Future()
async def is_matching(response: Response):
    body = await response.text()
    if body == "some text you're looking for":
        matched_response_fut.set_result(response)
page.on("response", is_matching)


# take your action(s) that will actually trigger the response
# e.g. navigation, clicking, etc.
# …

# await and use your matched response
response = await matched_response_fut

@319Rin

This comment was marked as off-topic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants