1 package playwright_test
2
3 import (
4 "errors"
5 "fmt"
6 "io/ioutil"
7 "net/http"
8 "os"
9 "path/filepath"
10 "regexp"
11 "strconv"
12 "strings"
13 "testing"
14 "time"
15
16 "github.com/h2non/filetype"
17 "github.com/playwright-community/playwright-go"
18 "github.com/stretchr/testify/require"
19 )
20
21 func TestPageURL(t *testing.T) {
22 BeforeEach(t)
23 defer AfterEach(t)
24 require.Equal(t, "about:blank", page.URL())
25 _, err := page.Goto("https://example.com")
26 require.NoError(t, err)
27 require.Equal(t, "https://example.com/", page.URL())
28 require.Equal(t, context, page.Context())
29 require.Equal(t, 1, len(page.Frames()))
30 }
31
32 func TestPageSetContent(t *testing.T) {
33 BeforeEach(t)
34 defer AfterEach(t)
35 require.NoError(t, page.SetContent("<h1>foo</h1>",
36 playwright.PageSetContentOptions{
37 WaitUntil: playwright.WaitUntilStateNetworkidle,
38 }))
39 content, err := page.Content()
40 require.NoError(t, err)
41 require.Equal(t, content, "<html><head></head><body><h1>foo</h1></body></html>")
42 }
43
44 func TestPageScreenshot(t *testing.T) {
45 BeforeEach(t)
46 defer AfterEach(t)
47
48 require.NoError(t, page.SetContent("<h1>foobar</h1>"))
49 tmpfile, err := ioutil.TempDir("", "screenshot")
50 require.NoError(t, err)
51 screenshotPath := filepath.Join(tmpfile, "image.png")
52 screenshot, err := page.Screenshot()
53 require.NoError(t, err)
54 require.True(t, filetype.IsImage(screenshot))
55 require.Greater(t, len(screenshot), 50)
56
57 screenshot, err = page.Screenshot(playwright.PageScreenshotOptions{
58 Path: playwright.String(screenshotPath),
59 })
60 require.NoError(t, err)
61 require.True(t, filetype.IsImage(screenshot))
62 require.Greater(t, len(screenshot), 50)
63
64 _, err = os.Stat(screenshotPath)
65 require.NoError(t, err)
66 }
67
68 func TestPagePDF(t *testing.T) {
69 BeforeEach(t)
70 defer AfterEach(t)
71 if !isChromium {
72 t.Skip("Skipping")
73 }
74 require.NoError(t, page.SetContent("<h1>foobar</h1>"))
75 tmpfile, err := ioutil.TempDir("", "pdf")
76 require.NoError(t, err)
77 screenshotPath := filepath.Join(tmpfile, "image.png")
78 screenshot, err := page.PDF()
79 require.NoError(t, err)
80 require.Equal(t, "application/pdf", http.DetectContentType(screenshot))
81 require.Greater(t, len(screenshot), 50)
82
83 screenshot, err = page.PDF(playwright.PagePdfOptions{
84 Path: playwright.String(screenshotPath),
85 })
86 require.NoError(t, err)
87 require.Equal(t, "application/pdf", http.DetectContentType(screenshot))
88 require.Greater(t, len(screenshot), 50)
89
90 _, err = os.Stat(screenshotPath)
91 require.NoError(t, err)
92 }
93
94 func TestPageQuerySelector(t *testing.T) {
95 BeforeEach(t)
96 defer AfterEach(t)
97 require.NoError(t, page.SetContent(`<div id="one">
98 <span id="two">
99 <div id="three">
100 <span id="four">
101 foobar
102 </span>
103 </div>
104 </span>
105 </div>`))
106 one, err := page.QuerySelector("div#one")
107 require.NoError(t, err)
108 two, err := one.QuerySelector("span#two")
109 require.NoError(t, err)
110 three, err := two.QuerySelector("div#three")
111 require.NoError(t, err)
112 four, err := three.QuerySelector("span#four")
113 require.NoError(t, err)
114 textContent, err := four.TextContent()
115 require.NoError(t, err)
116 require.Equal(t, strings.TrimSpace(textContent), "foobar")
117 }
118
119 func TestPageQuerySelectorAll(t *testing.T) {
120 BeforeEach(t)
121 defer AfterEach(t)
122 require.NoError(t, page.SetContent(`
123 <div class="foo">0</div>
124 <div class="foo">1</div>
125 <div class="foo">2</div>
126 `))
127 elements, err := page.QuerySelectorAll("div.foo")
128 require.NoError(t, err)
129 require.Equal(t, 3, len(elements))
130 for i := 0; i < 3; i++ {
131 textContent, err := elements[i].TextContent()
132 require.NoError(t, err)
133 require.Equal(t, strconv.Itoa(i), textContent)
134 }
135 }
136
137 func TestPageEvaluate(t *testing.T) {
138 BeforeEach(t)
139 defer AfterEach(t)
140 val, err := page.Evaluate(`() => 123`)
141 require.NoError(t, err)
142 require.Equal(t, val, 123)
143 }
144
145 func TestPageEvalOnSelectorAll(t *testing.T) {
146 BeforeEach(t)
147 defer AfterEach(t)
148 err := page.SetContent(`
149 <div class="foo">1</div>
150 <div class="foo">2</div>
151 <div class="foo">3</div>
152 `)
153 require.NoError(t, err)
154 val, err := page.EvalOnSelectorAll(".foo", `(elements) => elements.map(el => el.textContent)`)
155 require.NoError(t, err)
156 require.Equal(t, val, []interface{}([]interface{}{"1", "2", "3"}))
157 }
158
159 func TestPageEvalOnSelector(t *testing.T) {
160 BeforeEach(t)
161 defer AfterEach(t)
162 err := page.SetContent(`
163 <div class="foo">bar</div>
164 `)
165 require.NoError(t, err)
166 val, err := page.EvalOnSelector(".foo", `(element) => element.textContent`)
167 require.NoError(t, err)
168 require.Equal(t, val, "bar")
169 }
170
171 func TestPageExpectWorker(t *testing.T) {
172 BeforeEach(t)
173 defer AfterEach(t)
174 worker, err := page.ExpectWorker(func() error {
175 _, err := page.Goto(server.PREFIX + "/worker/worker.html")
176 return err
177 })
178 require.NoError(t, err)
179 require.Equal(t, 1, len(page.Workers()))
180 require.Equal(t, worker, page.Workers()[0])
181 worker = page.Workers()[0]
182 require.Contains(t, worker.URL(), "worker.js")
183 res, err := worker.Evaluate(`() => self["workerFunction"]()`)
184 require.NoError(t, err)
185 require.Equal(t, "worker function result", res)
186 _, err = page.Goto(server.EMPTY_PAGE)
187 require.NoError(t, err)
188 require.Equal(t, 0, len(page.Workers()))
189 }
190
191 func TestPageExpectRequest(t *testing.T) {
192 BeforeEach(t)
193 defer AfterEach(t)
194 request, err := page.ExpectRequest("**/*", func() error {
195 _, err := page.Goto(server.EMPTY_PAGE)
196 return err
197 })
198 require.NoError(t, err)
199 require.Equal(t, server.EMPTY_PAGE, request.URL())
200 require.Equal(t, "document", request.ResourceType())
201 require.Equal(t, "GET", request.Method())
202 }
203
204 func TestPageExpectRequestRegexp(t *testing.T) {
205 BeforeEach(t)
206 defer AfterEach(t)
207 request, err := page.ExpectRequest(regexp.MustCompile(".*/empty.html"), func() error {
208 _, err := page.Goto(server.EMPTY_PAGE)
209 return err
210 })
211 require.NoError(t, err)
212 require.Equal(t, server.EMPTY_PAGE, request.URL())
213 require.Equal(t, "document", request.ResourceType())
214 require.Equal(t, "GET", request.Method())
215 }
216
217 func TestPageExpectRequestFunc(t *testing.T) {
218 BeforeEach(t)
219 defer AfterEach(t)
220 request, err := page.ExpectRequest(func(url string) bool {
221 return strings.HasSuffix(url, "empty.html")
222 }, func() error {
223 _, err := page.Goto(server.EMPTY_PAGE)
224 return err
225 })
226 require.NoError(t, err)
227 require.Equal(t, server.EMPTY_PAGE, request.URL())
228 require.Equal(t, "document", request.ResourceType())
229 require.Equal(t, "GET", request.Method())
230 }
231
232 func TestPageExpectResponse(t *testing.T) {
233 BeforeEach(t)
234 defer AfterEach(t)
235 response, err := page.ExpectResponse("**/*", func() error {
236 _, err := page.Goto(server.EMPTY_PAGE)
237 return err
238 })
239 require.NoError(t, err)
240 require.Equal(t, server.EMPTY_PAGE, response.URL())
241 require.True(t, response.Ok())
242 require.Equal(t, 200, response.Status())
243 require.Equal(t, "OK", response.StatusText())
244 }
245
246 func TestPageExpectPopup(t *testing.T) {
247 BeforeEach(t)
248 defer AfterEach(t)
249 _, err := page.Goto(server.EMPTY_PAGE)
250 require.NoError(t, err)
251 popup, err := page.ExpectPopup(func() error {
252 _, err := page.Evaluate(`window._popup = window.open(document.location.href)`)
253 return err
254 })
255 require.NoError(t, err)
256 require.Equal(t, popup.URL(), server.EMPTY_PAGE)
257 }
258 func TestPageExpectNavigation(t *testing.T) {
259 t.Skip()
260 BeforeEach(t)
261 defer AfterEach(t)
262 }
263
264 func TestPageExpectLoadState(t *testing.T) {
265 t.Skip()
266 BeforeEach(t)
267 defer AfterEach(t)
268 }
269
270 func TestPageExpectFileChooser(t *testing.T) {
271 t.Skip()
272 BeforeEach(t)
273 defer AfterEach(t)
274 }
275
276 func TestPageExpectDialog(t *testing.T) {
277 t.Skip()
278 BeforeEach(t)
279 defer AfterEach(t)
280 }
281
282 func TestPageExpectConsoleMessage(t *testing.T) {
283 BeforeEach(t)
284 defer AfterEach(t)
285 message, err := page.ExpectConsoleMessage(func() error {
286 _, err := page.Evaluate(`console.log(123, "abc")`)
287 return err
288 })
289 require.NoError(t, err)
290 require.Equal(t, message.Text(), "123 abc")
291 }
292
293 func TestPageExpectEvent(t *testing.T) {
294 t.Skip()
295 BeforeEach(t)
296 defer AfterEach(t)
297 }
298
299 func TestPageOpener(t *testing.T) {
300 BeforeEach(t)
301 defer AfterEach(t)
302 eventPage, err := context.ExpectEvent("page", func() error {
303 _, err := page.Goto(server.PREFIX + "/popup/window-open.html")
304 return err
305 })
306 require.NoError(t, err)
307 popup := eventPage.(playwright.Page)
308
309 opener, err := popup.Opener()
310 require.NoError(t, err)
311 require.Equal(t, opener, page)
312
313 opener, err = page.Opener()
314 require.NoError(t, err)
315 require.Nil(t, opener)
316 }
317
318 func TestPageTitle(t *testing.T) {
319 BeforeEach(t)
320 defer AfterEach(t)
321 require.NoError(t, page.SetContent(`<title>abc</title>`))
322 title, err := page.Title()
323 require.NoError(t, err)
324 require.Equal(t, "abc", title)
325 }
326
327 func TestPageWaitForSelector(t *testing.T) {
328 BeforeEach(t)
329 defer AfterEach(t)
330 require.NoError(t, page.SetContent(`<h1>myElement</h1>`))
331 element, err := page.WaitForSelector("text=myElement")
332 require.NoError(t, err)
333 textContent, err := element.TextContent()
334 require.NoError(t, err)
335 require.Equal(t, "myElement", textContent)
336
337 _, err = page.WaitForSelector("h1")
338 require.NoError(t, err)
339 }
340
341 func TestPageDispatchEvent(t *testing.T) {
342 BeforeEach(t)
343 defer AfterEach(t)
344 _, err := page.Goto(server.PREFIX + "/input/button.html")
345 require.NoError(t, err)
346 require.NoError(t, page.DispatchEvent("button", "click"))
347 clicked, err := page.Evaluate("() => result")
348 require.NoError(t, err)
349 require.Equal(t, "Clicked", clicked)
350 }
351
352 func TestPageReload(t *testing.T) {
353 BeforeEach(t)
354 defer AfterEach(t)
355 _, err := page.Goto(server.EMPTY_PAGE)
356 require.NoError(t, err)
357 _, err = page.Evaluate("window._foo = 10")
358 require.NoError(t, err)
359 _, err = page.Reload()
360 require.NoError(t, err)
361 v, err := page.Evaluate("window._foo")
362 require.NoError(t, err)
363 require.Nil(t, v)
364 }
365
366 func TestPageGoBackGoForward(t *testing.T) {
367 BeforeEach(t)
368 defer AfterEach(t)
369 resp, err := page.GoBack()
370 require.NoError(t, err)
371 require.Nil(t, resp)
372
373 _, err = page.Goto(server.EMPTY_PAGE)
374 require.NoError(t, err)
375 _, err = page.Goto(server.PREFIX + "/grid.html")
376 require.NoError(t, err)
377
378 resp, err = page.GoBack()
379 require.NoError(t, err)
380 require.True(t, resp.Ok())
381 require.Equal(t, resp.URL(), server.EMPTY_PAGE)
382
383 resp, err = page.GoForward()
384 require.NoError(t, err)
385 require.True(t, resp.Ok())
386 require.Contains(t, resp.URL(), "/grid.html")
387
388 resp, err = page.GoForward()
389 require.NoError(t, err)
390 require.Nil(t, resp)
391 }
392
393 func TestPageAddScriptTag(t *testing.T) {
394 BeforeEach(t)
395 defer AfterEach(t)
396 _, err := page.Goto(server.EMPTY_PAGE)
397 require.NoError(t, err)
398
399 scriptHandle, err := page.AddScriptTag(playwright.PageAddScriptTagOptions{
400 URL: playwright.String("injectedfile.js"),
401 })
402 require.NoError(t, err)
403 require.NotNil(t, scriptHandle.AsElement())
404 v, err := page.Evaluate("__injected")
405 require.NoError(t, err)
406 require.Equal(t, 42, v)
407 }
408
409 func TestPageAddScriptTagFile(t *testing.T) {
410 BeforeEach(t)
411 defer AfterEach(t)
412 _, err := page.Goto(server.EMPTY_PAGE)
413 require.NoError(t, err)
414
415 scriptHandle, err := page.AddScriptTag(playwright.PageAddScriptTagOptions{
416 Path: playwright.String(Asset("injectedfile.js")),
417 })
418 require.NoError(t, err)
419 require.NotNil(t, scriptHandle.AsElement())
420 v, err := page.Evaluate("__injected")
421 require.NoError(t, err)
422 require.Equal(t, 42, v)
423 }
424
425 func TestPageAddStyleTag(t *testing.T) {
426 BeforeEach(t)
427 defer AfterEach(t)
428 _, err := page.Goto(server.EMPTY_PAGE)
429 require.NoError(t, err)
430
431 _, err = page.AddStyleTag(playwright.PageAddStyleTagOptions{
432 URL: playwright.String("injectedstyle.css"),
433 })
434 require.NoError(t, err)
435 v, err := page.Evaluate("window.getComputedStyle(document.querySelector('body')).getPropertyValue('background-color')")
436 require.NoError(t, err)
437 require.Equal(t, "rgb(255, 0, 0)", v)
438 }
439
440 func TestPageAddStyleTagFile(t *testing.T) {
441 BeforeEach(t)
442 defer AfterEach(t)
443 _, err := page.Goto(server.EMPTY_PAGE)
444 require.NoError(t, err)
445
446 _, err = page.AddStyleTag(playwright.PageAddStyleTagOptions{
447 Path: playwright.String(Asset("injectedstyle.css")),
448 })
449 require.NoError(t, err)
450 v, err := page.Evaluate("window.getComputedStyle(document.querySelector('body')).getPropertyValue('background-color')")
451 require.NoError(t, err)
452 require.Equal(t, "rgb(255, 0, 0)", v)
453 }
454
455 func TestPageWaitForLoadState(t *testing.T) {
456 BeforeEach(t)
457 defer AfterEach(t)
458 _, err := page.Goto(server.PREFIX + "/one-style.html")
459 require.NoError(t, err)
460 page.WaitForLoadState()
461 page.WaitForLoadState("networkidle")
462 }
463
464 func TestPlaywrightDevices(t *testing.T) {
465 BeforeEach(t)
466 defer AfterEach(t)
467 require.Greater(t, len(pw.Devices), 10)
468 for name, device := range pw.Devices {
469 require.NotEmpty(t, name)
470 require.NotEmpty(t, device.UserAgent)
471 require.NotEmpty(t, device.Viewport)
472 require.Greater(t, device.DeviceScaleFactor, float64(0))
473 require.NotEmpty(t, device.DefaultBrowserType)
474 }
475 }
476
477 func TestPageAddInitScript(t *testing.T) {
478 BeforeEach(t)
479 defer AfterEach(t)
480 require.NoError(t, page.AddInitScript(playwright.PageAddInitScriptOptions{
481 Script: playwright.String(`window['injected'] = 123;`),
482 }))
483 _, err := page.Goto(server.PREFIX + "/tamperable.html")
484 require.NoError(t, err)
485 result, err := page.Evaluate(`() => window['result']`)
486 require.NoError(t, err)
487 require.Equal(t, 123, result)
488 }
489
490 func TestPageExpectSelectorTimeout(t *testing.T) {
491 BeforeEach(t)
492 defer AfterEach(t)
493 _, err := page.Goto(server.EMPTY_PAGE)
494 require.NoError(t, err)
495 timeoutError := errors.Unwrap(page.Click("foobar", playwright.PageClickOptions{
496 Timeout: playwright.Float(500),
497 })).(*playwright.TimeoutError)
498 require.Contains(t, timeoutError.Message, "Timeout 500ms exceeded.")
499 }
500
501 func TestPageType(t *testing.T) {
502 BeforeEach(t)
503 defer AfterEach(t)
504 _, err := page.Goto(server.EMPTY_PAGE)
505 require.NoError(t, err)
506 require.NoError(t, page.SetContent("<input type='text' />"))
507
508 require.NoError(t, page.Type("input", "hello"))
509 value, err := page.EvalOnSelector("input", "el => el.value")
510 require.NoError(t, err)
511 require.Equal(t, "hello", value)
512 }
513
514 func TestPagePress(t *testing.T) {
515 BeforeEach(t)
516 defer AfterEach(t)
517 _, err := page.Goto(server.EMPTY_PAGE)
518 require.NoError(t, err)
519 require.NoError(t, page.SetContent("<input type='text' />"))
520
521 require.NoError(t, page.Press("input", "h"))
522 value, err := page.EvalOnSelector("input", "el => el.value")
523 require.NoError(t, err)
524 require.Equal(t, "h", value)
525 }
526
527 func TestPageCheck(t *testing.T) {
528 BeforeEach(t)
529 defer AfterEach(t)
530 _, err := page.Goto(server.EMPTY_PAGE)
531 require.NoError(t, err)
532 require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
533
534 require.NoError(t, page.Check("input"))
535 value, err := page.EvalOnSelector("input", "el => el.checked")
536 require.NoError(t, err)
537 require.Equal(t, true, value)
538 }
539
540 func TestPageUncheck(t *testing.T) {
541 BeforeEach(t)
542 defer AfterEach(t)
543 _, err := page.Goto(server.EMPTY_PAGE)
544 require.NoError(t, err)
545 require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox' checked></input>"))
546
547 require.NoError(t, page.Uncheck("input"))
548 value, err := page.EvalOnSelector("input", "el => el.checked")
549 require.NoError(t, err)
550 require.Equal(t, false, value)
551 }
552
553 func TestPageWaitForTimeout(t *testing.T) {
554 BeforeEach(t)
555 defer AfterEach(t)
556 before := time.Now()
557 page.WaitForTimeout(1000)
558 after := time.Now()
559 duration := after.Sub(before)
560 require.True(t, duration > time.Second)
561 require.True(t, duration < 2*time.Second)
562 }
563
564 func TestPageWaitForFunction(t *testing.T) {
565 BeforeEach(t)
566 defer AfterEach(t)
567 _, err := page.Evaluate(`() => setTimeout(() => window.FOO = true, 500)`)
568 require.NoError(t, err)
569 _, err = page.WaitForFunction(`window.FOO === true`, nil)
570 require.NoError(t, err)
571 }
572
573 func TestPageDblclick(t *testing.T) {
574 BeforeEach(t)
575 defer AfterEach(t)
576 _, err := page.Goto(server.EMPTY_PAGE)
577 require.NoError(t, err)
578 require.NoError(t, page.SetContent(`<button ondblclick="window.clicked=true"/>`))
579 require.NoError(t, page.Dblclick("button"))
580 result, err := page.Evaluate("window.clicked")
581 require.NoError(t, err)
582 require.True(t, result.(bool))
583 }
584
585 func TestPageFocus(t *testing.T) {
586 BeforeEach(t)
587 defer AfterEach(t)
588 _, err := page.Goto(server.EMPTY_PAGE)
589 require.NoError(t, err)
590 require.NoError(t, page.SetContent(`<button onfocus="window.clicked=true"/>`))
591 require.NoError(t, page.Focus("button"))
592 result, err := page.Evaluate("window.clicked")
593 require.NoError(t, err)
594 require.True(t, result.(bool))
595 }
596
597 func TestPageTextContent(t *testing.T) {
598 BeforeEach(t)
599 defer AfterEach(t)
600 _, err := page.Goto(server.PREFIX + "/dom.html")
601 require.NoError(t, err)
602 content, err := page.TextContent("#inner")
603 require.NoError(t, err)
604 require.Equal(t, "Text,\nmore text", content)
605 }
606
607 func TestPageAddInitScriptWithPath(t *testing.T) {
608 BeforeEach(t)
609 defer AfterEach(t)
610 require.NoError(t, page.AddInitScript(playwright.PageAddInitScriptOptions{
611 Path: playwright.String(Asset("injectedfile.js")),
612 }))
613 _, err := page.Goto(server.PREFIX + "/tamperable.html")
614 require.NoError(t, err)
615 result, err := page.Evaluate(`() => window['result']`)
616 require.NoError(t, err)
617 require.Equal(t, 123, result)
618 }
619
620 func TestPageSupportNetworkEvents(t *testing.T) {
621 BeforeEach(t)
622 defer AfterEach(t)
623 eventsChan := make(chan string, 6)
624 page.On("request", func(request playwright.Request) {
625 eventsChan <- fmt.Sprintf("%s %s", request.Method(), request.URL())
626 })
627 page.On("response", func(response playwright.Response) {
628 eventsChan <- fmt.Sprintf("%d %s", response.Status(), response.URL())
629 })
630 page.On("requestfinished", func(request playwright.Request) {
631 eventsChan <- fmt.Sprintf("DONE %s", request.URL())
632 })
633 page.On("requestfailed", func(request playwright.Request) {
634 eventsChan <- fmt.Sprintf("FAIL %s", request.URL())
635 })
636 server.SetRedirect("/foo.html", "/empty.html")
637 FOO_URL := server.PREFIX + "/foo.html"
638 response, err := page.Goto(FOO_URL)
639 require.NoError(t, err)
640 eventsSlice := ChanToSlice(eventsChan, 6)
641 require.Equal(t, []string{
642 fmt.Sprintf("GET %s", FOO_URL),
643 fmt.Sprintf("302 %s", FOO_URL),
644 fmt.Sprintf("DONE %s", FOO_URL),
645 fmt.Sprintf("GET %s", server.EMPTY_PAGE),
646 fmt.Sprintf("200 %s", server.EMPTY_PAGE),
647 fmt.Sprintf("DONE %s", server.EMPTY_PAGE),
648 }, eventsSlice)
649 redirectedFrom := response.Request().RedirectedFrom()
650 require.Contains(t, redirectedFrom.URL(), "foo.html")
651 require.Nil(t, redirectedFrom.RedirectedFrom())
652 require.Equal(t, redirectedFrom.RedirectedTo(), response.Request())
653 }
654
655 func TestPageSetViewport(t *testing.T) {
656 BeforeEach(t)
657 defer AfterEach(t)
658 utils.VerifyViewport(t, page, 1280, 720)
659 require.NoError(t, page.SetViewportSize(123, 456))
660 utils.VerifyViewport(t, page, 123, 456)
661 }
662
663 func TestPageEmulateMedia(t *testing.T) {
664 BeforeEach(t)
665 defer AfterEach(t)
666 utils.AssertEval(t, page, "matchMedia('screen').matches", true)
667 utils.AssertEval(t, page, "matchMedia('print').matches", false)
668 require.NoError(t, page.EmulateMedia(playwright.PageEmulateMediaOptions{
669 Media: playwright.MediaPrint,
670 }))
671 utils.AssertEval(t, page, "matchMedia('screen').matches", false)
672 utils.AssertEval(t, page, "matchMedia('print').matches", true)
673 require.NoError(t, page.EmulateMedia())
674 utils.AssertEval(t, page, "matchMedia('screen').matches", false)
675 utils.AssertEval(t, page, "matchMedia('print').matches", true)
676 require.NoError(t, page.EmulateMedia(playwright.PageEmulateMediaOptions{
677 Media: playwright.MediaNull,
678 }))
679 utils.AssertEval(t, page, "matchMedia('screen').matches", true)
680 utils.AssertEval(t, page, "matchMedia('print').matches", false)
681 }
682
683 func TestPageBringToFront(t *testing.T) {
684 BeforeEach(t)
685 defer AfterEach(t)
686 page1, err := browser.NewPage()
687 require.NoError(t, err)
688 require.NoError(t, page1.SetContent("Page1"))
689 page2, err := browser.NewPage()
690 require.NoError(t, err)
691 require.NoError(t, page2.SetContent("Page2"))
692
693 require.NoError(t, page1.BringToFront())
694 utils.AssertEval(t, page1, "document.visibilityState", "visible")
695 utils.AssertEval(t, page2, "document.visibilityState", "visible")
696
697 require.NoError(t, page2.BringToFront())
698 utils.AssertEval(t, page1, "document.visibilityState", "visible")
699 utils.AssertEval(t, page2, "document.visibilityState", "visible")
700 require.NoError(t, page1.Close())
701 require.NoError(t, page2.Close())
702 }
703
704 func TestPageFrame(t *testing.T) {
705 BeforeEach(t)
706 defer AfterEach(t)
707 err := page.SetContent(fmt.Sprintf("<iframe name=target src=%s></iframe>", server.EMPTY_PAGE))
708 require.NoError(t, err)
709
710 var name = "target"
711 frame1 := page.Frame(playwright.PageFrameOptions{Name: &name})
712 require.Equal(t, name, frame1.Name())
713 require.Equal(t, server.EMPTY_PAGE, frame1.URL())
714
715 frame2 := page.Frame(playwright.PageFrameOptions{URL: server.EMPTY_PAGE})
716 require.Equal(t, name, frame2.Name())
717 require.Equal(t, server.EMPTY_PAGE, frame2.URL())
718
719 var badName = "test"
720 frame3 := page.Frame(playwright.PageFrameOptions{Name: &badName, URL: server.EMPTY_PAGE})
721 require.Equal(t, name, frame3.Name())
722 require.Equal(t, server.EMPTY_PAGE, frame3.URL())
723
724 require.Nil(t, page.Frame(playwright.PageFrameOptions{Name: &badName, URL: "https://example.com"}))
725 require.Nil(t, page.Frame(playwright.PageFrameOptions{Name: &badName}))
726 }
727
728 func TestPageTap(t *testing.T) {
729 BeforeEach(t)
730 defer AfterEach(t)
731 _, err := page.Goto(server.EMPTY_PAGE)
732 require.NoError(t, err)
733 require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
734 value, err := page.EvalOnSelector("input", "el => el.checked")
735 require.NoError(t, err)
736 require.Equal(t, false, value)
737
738 require.NoError(t, page.Tap("input"))
739 value, err = page.EvalOnSelector("input", "el => el.checked")
740 require.NoError(t, err)
741 require.Equal(t, true, value)
742 }
743
744 func TestPagePageError(t *testing.T) {
745 BeforeEach(t)
746 defer AfterEach(t)
747 url := server.PREFIX + "/error.html"
748 errInterface, err := page.ExpectEvent("pageerror", func() error {
749 _, err := page.Goto(url)
750 return err
751 })
752 require.NoError(t, err)
753 pageError := errInterface.(*playwright.Error)
754 require.Equal(t, "Fancy error!", pageError.Message)
755 require.Equal(t, "Error", pageError.Name)
756
757 if browserName == "chromium" {
758 require.Equal(t, `Error: Fancy error!
759 at c (myscript.js:14:11)
760 at b (myscript.js:10:5)
761 at a (myscript.js:6:5)
762 at myscript.js:3:1`, pageError.Stack)
763 }
764 if browserName == "firefox" {
765 require.Equal(t, `Error: Fancy error!
766 at c (myscript.js:14:11)
767 at b (myscript.js:10:5)
768 at a (myscript.js:6:5)
769 at (myscript.js:3:1)`, pageError.Stack)
770 }
771 if browserName == "webkit" {
772 require.Equal(t, fmt.Sprintf(`Error: Fancy error!
773 at c (%[1]s:14:36)
774 at b (%[1]s:10:6)
775 at a (%[1]s:6:6)
776 at global code (%[1]s:3:2)`, url), pageError.Stack)
777 }
778 }
779
780 func TestPageSelectOption(t *testing.T) {
781 BeforeEach(t)
782 defer AfterEach(t)
783 _, err := page.Goto(server.EMPTY_PAGE)
784 require.NoError(t, err)
785 require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
786 selected, err := page.SelectOption("#lang", playwright.SelectOptionValues{
787 Values: playwright.StringSlice("python"),
788 })
789 require.NoError(t, err)
790 require.Equal(t, 1, len(selected))
791 require.Equal(t, "python", selected[0])
792 }
793
794 func TestPageUnrouteShouldWork(t *testing.T) {
795 BeforeEach(t)
796 defer AfterEach(t)
797 intercepted := []int{}
798 handler1 := func(route playwright.Route, request playwright.Request) {
799 intercepted = append(intercepted, 1)
800 require.NoError(t, route.Continue())
801 }
802 require.NoError(t, page.Route("**/empty.html", handler1))
803 require.NoError(t, page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
804 intercepted = append(intercepted, 2)
805 require.NoError(t, route.Continue())
806 }))
807 require.NoError(t, page.Route("**/empty.html", func(route playwright.Route, request playwright.Request) {
808 intercepted = append(intercepted, 3)
809 require.NoError(t, route.Continue())
810 }))
811 require.NoError(t, page.Route("**/*", func(route playwright.Route, request playwright.Request) {
812 intercepted = append(intercepted, 4)
813 require.NoError(t, route.Continue())
814 }))
815
816 _, err := page.Goto(server.EMPTY_PAGE)
817 require.NoError(t, err)
818 require.Equal(t, []int{1}, intercepted)
819
820 intercepted = []int{}
821 require.NoError(t, page.Unroute("**/empty.html", handler1))
822 _, err = page.Goto(server.EMPTY_PAGE)
823 require.NoError(t, err)
824 require.Equal(t, []int{2}, intercepted)
825
826 intercepted = []int{}
827 require.NoError(t, page.Unroute("**/empty.html"))
828 _, err = page.Goto(server.EMPTY_PAGE)
829 require.NoError(t, err)
830 require.Equal(t, []int{4}, intercepted)
831 }
832
833 func TestPageDragAndDrop(t *testing.T) {
834 BeforeEach(t)
835 defer AfterEach(t)
836 _, err := page.Goto(server.PREFIX + "/drag-n-drop.html")
837 require.NoError(t, err)
838 require.NoError(t, page.DragAndDrop("#source", "#target"))
839 value, err := page.EvalOnSelector("#target", "target => target.contains(document.querySelector('#source'))")
840 require.NoError(t, err)
841 require.Equal(t, true, value)
842 }
843 func TestPageInputValue(t *testing.T) {
844 BeforeEach(t)
845 defer AfterEach(t)
846 require.NoError(t, page.SetContent(`
847 <input></input>
848 `))
849 require.NoError(t, page.Fill("input", "hello"))
850 value, err := page.InputValue("input")
851 require.NoError(t, err)
852 require.Equal(t, "hello", value)
853 require.NoError(t, page.Fill("input", ""))
854 value, err = page.InputValue("input")
855 require.NoError(t, err)
856 require.Equal(t, "", value)
857 }
858
859 func TestPageWaitForFunction2(t *testing.T) {
860 BeforeEach(t)
861 defer AfterEach(t)
862 _, err := page.Goto(server.EMPTY_PAGE)
863 require.NoError(t, err)
864 _, err = page.AddScriptTag(
865 playwright.PageAddScriptTagOptions{
866 Path: playwright.String(Asset(filepath.Join("es6", "es6pathimport.js"))),
867 Type: playwright.String("module"),
868 },
869 )
870 require.NoError(t, err)
871 _, err = page.WaitForFunction("window.__es6injected", nil)
872 require.NoError(t, err)
873 value, err := page.Evaluate("window.__es6injected")
874 require.NoError(t, err)
875 require.Equal(t, 42, value)
876 }
877
878 func TestPageShouldSetBodysizeAndHeadersize(t *testing.T) {
879 BeforeEach(t)
880 defer AfterEach(t)
881 _, err := page.Goto(server.EMPTY_PAGE)
882 require.NoError(t, err)
883 request, err := page.ExpectRequest("**/*", func() error {
884 _, err = page.Evaluate("() => fetch('./get', { method: 'POST', body: '12345'}).then(r => r.text())")
885 require.NoError(t, err)
886 return nil
887 },
888 )
889 require.NoError(t, err)
890 sizes, err := request.Sizes()
891 require.NoError(t, err)
892 require.Equal(t, 5, sizes.RequestBodySize)
893 require.GreaterOrEqual(t, sizes.RequestHeadersSize, 300)
894 }
895
896 func TestPageTestShouldSetBodysizeTo0(t *testing.T) {
897 BeforeEach(t)
898 defer AfterEach(t)
899 _, err := page.Goto(server.EMPTY_PAGE)
900 require.NoError(t, err)
901 request, err := page.ExpectRequest("**/*", func() error {
902 _, err = page.Evaluate("() => fetch('./get').then(r => r.text())")
903 require.NoError(t, err)
904 return nil
905 },
906 )
907 require.NoError(t, err)
908 sizes, err := request.Sizes()
909 require.NoError(t, err)
910 require.Equal(t, 0, sizes.RequestBodySize)
911 require.GreaterOrEqual(t, sizes.RequestHeadersSize, 200)
912 }
913
914 func TestPageSetChecked(t *testing.T) {
915 BeforeEach(t)
916 defer AfterEach(t)
917 require.NoError(t, page.SetContent(`<input id='checkbox' type='checkbox'></input>`))
918 require.NoError(t, page.SetChecked("input", true))
919 isChecked, err := page.Evaluate("checkbox.checked")
920 require.NoError(t, err)
921 require.True(t, isChecked.(bool))
922 require.NoError(t, page.SetChecked("input", false))
923 isChecked, err = page.Evaluate("checkbox.checked")
924 require.NoError(t, err)
925 require.False(t, isChecked.(bool))
926 }
927
View as plain text