Playwright Python无法捕获API响应,请求技术支持
Playwright Python 等待API响应超时问题解决
问题根源
- 响应访问时机错误:在
expect_response上下文块中提前访问response.value,此时响应可能还未完成,超时后触发嵌套的InvalidStateError。 - URL匹配不精确:
**.algolia.net/**的通配符模式可能未匹配到实际请求的URL,Playwright的响应匹配对通配符的使用有特定要求。 - 元素交互时机过早:搜索框未完全加载就绪就进行输入操作,导致请求未正常触发。
修复后的代码
from playwright.sync_api import sync_playwright import json with sync_playwright() as p: browser = p.chromium.launch(headless=False) page = browser.new_page() page.goto("https://playwright.dev/") page.get_by_role('button', name='Search').click() # 确保搜索框完全可交互 search_box = page.get_by_placeholder('Search docs') search_box.wait_for() # 使用Lambda表达式精确匹配Algolia的POST请求 with page.expect_response(lambda res: "algolia.net" in res.url and res.request.method == "POST") as res_info: search_box.fill('A') # 等待响应完成后获取响应对象 response = res_info.value print(response.json()) print(json.dumps(response.json(), indent=2)) browser.close()
核心修改说明
- 精确匹配响应:用Lambda表达式替代简单通配符,同时校验请求方法为POST,确保只匹配目标搜索请求,避免误匹配其他无关请求。
- 等待元素就绪:添加
search_box.wait_for(),确保搜索框加载完成后再触发输入操作,保证请求正常发起。 - 正确获取响应:先通过
res_info.value获取已完成的响应对象,再调用json()解析内容,避免在等待过程中提前访问导致状态错误。 - 释放资源:添加
browser.close(),确保浏览器实例正确关闭。
额外排查技巧
- 打开浏览器开发者工具的Network面板,查看实际请求的URL和方法,调整匹配规则。
- 若仍超时,可增加超时时间:
page.expect_response(..., timeout=60000)(单位:毫秒)。 - 禁用浏览器扩展或用无痕模式启动:
browser = p.chromium.launch(headless=False, args=["--incognito"]),排除扩展拦截请求的可能。
内容的提问来源于stack exchange,提问作者Stephen Graham
相关产品推荐
相关产品推荐

