1 package playwright_test
2
3 import (
4 "fmt"
5 "runtime"
6 "testing"
7
8 "github.com/playwright-community/playwright-go"
9 "github.com/stretchr/testify/require"
10 )
11
12 func TestBrowserContextNewPage(t *testing.T) {
13 BeforeEach(t)
14 defer AfterEach(t)
15 require.Equal(t, context.Browser(), browser)
16 }
17
18 func TestBrowserContextNewContext(t *testing.T) {
19 BeforeEach(t)
20 defer AfterEach(t)
21 require.Equal(t, 1, len(browser.Contexts()))
22 context2, err := browser.NewContext()
23 require.NoError(t, err)
24 require.Equal(t, 2, len(browser.Contexts()))
25 require.Equal(t, browser.Contexts()[1], context2)
26 require.Equal(t, context2.Browser(), browser)
27 require.NoError(t, context2.Close())
28 require.Equal(t, 1, len(browser.Contexts()))
29 require.Equal(t, context.Browser(), browser)
30 }
31
32 func TestBrowserContextClose(t *testing.T) {
33 BeforeEach(t)
34 defer AfterEach(t, false)
35 context2, err := browser.NewContext()
36 require.NoError(t, err)
37 require.Equal(t, 2, len(browser.Contexts()))
38 require.Equal(t, context, browser.Contexts()[0])
39 require.Equal(t, context2, browser.Contexts()[1])
40 require.NoError(t, context.Close())
41 require.Equal(t, 1, len(browser.Contexts()))
42 require.NoError(t, context2.Close())
43 require.Equal(t, 0, len(browser.Contexts()))
44 }
45
46 func TestBrowserContextOffline(t *testing.T) {
47 BeforeEach(t)
48 defer AfterEach(t)
49 offline, err := page.Evaluate("window.navigator.onLine")
50 require.NoError(t, err)
51 require.True(t, offline.(bool))
52
53 require.NoError(t, context.SetOffline(true))
54 offline, err = page.Evaluate("window.navigator.onLine")
55 require.NoError(t, err)
56 require.False(t, offline.(bool))
57
58 require.NoError(t, context.SetOffline(false))
59 offline, err = page.Evaluate("window.navigator.onLine")
60 require.NoError(t, err)
61 require.True(t, offline.(bool))
62 }
63
64 func TestBrowserContextSetExtraHTTPHeaders(t *testing.T) {
65 BeforeEach(t)
66 defer AfterEach(t)
67 require.NoError(t, context.SetExtraHTTPHeaders(map[string]string{
68 "extra-http": "42",
69 }))
70 intercepted := make(chan bool, 1)
71 err := page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
72 require.NoError(t, route.Continue())
73 intercepted <- true
74 })
75 require.NoError(t, err)
76 response, err := page.Goto(server.EMPTY_PAGE)
77 require.NoError(t, err)
78 require.True(t, response.Ok())
79 <-intercepted
80 }
81
82 func TestBrowserContextNewCDPSession(t *testing.T) {
83 BeforeEach(t)
84 defer AfterEach(t)
85 cdpSession, err := page.Context().NewCDPSession(page)
86 if isChromium {
87 require.NoError(t, err)
88 require.NoError(t, cdpSession.Detach())
89 } else {
90 require.Error(t, err)
91 }
92 }
93
94 func TestBrowserContextSetGeolocation(t *testing.T) {
95 BeforeEach(t)
96 defer AfterEach(t)
97 require.NoError(t, context.GrantPermissions([]string{"geolocation"}))
98 _, err := page.Goto(server.EMPTY_PAGE)
99 require.NoError(t, err)
100 require.NoError(t, context.SetGeolocation(&playwright.SetGeolocationOptions{
101 Longitude: 10,
102 Latitude: 10,
103 }))
104 geolocation, err := page.Evaluate(`() => new Promise(resolve => navigator.geolocation.getCurrentPosition(position => {
105 resolve({latitude: position.coords.latitude, longitude: position.coords.longitude});
106 }))`)
107 require.NoError(t, err)
108 require.Equal(t, geolocation, map[string]interface{}{
109 "latitude": 10,
110 "longitude": 10,
111 })
112 require.NoError(t, context.ClearPermissions())
113 }
114
115 func TestBrowserContextAddCookies(t *testing.T) {
116 BeforeEach(t)
117 defer AfterEach(t)
118 _, err := page.Goto(server.EMPTY_PAGE)
119 require.NoError(t, err)
120 require.NoError(t, context.AddCookies(playwright.BrowserContextAddCookiesOptionsCookies{
121 URL: playwright.String(server.EMPTY_PAGE),
122 Name: playwright.String("password"),
123 Value: playwright.String("123456"),
124 }))
125 cookie, err := page.Evaluate("() => document.cookie")
126 require.NoError(t, err)
127 require.Equal(t, "password=123456", cookie)
128
129 cookies, err := context.Cookies()
130 require.NoError(t, err)
131 sameSite := playwright.SameSiteAttributeNone
132 if isChromium {
133 sameSite = playwright.SameSiteAttributeLax
134 }
135 require.Equal(t, []*playwright.BrowserContextCookiesResult{
136 {
137 Name: "password",
138 Value: "123456",
139 Domain: "127.0.0.1",
140 Path: "/",
141 Expires: -1,
142
143 HttpOnly: false,
144 Secure: false,
145 SameSite: *sameSite,
146 },
147 }, cookies)
148
149 require.NoError(t, page.Context().ClearCookies())
150 _, err = page.Reload()
151 require.NoError(t, err)
152 cookie, err = page.Evaluate("() => document.cookie")
153 require.NoError(t, err)
154 require.Equal(t, "", cookie)
155 }
156
157 func TestBrowserContextAddInitScript(t *testing.T) {
158 BeforeEach(t)
159 defer AfterEach(t)
160 require.NoError(t, context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
161 Script: playwright.String(`window['injected'] = 123;`),
162 }))
163 _, err := page.Goto(server.PREFIX + "/tamperable.html")
164 require.NoError(t, err)
165 result, err := page.Evaluate(`() => window['result']`)
166 require.NoError(t, err)
167 require.Equal(t, 123, result)
168 }
169
170 func TestBrowserContextAddInitScriptWithPath(t *testing.T) {
171 BeforeEach(t)
172 defer AfterEach(t)
173 require.NoError(t, context.AddInitScript(playwright.BrowserContextAddInitScriptOptions{
174 Path: playwright.String(Asset("injectedfile.js")),
175 }))
176 _, err := page.Goto(server.PREFIX + "/tamperable.html")
177 require.NoError(t, err)
178 result, err := page.Evaluate(`() => window['result']`)
179 require.NoError(t, err)
180 require.Equal(t, 123, result)
181 }
182
183 func TestBrowserContextWindowOpenshouldUseParentTabContext(t *testing.T) {
184 BeforeEach(t)
185 defer AfterEach(t)
186 _, err := page.Goto(server.EMPTY_PAGE)
187 require.NoError(t, err)
188 popupEvent, err := page.ExpectEvent("popup", func() error {
189 _, err := page.Evaluate("url => window.open(url)", server.EMPTY_PAGE)
190 return err
191 })
192 require.NoError(t, err)
193 popup := popupEvent.(playwright.Page)
194 require.Equal(t, popup.Context(), context)
195 }
196
197 func TestBrowserContextUnrouteShouldWork(t *testing.T) {
198 BeforeEach(t)
199 defer AfterEach(t)
200
201 intercepted := []int{}
202 handler1 := func(route playwright.Route, request playwright.Request) {
203 intercepted = append(intercepted, 1)
204 require.NoError(t, route.Continue())
205 }
206 require.NoError(t, context.Route("**/empty.html", handler1))
207 require.NoError(t, context.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
208 intercepted = append(intercepted, 2)
209 require.NoError(t, route.Continue())
210 }))
211 require.NoError(t, context.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
212 intercepted = append(intercepted, 3)
213 require.NoError(t, route.Continue())
214 }))
215 require.NoError(t, context.Route("**/*", func(route playwright.Route, request playwright.Request) {
216 intercepted = append(intercepted, 4)
217 require.NoError(t, route.Continue())
218 }))
219
220 _, err := page.Goto(server.EMPTY_PAGE)
221 require.NoError(t, err)
222 require.Equal(t, []int{1}, intercepted)
223
224 intercepted = []int{}
225 require.NoError(t, context.Unroute("**/empty.html", handler1))
226 _, err = page.Goto(server.EMPTY_PAGE)
227 require.NoError(t, err)
228 require.Equal(t, []int{2}, intercepted)
229
230 intercepted = []int{}
231 require.NoError(t, context.Unroute("**/empty.html"))
232 _, err = page.Goto(server.EMPTY_PAGE)
233 require.NoError(t, err)
234 require.Equal(t, []int{4}, intercepted)
235 }
236
237 func TestBrowserContextShouldReturnBackgroundPage(t *testing.T) {
238 BeforeEach(t)
239 defer AfterEach(t)
240 if !isChromium {
241 t.Skip()
242 }
243 if runtime.GOOS == "windows" {
244 t.Skip("flaky on windows")
245 }
246 extensionPath := Asset("simple-extension")
247 context, err := browserType.LaunchPersistentContext(
248 t.TempDir(),
249 playwright.BrowserTypeLaunchPersistentContextOptions{
250 Headless: playwright.Bool(false),
251 Args: []string{
252 fmt.Sprintf("--disable-extensions-except=%s", extensionPath),
253 fmt.Sprintf("--load-extension=%s", extensionPath),
254 },
255 },
256 )
257 require.NoError(t, err)
258 var page playwright.Page
259 if len(context.BackgroundPages()) == 1 {
260 page = context.BackgroundPages()[0]
261 } else {
262 page = context.WaitForEvent("backgroundpage").(playwright.Page)
263 }
264 require.NotNil(t, page)
265 require.NotContains(t, context.Pages(), page)
266 require.Contains(t, context.BackgroundPages(), page)
267 context.Close()
268 require.Len(t, context.BackgroundPages(), 0)
269 require.Len(t, context.Pages(), 0)
270 }
271
View as plain text