feat: promote headless page to InteractiveBrowser mid-session #78

Merged
steve merged 1 commits from feature/76-promote-to-interactive into main 2026-02-24 02:29:07 +00:00
Collaborator

Summary

  • Add PromoteToInteractive(Document) (InteractiveBrowser, error) to transfer a live page from scraping mode to interactive mode (e.g. for human captcha solving)
  • Add DemoteToDocument(InteractiveBrowser) (Document, error) to transfer back to scraping mode on the same page
  • Both functions use a detached flag so the original handle's Close() becomes a no-op (page ownership transfers cleanly)
  • Promoted InteractiveBrowser does not own the Playwright infrastructure — only the page — so the original Browser must stay alive

Design

Package-level functions (not interface methods) to avoid breaking changes. Uses type assertion on the concrete *document / *interactiveBrowser types — same pattern as pageEvaluator in readability.go.

Test plan

  • TestPromoteToInteractive_NonPromotable — mock document returns ErrNotPromotable
  • TestPromoteToInteractive_AlreadyDetached — double-promote returns ErrAlreadyDetached
  • TestDemoteToDocument_NonDemotable — mock interactive browser returns ErrNotDemotable
  • TestDemoteToDocument_AlreadyDetached — double-demote returns ErrAlreadyDetached
  • go build ./..., go test ./..., go vet ./... all pass

Closes #76

## Summary - Add `PromoteToInteractive(Document) (InteractiveBrowser, error)` to transfer a live page from scraping mode to interactive mode (e.g. for human captcha solving) - Add `DemoteToDocument(InteractiveBrowser) (Document, error)` to transfer back to scraping mode on the same page - Both functions use a `detached` flag so the original handle's `Close()` becomes a no-op (page ownership transfers cleanly) - Promoted `InteractiveBrowser` does not own the Playwright infrastructure — only the page — so the original `Browser` must stay alive ## Design Package-level functions (not interface methods) to avoid breaking changes. Uses type assertion on the concrete `*document` / `*interactiveBrowser` types — same pattern as `pageEvaluator` in `readability.go`. ## Test plan - [x] `TestPromoteToInteractive_NonPromotable` — mock document returns `ErrNotPromotable` - [x] `TestPromoteToInteractive_AlreadyDetached` — double-promote returns `ErrAlreadyDetached` - [x] `TestDemoteToDocument_NonDemotable` — mock interactive browser returns `ErrNotDemotable` - [x] `TestDemoteToDocument_AlreadyDetached` — double-demote returns `ErrAlreadyDetached` - [x] `go build ./...`, `go test ./...`, `go vet ./...` all pass Closes #76
Claude added 1 commit 2026-02-24 02:27:58 +00:00
feat: add PromoteToInteractive and DemoteToDocument for mid-session page transfer
Some checks failed
CI / build (pull_request) Successful in 29s
CI / test (pull_request) Successful in 36s
CI / vet (pull_request) Failing after 6m18s
e0da88b9b0
Allow transferring ownership of a Playwright page between Document and
InteractiveBrowser modes without tearing down the browser. This enables
handing a live page to a human (e.g. for captcha solving) and resuming
scraping on the same page afterward.

Closes #76

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
steve merged commit d35d144fa2 into main 2026-02-24 02:29:07 +00:00
steve deleted branch feature/76-promote-to-interactive 2026-02-24 02:29:07 +00:00
Sign in to join this conversation.