playwright-python icon indicating copy to clipboard operation
playwright-python copied to clipboard

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

Open Yxue-1906 opened this issue 3 years ago • 2 comments

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?

Yxue-1906 avatar Sep 13 '22 01:09 Yxue-1906

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

rwoll avatar Sep 14 '22 20:09 rwoll

python+playwright

①The return value of this function is true

②Write the message you want to print when it fails

assert await ①function_test(),②failed

the function is

async def function_test(): print('Something') return True  

319Rin avatar Nov 10 '22 07:11 319Rin