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

オープン
#5,501 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

メンテナーはふだん 1 日以内に返信

まだ誰も着手していません。

評価

難易度
4/5
見積もり時間
3〜5日
初心者へのやさしさ
54/100
issue の種類
機能追加
明瞭さ
明確に書かれている
活発さ
活発
技術スタック
playwright, python
領域
testing

調査の方向性

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.

索引モデルが issue の本文から書いたものです。

説明

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.

主要言語
Python
スター
662
フォーク
149
平均マージ
6時間 13分
マージ済み PR(30日)
121

環境構築

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

MarketSquare/robotframework-browser のほかの issue

MarketSquare/robotframework-browser の issue をすべて見る

似ている issue

Python の issue をもっと見る

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。