fix: navigate 后立即推一帧,静态页开流不再等重绘

screencast 帧只在重绘时来,页面可能在 startScreencast 之前
就已画好——静态页于是开流后一直无画面,直到下一次重绘。
navigate 后用 CDP captureScreenshot 抓一张当前视口塞进帧
队列,泵在下一轮就把桥帧文件写出来;泵跳过空 session 的
ack(eager 帧没有可确认的 screencast 帧)。失败静默,
screencast 本身仍照常流动。
This commit is contained in:
host committed 2026-10-30 13:14:38 +08:00
1 parent b844624c96
commit 2d840a6c37
2 files changed
+62 -2

No files matched your search

+33
View File
@@ -59,12 +59,18 @@ class _FakeCDP:
def __init__(self):
self.sent = []
self.handlers = {}
self.fail_capture = False
def on(self, event, handler):
self.handlers[event] = handler
def send(self, method, params=None):
self.sent.append((method, params or {}))
if method == "Page.captureScreenshot":
if self.fail_capture:
raise RuntimeError("capture boom")
return {"data": "EAGERDATA"}
return None
class _FakeContext:
@@ -259,6 +265,33 @@ class BrowserTest(unittest.TestCase):
self.assertIn(("Page.screencastFrameAck", {"sessionId": "s1"}),
[(m, p) for m, p in self.page.cdp.sent])
def test_navigate_pushes_eager_frame_without_ack(self):
from playwright_remote import SimpleQueue
sink = SimpleQueue()
self.browser.set_frame_sink(sink)
result = self.browser.navigate("https://example.com")
self.assertTrue(result["ok"])
self.assertIn(("Page.captureScreenshot",
{"format": "jpeg", "quality": 60}),
[(m, p) for m, p in self.page.cdp.sent])
frame = self.browser.pump_screencast()
self.assertEqual(frame, "EAGERDATA")
acks = [(m, p) for m, p in self.page.cdp.sent
if m == "Page.screencastFrameAck"]
self.assertEqual(acks, [])
def test_navigate_survives_failed_eager_capture(self):
from playwright_remote import SimpleQueue
sink = SimpleQueue()
self.browser.set_frame_sink(sink)
self.page.cdp.fail_capture = True
try:
result = self.browser.navigate("https://example.com")
finally:
self.page.cdp.fail_capture = False
self.assertTrue(result["ok"])
self.assertEqual(self.browser.pump_screencast(), "")
def test_live_shot_writes_fixed_file_and_status(self):
self.browser.navigate("https://example.com")
out = self.browser.live_shot()