1 package playwright_test
2
3 import (
4 "errors"
5 "fmt"
6 "testing"
7 "time"
8
9 "github.com/playwright-community/playwright-go"
10 "github.com/stretchr/testify/require"
11 )
12
13 func TestBrowserTypeBrowserName(t *testing.T) {
14 BeforeEach(t)
15 defer AfterEach(t)
16 require.Equal(t, pw.Chromium.Name(), "chromium")
17 require.Equal(t, pw.Firefox.Name(), "firefox")
18 require.Equal(t, pw.WebKit.Name(), "webkit")
19 }
20
21 func TestBrowserTypeExecutablePath(t *testing.T) {
22 BeforeEach(t)
23 defer AfterEach(t)
24 require.Greater(t, len(pw.Chromium.ExecutablePath()), 0)
25 }
26
27 func TestBrowserTypeLaunchPersistentContext(t *testing.T) {
28 BeforeEach(t)
29 defer AfterEach(t)
30 user_data_dir1 := t.TempDir()
31 browser_context, err := browserType.LaunchPersistentContext(user_data_dir1)
32 require.NoError(t, err)
33 page, err := browser_context.NewPage()
34 require.NoError(t, err)
35 _, err = page.Goto(server.EMPTY_PAGE)
36 require.NoError(t, err)
37 _, err = page.Evaluate("() => localStorage.hey = 'hello'")
38 require.NoError(t, err)
39 require.NoError(t, browser_context.Close())
40
41 browser_context2, err := browserType.LaunchPersistentContext(user_data_dir1)
42 require.NoError(t, err)
43 page2, err := browser_context2.NewPage()
44 require.NoError(t, err)
45 _, err = page2.Goto(server.EMPTY_PAGE)
46 require.NoError(t, err)
47 result, err := page2.Evaluate("() => localStorage.hey")
48 require.NoError(t, err)
49 require.Equal(t, "hello", result)
50 require.NoError(t, browser_context2.Close())
51
52 user_data_dir2 := t.TempDir()
53 browser_context3, err := browserType.LaunchPersistentContext(user_data_dir2)
54 require.NoError(t, err)
55 page3, err := browser_context3.NewPage()
56 require.NoError(t, err)
57 _, err = page3.Goto(server.EMPTY_PAGE)
58 require.NoError(t, err)
59 result, err = page3.Evaluate("() => localStorage.hey")
60 require.NoError(t, err)
61 require.NotEqual(t, "hello", result)
62 require.NoError(t, browser_context3.Close())
63 }
64
65 func TestBrowserTypeConnect(t *testing.T) {
66 BeforeEach(t)
67 defer AfterEach(t)
68 remoteServer, err := newRemoteServer()
69 require.NoError(t, err)
70 defer remoteServer.Close()
71 browser, err := browserType.Connect(remoteServer.url)
72 require.NoError(t, err)
73 require.NotNil(t, browser)
74 browser_context, err := browser.NewContext()
75 require.NoError(t, err)
76 page, err := browser_context.NewPage()
77 require.NoError(t, err)
78 result, err := page.Evaluate("11 * 11")
79 require.NoError(t, err)
80 require.Equal(t, result, 121)
81 require.NoError(t, browser.Close())
82 }
83
84 func TestBrowserTypeConnectShouldBeAbleToReconnectToBrowser(t *testing.T) {
85 BeforeEach(t)
86 defer AfterEach(t)
87 remoteServer, err := newRemoteServer()
88 require.NoError(t, err)
89 defer remoteServer.Close()
90 browser, err := browserType.Connect(remoteServer.url)
91 require.NoError(t, err)
92 require.NotNil(t, browser)
93 require.Len(t, browser.Contexts(), 0)
94 browser_context, err := browser.NewContext()
95 require.NoError(t, err)
96 require.Len(t, browser.Contexts(), 1)
97 require.Len(t, browser_context.Pages(), 0)
98 page, err := browser_context.NewPage()
99 require.Len(t, browser_context.Pages(), 1)
100 require.NoError(t, err)
101 result, err := page.Evaluate("11 * 11")
102 require.NoError(t, err)
103 require.Equal(t, result, 121)
104 require.NoError(t, browser.Close())
105
106 browser, err = browserType.Connect(remoteServer.url)
107 require.NoError(t, err)
108 require.NotNil(t, browser)
109 require.Len(t, browser.Contexts(), 0)
110 browser_context, err = browser.NewContext()
111 require.NoError(t, err)
112 require.Len(t, browser.Contexts(), 1)
113 require.Len(t, browser_context.Pages(), 0)
114 page, err = browser_context.NewPage()
115 require.Len(t, browser_context.Pages(), 1)
116 require.NoError(t, err)
117 result, err = page.Evaluate("11 * 11")
118 require.NoError(t, err)
119 require.Equal(t, result, 121)
120 require.NoError(t, browser.Close())
121 }
122
123 func TestBrowserTypeConnectShouldEmitDisconnectedEvent(t *testing.T) {
124 BeforeEach(t)
125 defer AfterEach(t)
126 remoteServer, err := newRemoteServer()
127 require.NoError(t, err)
128 disconnected1 := newSyncSlice()
129 disconnected2 := newSyncSlice()
130 browser1, err := browserType.Connect(remoteServer.url)
131 require.NoError(t, err)
132 require.NotNil(t, browser1)
133 browser2, err := browserType.Connect(remoteServer.url)
134 require.NoError(t, err)
135 require.NotNil(t, browser2)
136 browser1.On("disconnected", func() {
137 disconnected1.Append(true)
138 })
139 browser2.On("disconnected", func() {
140 disconnected2.Append(true)
141 })
142 page, err := browser2.NewPage()
143 require.NoError(t, err)
144 require.NoError(t, browser1.Close())
145 require.False(t, browser1.IsConnected())
146 require.Len(t, disconnected1.Get(), 1)
147 require.Len(t, disconnected2.Get(), 0)
148 remoteServer.Close()
149
150 _, err = page.Title()
151 require.Error(t, err)
152 require.False(t, browser2.IsConnected())
153 require.Len(t, disconnected2.Get(), 1)
154 }
155
156 func TestBrowserTypeConnectSlowMo(t *testing.T) {
157 BeforeEach(t)
158 defer AfterEach(t)
159 remoteServer, err := newRemoteServer()
160 require.NoError(t, err)
161 defer remoteServer.Close()
162 browser, err := browserType.Connect(remoteServer.url, playwright.BrowserTypeConnectOptions{
163 SlowMo: playwright.Float(100),
164 })
165 require.NoError(t, err)
166 require.NotNil(t, browser)
167 browser_context, err := browser.NewContext()
168 require.NoError(t, err)
169 t1 := time.Now()
170 page, err := browser_context.NewPage()
171 require.NoError(t, err)
172 result, err := page.Evaluate("11 * 11")
173 require.NoError(t, err)
174 require.Equal(t, result, 121)
175 require.GreaterOrEqual(t, time.Since(t1), time.Duration(time.Millisecond*200))
176 require.NoError(t, browser.Close())
177 }
178
179 func TestBrowserTypeConnectArtifactPath(t *testing.T) {
180 BeforeEach(t)
181 defer AfterEach(t)
182 remoteServer, err := newRemoteServer()
183 require.NoError(t, err)
184 defer remoteServer.Close()
185 browser, err := browserType.Connect(remoteServer.url)
186 require.NoError(t, err)
187 require.NotNil(t, browser)
188 defer browser.Close()
189 recordVideoDir := t.TempDir()
190 browserContext, err := browser.NewContext(playwright.BrowserNewContextOptions{
191 RecordVideo: &playwright.BrowserNewContextOptionsRecordVideo{
192 Dir: &recordVideoDir,
193 },
194 })
195 require.NoError(t, err)
196 require.NotNil(t, browserContext)
197 defer browserContext.Close()
198 page, err := browserContext.NewPage()
199 require.NoError(t, err)
200 defer page.Close()
201 _, err = page.Goto(server.EMPTY_PAGE)
202 require.NoError(t, err)
203 _, err = page.Video().Path()
204 require.Error(t, err)
205 require.Equal(t, err, errors.New("Path is not available when connecting remotely. Use SaveAs() to save a local copy."))
206 }
207 func TestBrowserTypeConnectOverCDP(t *testing.T) {
208 if !isChromium {
209 t.Skip("CDP is only supported on Chromium")
210 }
211 BeforeEach(t)
212 defer AfterEach(t)
213 port, err := getFreePort()
214 require.NoError(t, err)
215 browserServer, err := browserType.Launch(playwright.BrowserTypeLaunchOptions{
216 Args: []string{fmt.Sprintf("--remote-debugging-port=%d", port)},
217 })
218 require.NoError(t, err)
219 defer browserServer.Close()
220 browser, err := browserType.ConnectOverCDP(fmt.Sprintf("http://localhost:%d", port))
221 require.NoError(t, err)
222 require.NotNil(t, browser)
223 defer browser.Close()
224 require.Len(t, browser.Contexts(), 1)
225 }
226
227 func TestBrowserTypeConnectOverCDPTwice(t *testing.T) {
228 if !isChromium {
229 t.Skip("CDP is only supported on Chromium")
230 }
231 BeforeEach(t)
232 defer AfterEach(t)
233 port, err := getFreePort()
234 require.NoError(t, err)
235 browserServer, err := browserType.Launch(playwright.BrowserTypeLaunchOptions{
236 Args: []string{fmt.Sprintf("--remote-debugging-port=%d", port)},
237 })
238 require.NoError(t, err)
239 defer browserServer.Close()
240 browser1, err := browserType.ConnectOverCDP(fmt.Sprintf("http://localhost:%d", port))
241 require.NoError(t, err)
242 require.NotNil(t, browser1)
243 browser2, err := browserType.ConnectOverCDP(fmt.Sprintf("http://localhost:%d", port))
244 require.NoError(t, err)
245 require.NotNil(t, browser2)
246 defer browser1.Close()
247 defer browser2.Close()
248 require.Len(t, browser1.Contexts(), 1)
249 page1, err := browser1.Contexts()[0].NewPage()
250 require.NoError(t, err)
251 _, err = page1.Goto(server.EMPTY_PAGE)
252 require.NoError(t, err)
253 require.Len(t, browser2.Contexts(), 1)
254 page2, err := browser2.Contexts()[0].NewPage()
255 require.NoError(t, err)
256 _, err = page2.Goto(server.EMPTY_PAGE)
257 require.NoError(t, err)
258
259 require.Len(t, browser1.Contexts()[0].Pages(), 2)
260 require.Len(t, browser2.Contexts()[0].Pages(), 2)
261
262 }
263
View as plain text