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

Abierto
#5,501 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
54/100
Tipo de issue
Nueva funcionalidad
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
playwright, python
Área
testing

Línea de trabajo

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.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

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.

Lenguaje dominante
Python
Estrellas
662
Forks
149
Merge medio
6 h 13 min
PR fusionados (30 d)
121

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de MarketSquare/robotframework-browser

Todos los issues de MarketSquare/robotframework-browser

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.