Skip to content

Capture a whole book page from a test (BL-16799) - #8295

Merged
hatton merged 2 commits into
masterfrom
BL-16799-page-screenshot
Sep 3, 2026
Merged

Capture a whole book page from a test (BL-16799)#8295
hatton merged 2 commits into
masterfrom
BL-16799-page-screenshot

Conversation

@hatton

@hatton hatton commented Sep 3, 2026

Copy link
Copy Markdown
Member

Nothing in the suite could produce an image of a book page, and the obvious CDP
route to one is a trap: Page.captureScreenshot with captureBeyondViewport hangs
in WebView2 with no response and no error, so every ad-hoc script rediscovered
that the hard way.

helpers/screenshot.ts now holds the working pattern once:
Emulation.setDeviceMetricsOverride large enough for the whole element, a
screenshot with a clip, then clearDeviceMetricsOverride, with a timeout on
every CDP request. captureCurrentBookPage does the page in the Edit tab,
captureElement does any element, and readPngSize reads the size back out of the
PNG bytes.

tests/capture-book-page.spec.ts is the test for the helper rather than for a
Bloom behavior: it captures the A5 Portrait cover, which is taller than the
window, and checks the image is a PNG the size of the page. Without it, the
pattern could stop working and nothing would notice. It has no Notion test case
id, because it covers the automation library.

Trims the AUTOMATION-DEBT.md entry "Driver-level CDP footguns that the
automation library must absorb" to the two items that are still not absorbed,
and renames it to say so.

Adds the entry "One test's tab is the next test's starting state": the launched
Bloom is worker-scoped, so this new test leaving the Edit tab open broke
workspace-tabs.spec.ts on its opening sanity check. This test switches back to
the collection tab at its end, and workspace-tabs.spec.ts now says in a comment
why it reads the tab state rather than waiting for it. Neither is enforced by
anything, which is what the entry asks for.

This is one of eleven stacked pull requests (BL-16799)

Each one pays down one entry of src/BloomE2E/AUTOMATION-DEBT.md, and each branches off the one before it. Base: BL-16799-type-in-one-call. Review only this pull request's own commit; the ones below it are reviewed in their own pull requests. The first six change test and tooling code only; the last five also change product code.

  1. BL-16799-automation-scripts — Make the bloom-automation scripts safe to ask for help
  2. BL-16799-vr-collect-failures — Report every failed image comparison in a visual-regression case, not the first
  3. BL-16799-component-tests-in-ci — Run the component-tester Playwright suites nightly
  4. BL-16799-vite-port — Let an e2e run test the working tree's front end
  5. BL-16799-type-in-one-call — Type into a text box in one call, not one key press per character
  6. BL-16799-page-screenshot — Capture a whole book page from a test
  7. BL-16799-toolbox-registration — Register the toolbox tools from one list both callers share
  8. BL-16799-shell-document — Stop a test attaching to a shell document Bloom does not drive
  9. BL-16799-tab-test-ids — Click a workspace tab by a test id, not by its localized label
  10. BL-16799-page-change — Refuse a page change the Edit tab cannot do, and wait before asking
  11. BL-16799-collection-languages — Set a collection's languages through an e2e hook, not by writing XML

Replaces #8276, which did all of this in one pull request.

Verification of the whole stack, at its tip: the C# suite passes (3338 passed, 13 skipped), the front-end vitest suite passes (781 passed, 5 skipped), and the src/BloomE2E suite passes against a Vite dev server on the working tree (36 passed, 0 skipped, 8.2 minutes). Each pull request also has its own type check and lint.

🤖 Generated with Claude Code

Devin review


This change is Reviewable

Nothing in the suite could produce an image of a book page, and the obvious CDP
route to one is a trap: Page.captureScreenshot with captureBeyondViewport hangs
in WebView2 with no response and no error, so every ad-hoc script rediscovered
that the hard way.

helpers/screenshot.ts now holds the working pattern once:
Emulation.setDeviceMetricsOverride large enough for the whole element, a
screenshot with a clip, then clearDeviceMetricsOverride, with a timeout on
every CDP request. captureCurrentBookPage does the page in the Edit tab,
captureElement does any element, and readPngSize reads the size back out of the
PNG bytes.

tests/capture-book-page.spec.ts is the test for the helper rather than for a
Bloom behavior: it captures the A5 Portrait cover, which is taller than the
window, and checks the image is a PNG the size of the page. Without it, the
pattern could stop working and nothing would notice. It has no Notion test case
id, because it covers the automation library.

Trims the AUTOMATION-DEBT.md entry "Driver-level CDP footguns that the
automation library must absorb" to the two items that are still not absorbed,
and renames it to say so.

Adds the entry "One test's tab is the next test's starting state": the launched
Bloom is worker-scoped, so this new test leaving the Edit tab open broke
workspace-tabs.spec.ts on its opening sanity check. This test switches back to
the collection tab at its end, and workspace-tabs.spec.ts now says in a comment
why it reads the tab state rather than waiting for it. Neither is enforced by
anything, which is what the entry asks for.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@hatton
hatton force-pushed the BL-16799-page-screenshot branch from b43610f to fdd2fc8 Compare September 3, 2026 19:40
Master moved while this stack was open, so each branch merges the one below it.
The conflicts were all in src/BloomE2E/AUTOMATION-DEBT.md: master gave the table
of this stack a pull-request column and annotated each promise with its number,
while this branch deletes its own row and replaces or deletes its own promise.
The merge keeps both, taking this branch text where the two describe the same
entry.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BaWw4EHWrbFF2fNJvMJVC8
@hatton

hatton commented Sep 3, 2026

Copy link
Copy Markdown
Member Author

[Claude Opus 5 from Hatton's machine during devin-review]

Consulted Devin on 2026-09-03 22:45 UTC up to commit 78aeddd4e0b94e25c72f8f41bb239fc9d7ea943c.

Base automatically changed from BL-16799-type-in-one-call to master September 3, 2026 23:02
@hatton
hatton merged commit 6144520 into master Sep 3, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant