You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Playwright的page.evaluate()后执行上下文销毁问题求助

问题分析与解决办法

核心误区

你对page.expect_navigation()的理解存在一处关键偏差:这个上下文管理器仅负责监听即将发生的导航事件,但无法阻止page.evaluate()在导航触发后被中断。当startAuthFlow('authFlow')执行时,如果它立即触发了页面跳转(比如同步发起导航请求),当前页面的执行上下文会被立刻销毁,而page.evaluate()此时可能还未完成执行,就会抛出Execution context was destroyed错误——这就是20%概率报错的根源。

针对性解决方法

1. 模拟真实用户点击(推荐方案)

如果startAuthFlow是绑定在某DOM元素的点击事件上,直接用Playwright模拟点击元素,而非手动执行JS。Playwright的原生交互操作会自动协调操作与导航的时序,稳定性远高于手动执行JS:

# 定位到触发认证流程的元素(替换为实际选择器)
auth_trigger = page.locator("[data-action='auth-flow']")
with page.expect_navigation(wait_until="domcontentloaded", url=targetUrl):
    auth_trigger.click()

2. 分离导航监听与JS执行

如果必须手动调用startAuthFlow,可以提前启动导航监听任务,再异步执行JS,避免上下文被导航中断:

# 先启动导航监听任务
navigation_task = page.wait_for_navigation(wait_until="domcontentloaded", url=targetUrl)
# 执行JS(不阻塞等待执行完成)
page.evaluate(r"startAuthFlow('authFlow');")
# 等待导航完成(同步API用result(),异步API用await)
navigation_task.result()

3. 调整导航等待策略

如果目标页面DOM加载完成后仍有后续网络请求,可以将wait_until参数改为"load"或"networkidle",确保导航完全稳定后再结束等待,降低上下文提前销毁的概率:

with page.expect_navigation(wait_until="networkidle", url=targetUrl):
    page.evaluate(r"startAuthFlow('authFlow');")

关键总结

page.expect_navigation()只是监听导航事件,无法保证page.evaluate()在导航前完成执行。最稳定的方案是模拟真实用户交互,让Playwright自动处理时序;若必须执行JS,需通过分离监听与执行的方式避免上下文被中断。

内容的提问来源于stack exchange,提问作者Daniel Barbera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:05:07