如何通过Playwright Python的page.on("response")获取返回值
解决Playwright Python捕获响应并传递结果的问题
原代码中,page.on("response")的回调函数返回值无法直接传递给run函数,因为事件回调是异步触发的。可以通过以下方式实现需求:
方法一:使用可变对象存储响应结果
利用列表(可变对象)在回调函数中存储符合条件的响应数据,后续在run函数中读取该数据:
from playwright.sync_api import Playwright, sync_playwright def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(channel="chrome", headless=False) context = browser.new_context() page = context.new_page() # 定义可变对象存储响应结果 response_data = [] def handle_response(response): if "api/list" in response.url and response.status == 200: # 将结果存入列表 response_data.append(response.json()) page.on("response", handle_response) page.goto("https://www.example.com/") # 等待页面操作完成,确保响应已被捕获(可根据实际场景调整等待逻辑) page.wait_for_load_state("networkidle") # 使用捕获到的响应数据进行后续操作 if response_data: print("捕获到的响应数据:", response_data[0]) # 这里添加你的业务逻辑 context.close() browser.close() with sync_playwright() as playwright: run(playwright)
方法二:使用page.wait_for_response更精准捕获
如果明确要等待某个特定响应,推荐使用page.wait_for_response,它会直接返回匹配的响应对象,无需额外回调:
from playwright.sync_api import Playwright, sync_playwright def run(playwright: Playwright) -> None: browser = playwright.chromium.launch(channel="chrome", headless=False) context = browser.new_context() page = context.new_page() # 启动页面操作的同时等待响应 with page.expect_response(lambda response: "api/list" in response.url and response.status == 200) as response_info: page.goto("https://www.example.com/") # 获取响应数据 response = response_info.value data = response.json() # 使用响应数据进行后续操作 print("捕获到的响应数据:", data) # 这里添加你的业务逻辑 context.close() browser.close() with sync_playwright() as playwright: run(playwright)
关键说明
- 方法一适合需要监听多个响应的场景,通过回调收集所有符合条件的结果。
- 方法二更高效,直接等待目标响应,避免不必要的监听,适合明确目标响应的场景。
内容的提问来源于stack exchange,提问作者maruume
相关产品推荐
相关产品推荐

