Add `opfs=` argument to `Save Storage State`

Aperta
#5,501 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
54/100
Tipo di issue
Funzionalità
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
playwright, python
Ambito
testing

Direzione di ricerca

Read Browser/keywords/playwright_state.py methods save_storage_state and _save_storage_state, then trace the request through protobuf/playwright.proto and node/playwright-wrapper/playwright-state.ts. Add the named opfs option and pass it to Playwright's storageState() call, update the Set Storage State docstring, and add OPFS cases to atest/test/01_Browser_Management/storage_state.robot for save, restore through both APIs, and saving without OPFS; skip or tag ephemeral WebKit contexts.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Use case

Save Storage State saves cookies and local storage, and with indexedDB=True and credentials=True also IndexedDB and virtual WebAuthn credentials (#5117). Some applications keep their data in the origin private file system (OPFS) instead: offline-first apps, apps that run SQLite in the browser (SQLite WASM persists to OPFS), and editors that store drafts as files. For those, the saved state misses the data the app needs, and the "set up once, reuse in every test" pattern does not work.

Playwright 1.63 added an opfs option to browserContext.storageState(). The state file then carries the OPFS entries of each origin, and both browser.newContext({ storageState }) and browserContext.setStorageState() restore them.

Proposed keyword / arguments

Save Storage State path=None * indexedDB=False credentials=False opfs=False

  • opfs: named-only, defaults to False. Also saves the origin private file system of every origin in the state.
*** Test Cases ***
Prepare Offline Data Once
    New Context
    New Page    ${APP_URL}
    Click    id=download-for-offline
    Get Text    id=offline-status    ==    Ready
    Save Storage State    ${CURDIR}/state/offline.json    opfs=True

Use Offline Data
    New Context    storageState=${CURDIR}/state/offline.json
    New Page    ${APP_URL}
    Get Text    id=offline-status    ==    Ready

New Context storageState= and Set Storage State need no new argument. They restore whatever the file contains.

Playwright API

Checked with Playwright 1.65.0 and Chromium: with opfs: true each origin in the state gets an opfs list of {path, type: "directory"} and {path, type: "file", base64} entries. A new context created with that state, and an existing context after setStorageState(), both read the file back. Without opfs: true no opfs key is written.

Implementation notes

All references are to upstream main (5e350998).

  • protobuf/playwright.proto:137-141 Request.StorageState: add bool opfs = 4;. The rpc stays SaveStorageState (:713).
  • node/playwright-wrapper/playwright-state.ts:1384-1388 saveStorageState: pass opfs: request.opfs to context.c.storageState(), next to indexedDB and credentials.
  • Browser/keywords/playwright_state.py:2106-2112 save_storage_state: add named-only opfs: bool = False; pass it through _save_storage_state (:2176-2185) into Request().StorageState(...). Docstring: one line in Arguments, plus the WebKit limitation. New Context is an ephemeral context, so in WebKit opfs=True works only after New Persistent Context.
  • Browser/keywords/playwright_state.py:2196-2197 set_storage_state docstring: "Clears the cookies, local storage, IndexedDB and virtual WebAuthn credentials" should name OPFS too. Playwright clears it on every setStorageState(), also when the file has no opfs entries: in the check above, restoring a state saved without opfs removed the file the page had written. That is Playwright's behaviour since 1.63 and already happens with the current keyword, so the docstring fix stands on its own even without opfs=.
  • Set Storage State has IndexedDB-specific handling (reload_pages, indexedDbOrigins at playwright-state.ts:1392-1402, the open-connection probe at :1412-1432) because deleting an IndexedDB database waits for open connections. Playwright clears OPFS with removeEntry(name, { recursive: true }) and writes files with createWritable(). I have not found or tested a similar blocking case for OPFS. A file locked by a FileSystemSyncAccessHandle in a worker might make the clear fail instead of hang; worth one acceptance test before deciding whether reload_pages needs to cover OPFS origins. Until then, no change there.
  • Tests: atest/test/01_Browser_Management/storage_state.robot has the IndexedDB cases as Evaluate JavaScript snippets in its Variables (:9-14). Add matching OPFS write and read snippets and test: save with opfs=True, restore with New Context storageState=, restore with Set Storage State, and save without opfs leaves no opfs key in the file. Skip or tag the WebKit case, since the suite runs in ephemeral contexts.

Backwards compatibility

Additive, named-only argument that defaults to False. State files written without it are unchanged. The docstring change to Set Storage State documents behaviour that is already there.

Lingua principale
Python
Stelle
662
Fork
149
Merge medio
6h 13m
PR unite (30g)
121

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di MarketSquare/robotframework-browser

Tutte le issue di MarketSquare/robotframework-browser

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.