1 package playwright_test
2
3 import (
4 "testing"
5
6 "github.com/playwright-community/playwright-go"
7 "github.com/stretchr/testify/require"
8 )
9
10 func TestConsoleShouldWork(t *testing.T) {
11 BeforeEach(t)
12 defer AfterEach(t)
13 messages := make(chan playwright.ConsoleMessage, 1)
14 page.Once("console", func(message playwright.ConsoleMessage) {
15 messages <- message
16 })
17 _, err := page.Evaluate(`() => console.log("hello", 5, {foo: "bar"})`)
18 require.NoError(t, err)
19 message := <-messages
20 if !isFirefox {
21 require.Equal(t, message.Text(), "hello 5 {foo: bar}")
22 require.Equal(t, message.String(), "hello 5 {foo: bar}")
23 } else {
24 require.Equal(t, message.Text(), "hello 5 JSHandle@object")
25 require.Equal(t, message.String(), "hello 5 JSHandle@object")
26 }
27 require.Equal(t, message.Type(), "log")
28 jsonValue1, err := message.Args()[0].JSONValue()
29 require.NoError(t, err)
30 require.Equal(t, "hello", jsonValue1)
31 jsonValue2, err := message.Args()[1].JSONValue()
32 require.NoError(t, err)
33 require.Equal(t, 5, jsonValue2)
34 jsonValue3, err := message.Args()[2].JSONValue()
35 require.NoError(t, err)
36 require.Equal(t, map[string]interface{}{
37 "foo": "bar",
38 }, jsonValue3)
39 }
40
41 func TestConsoleShouldEmitSameLogTwice(t *testing.T) {
42 BeforeEach(t)
43 defer AfterEach(t)
44 messages := make(chan string, 2)
45 page.On("console", func(message playwright.ConsoleMessage) {
46 messages <- message.Text()
47 })
48 _, err := page.Evaluate(`() => { for (let i = 0; i < 2; ++i ) console.log("hello"); } `)
49 require.NoError(t, err)
50 m1 := <-messages
51 m2 := <-messages
52 require.Equal(t, []string{"hello", "hello"}, []string{m1, m2})
53 }
54
55 func TestConsoleShouldUseTextForStr(t *testing.T) {
56 BeforeEach(t)
57 defer AfterEach(t)
58 messages := make(chan playwright.ConsoleMessage, 1)
59 page.On("console", func(message playwright.ConsoleMessage) {
60 messages <- message
61 })
62 _, err := page.Evaluate(`() => console.log("Hello world")`)
63 require.NoError(t, err)
64 message := <-messages
65 require.Equal(t, "Hello world", message.String())
66 }
67
68 func TestConsoleShouldWorkForDifferentConsoleAPICalls(t *testing.T) {
69 BeforeEach(t)
70 defer AfterEach(t)
71 messagesChan := make(chan playwright.ConsoleMessage, 6)
72 page.On("console", func(message playwright.ConsoleMessage) {
73 messagesChan <- message
74 })
75
76 _, err := page.Evaluate(
77 `() => {
78 // A pair of time/timeEnd generates only one Console API call.
79 console.time('calling console.time');
80 console.timeEnd('calling console.time');
81 console.trace('calling console.trace');
82 console.dir('calling console.dir');
83 console.warn('calling console.warn');
84 console.error('calling console.error');
85 console.log(Promise.resolve('should not wait until resolved!'));
86 }`)
87 messages := ChanToSlice(messagesChan, 6).([]playwright.ConsoleMessage)
88 require.NoError(t, err)
89 require.Equal(t, []interface{}{
90 "timeEnd",
91 "trace",
92 "dir",
93 "warning",
94 "error",
95 "log",
96 }, Map(messages, func(msg interface{}) interface{} {
97 return msg.(playwright.ConsoleMessage).Type()
98 }))
99
100 require.Contains(t, messages[0].Text(), "calling console.time")
101 require.Equal(t, []interface{}{
102 "calling console.trace",
103 "calling console.dir",
104 "calling console.warn",
105 "calling console.error",
106 "Promise",
107 }, Map(messages[1:], func(msg interface{}) interface{} {
108 return msg.(playwright.ConsoleMessage).Text()
109 }))
110 }
111
112 func TestConsoleShouldNotFailForWindowObjects(t *testing.T) {
113 BeforeEach(t)
114 defer AfterEach(t)
115 messages := make(chan playwright.ConsoleMessage, 1)
116 page.Once("console", func(message playwright.ConsoleMessage) {
117 messages <- message
118 })
119 _, err := page.Evaluate("() => console.error(window)")
120 require.NoError(t, err)
121 message := <-messages
122 if !isFirefox {
123 require.Equal(t, "Window", message.Text())
124 } else {
125 require.Equal(t, "JSHandle@object", message.Text())
126 }
127 }
128
129 func TestConsoleShouldTriggerCorrectLog(t *testing.T) {
130 BeforeEach(t)
131 defer AfterEach(t)
132 messages := make(chan playwright.ConsoleMessage, 1)
133 page.Once("console", func(message playwright.ConsoleMessage) {
134 messages <- message
135 })
136 _, err := page.Goto("about:blank")
137 require.NoError(t, err)
138 _, err = page.Evaluate("url => fetch(url).catch(e => {})", server.EMPTY_PAGE)
139 require.NoError(t, err)
140 message := <-messages
141 require.Contains(t, message.Text(), "Access-Control-Allow-Origin")
142 require.Equal(t, "error", message.Type())
143 }
144
145 func TestConsoleShouldHaveLocation(t *testing.T) {
146 BeforeEach(t)
147 defer AfterEach(t)
148 messageEvent, err := page.ExpectEvent("console", func() error {
149 _, err := page.Goto(server.PREFIX + "/consolelog.html")
150 return err
151 }, func(m playwright.ConsoleMessage) bool {
152 return m.Text() == "yellow"
153 })
154 require.NoError(t, err)
155 message := messageEvent.(playwright.ConsoleMessage)
156 require.Equal(t, message.Type(), "log")
157 require.Equal(t, server.PREFIX+"/consolelog.html", message.Location().URL)
158 require.Equal(t, 7, message.Location().LineNumber)
159 }
160
View as plain text