Skip to content

Commit a6f1d21

Browse files
authored
feat: StorageState can convert to OptionalStorageState (#418) (close #414)
1 parent 98ab5a8 commit a6f1d21

File tree

2 files changed

+74
-0
lines changed

2 files changed

+74
-0
lines changed

tests/browser_context_storage_state_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,52 @@ func TestBrowserContextStorageStateRoundTripThroughTheFile(t *testing.T) {
144144
require.NoError(t, err)
145145
require.Equal(t, map[string]interface{}{"name1": "value1"}, localStorage)
146146
}
147+
148+
func TestBrowserContextStorageStateRoundTripThroughConvert(t *testing.T) {
149+
BeforeEach(t)
150+
defer AfterEach(t)
151+
page1, err := context.NewPage()
152+
require.NoError(t, err)
153+
defer page1.Close()
154+
require.NoError(t, page1.Route("**/*", func(route playwright.Route) {
155+
require.NoError(t, route.Fulfill(playwright.RouteFulfillOptions{
156+
Body: "<html></html>",
157+
}))
158+
}))
159+
_, err = page1.Goto("https://www.example.com")
160+
require.NoError(t, err)
161+
_, err = page1.Evaluate(`
162+
() => {
163+
localStorage["name1"] = "value1"
164+
document.cookie = "username=John Doe"
165+
return document.cookie
166+
}
167+
`)
168+
require.NoError(t, err)
169+
170+
storageState, err := context.StorageState()
171+
require.NoError(t, err)
172+
173+
context2, err := browser.NewContext(
174+
playwright.BrowserNewContextOptions{
175+
StorageState: storageState.ToOptionalStorageState(),
176+
})
177+
require.NoError(t, err)
178+
defer context2.Close()
179+
page2, err := context2.NewPage()
180+
require.NoError(t, err)
181+
defer page2.Close()
182+
require.NoError(t, page2.Route("**/*", func(route playwright.Route) {
183+
require.NoError(t, route.Fulfill(playwright.RouteFulfillOptions{
184+
Body: "<html></html>",
185+
}))
186+
}))
187+
_, err = page2.Goto("https://www.example.com")
188+
require.NoError(t, err)
189+
cookie, err := page2.Evaluate("document.cookie")
190+
require.NoError(t, err)
191+
require.Equal(t, "username=John Doe", cookie)
192+
localStorage, err := page2.Evaluate("window.localStorage")
193+
require.NoError(t, err)
194+
require.Equal(t, map[string]interface{}{"name1": "value1"}, localStorage)
195+
}

type_helpers.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,28 @@ func IntSlice(v ...int) *[]int {
4545
o = append(o, v...)
4646
return &o
4747
}
48+
49+
// ToOptionalStorageState converts StorageState to OptionalStorageState for use directly in [Browser.NewContext]
50+
func (s StorageState) ToOptionalStorageState() *OptionalStorageState {
51+
cookies := make([]OptionalCookie, len(s.Cookies))
52+
for i, c := range s.Cookies {
53+
cookies[i] = c.ToOptionalCookie()
54+
}
55+
return &OptionalStorageState{
56+
Origins: s.Origins,
57+
Cookies: cookies,
58+
}
59+
}
60+
61+
func (c Cookie) ToOptionalCookie() OptionalCookie {
62+
return OptionalCookie{
63+
Name: c.Name,
64+
Value: c.Value,
65+
Domain: String(c.Domain),
66+
Path: String(c.Path),
67+
Expires: Float(c.Expires),
68+
HttpOnly: Bool(c.HttpOnly),
69+
Secure: Bool(c.Secure),
70+
SameSite: c.SameSite,
71+
}
72+
}

0 commit comments

Comments
 (0)