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 TestElementHandleInnerText(t *testing.T) {
11 BeforeEach(t)
12 defer AfterEach(t)
13 _, err := page.Goto(server.PREFIX + "/dom.html")
14 require.NoError(t, err)
15 handle, err := page.QuerySelector("#inner")
16 require.NoError(t, err)
17 t1, err := handle.InnerText()
18 require.NoError(t, err)
19 require.Equal(t, t1, "Text, more text")
20 t2, err := page.InnerText("#inner")
21 require.NoError(t, err)
22 require.Equal(t, t2, "Text, more text")
23 }
24
25 func TestElementHandleOwnerFrame(t *testing.T) {
26 BeforeEach(t)
27 defer AfterEach(t)
28 _, err := page.Goto(server.EMPTY_PAGE)
29 require.NoError(t, err)
30 _, err = utils.AttachFrame(page, "iframe1", server.EMPTY_PAGE)
31 require.NoError(t, err)
32 frame := page.Frames()[1]
33 elementHandle, err := frame.EvaluateHandle("document.body")
34 require.NoError(t, err)
35 ownerFrame, err := elementHandle.(playwright.ElementHandle).OwnerFrame()
36 require.NoError(t, err)
37 require.Equal(t, ownerFrame, frame)
38 require.Equal(t, "iframe1", ownerFrame.Name())
39 }
40 func TestElementHandleContentFrame(t *testing.T) {
41 BeforeEach(t)
42 defer AfterEach(t)
43 _, err := page.Goto(server.EMPTY_PAGE)
44 require.NoError(t, err)
45 _, err = utils.AttachFrame(page, "frame1", server.EMPTY_PAGE)
46 require.NoError(t, err)
47 elementHandle, err := page.QuerySelector("#frame1")
48 require.NoError(t, err)
49 frame, err := elementHandle.ContentFrame()
50 require.NoError(t, err)
51 require.Equal(t, frame, page.Frames()[1])
52 }
53 func TestElementHandleGetAttribute(t *testing.T) {
54 BeforeEach(t)
55 defer AfterEach(t)
56 _, err := page.Goto(server.PREFIX + "/dom.html")
57 require.NoError(t, err)
58 handle, err := page.QuerySelector("#outer")
59 require.NoError(t, err)
60 a1, err := handle.GetAttribute("name")
61 require.NoError(t, err)
62 require.Equal(t, "value", a1)
63 a2, err := page.GetAttribute("#outer", "name")
64 require.NoError(t, err)
65 require.Equal(t, "value", a2)
66 }
67
68 func TestElementHandleDispatchEvent(t *testing.T) {
69 BeforeEach(t)
70 defer AfterEach(t)
71 _, err := page.Goto(server.PREFIX + "/input/button.html")
72 require.NoError(t, err)
73 element, err := page.QuerySelector("button")
74 require.NoError(t, err)
75 require.NoError(t, element.DispatchEvent("click"))
76 result, err := page.Evaluate("() => result")
77 require.NoError(t, err)
78 require.Equal(t, "Clicked", result)
79 }
80
81 func TestElementHandleDispatchEventInitObject(t *testing.T) {
82 BeforeEach(t)
83 defer AfterEach(t)
84 err := page.SetContent(`
85 <button onclick="window.eventBubbles = event.bubbles">ok</button>`)
86 require.NoError(t, err)
87 element, err := page.QuerySelector("button")
88 require.NoError(t, err)
89 require.NoError(t, element.DispatchEvent("click", map[string]interface{}{
90 "bubbles": true,
91 }))
92 result, err := page.Evaluate("() => window.eventBubbles")
93 require.NoError(t, err)
94 require.Equal(t, true, result)
95 }
96
97 func TestElementHandleHover(t *testing.T) {
98 BeforeEach(t)
99 defer AfterEach(t)
100 _, err := page.Goto(server.PREFIX + "/input/scrollable.html")
101 require.NoError(t, err)
102 btn, err := page.QuerySelector("#button-6")
103 require.NoError(t, err)
104 require.NoError(t, btn.Hover())
105 result, err := page.Evaluate(`document.querySelector("button:hover").id`)
106 require.NoError(t, err)
107 require.Equal(t, "button-6", result)
108 }
109
110 func TestElementHandleClick(t *testing.T) {
111 BeforeEach(t)
112 defer AfterEach(t)
113 _, err := page.Goto(server.PREFIX + "/input/button.html")
114 require.NoError(t, err)
115 btn, err := page.QuerySelector("button")
116 require.NoError(t, err)
117 require.NoError(t, btn.Click())
118 result, err := page.Evaluate(`result`)
119 require.NoError(t, err)
120 require.Equal(t, "Clicked", result)
121 }
122
123 func TestElementHandleDblclick(t *testing.T) {
124 BeforeEach(t)
125 defer AfterEach(t)
126 _, err := page.Goto(server.PREFIX + "/input/button.html")
127 require.NoError(t, err)
128 _, err = page.Evaluate(`() => {
129 window.double = false;
130 button = document.querySelector('button');
131 button.addEventListener('dblclick', event => {
132 window.double = true;
133 });
134 }`)
135 require.NoError(t, err)
136 btn, err := page.QuerySelector("button")
137 require.NoError(t, err)
138 require.NoError(t, btn.Dblclick())
139 result, err := page.Evaluate("double")
140 require.NoError(t, err)
141 require.Equal(t, true, result)
142
143 result, err = page.Evaluate(`result`)
144 require.NoError(t, err)
145 require.Equal(t, "Clicked", result)
146 }
147
148 func TestElementBoundingBox(t *testing.T) {
149 BeforeEach(t)
150 defer AfterEach(t)
151 require.NoError(t, page.SetViewportSize(500, 500))
152 _, err := page.Goto(server.PREFIX + "/grid.html")
153 require.NoError(t, err)
154 element_handle, err := page.QuerySelector(".box:nth-of-type(13)")
155 require.NoError(t, err)
156 box, err := element_handle.BoundingBox()
157 require.NoError(t, err)
158 require.Equal(t, 100, box.X)
159 require.Equal(t, 50, box.Y)
160 require.Equal(t, 50, box.Width)
161 require.Equal(t, 50, box.Height)
162 }
163
164 func TestElementHandleTap(t *testing.T) {
165 BeforeEach(t)
166 defer AfterEach(t)
167 _, err := page.Goto(server.EMPTY_PAGE)
168 require.NoError(t, err)
169 require.NoError(t, page.SetContent("<input id='checkbox' type='checkbox'></input>"))
170 value, err := page.EvalOnSelector("input", "el => el.checked")
171 require.NoError(t, err)
172 require.Equal(t, false, value)
173
174 elemHandle, err := page.QuerySelector("#checkbox")
175 require.NoError(t, err)
176 require.NoError(t, elemHandle.Tap())
177 value, err = page.EvalOnSelector("input", "el => el.checked")
178 require.NoError(t, err)
179 require.Equal(t, true, value)
180 }
181
182 func TestElementHandleQuerySelectorNotExists(t *testing.T) {
183 BeforeEach(t)
184 defer AfterEach(t)
185 _, err := page.Goto(server.EMPTY_PAGE)
186 require.NoError(t, err)
187 require.NoError(t, page.SetContent(`
188 <div id="a1">
189 </div>
190 `))
191 rootElement, err := page.QuerySelector("#a1")
192 require.NoError(t, err)
193 element, err := rootElement.QuerySelector(".foobar")
194 require.NoError(t, err)
195 require.Nil(t, element)
196 }
197
198 func TestElementHandleQuerySelectorAll(t *testing.T) {
199 BeforeEach(t)
200 defer AfterEach(t)
201 _, err := page.Goto(server.EMPTY_PAGE)
202 require.NoError(t, err)
203 require.NoError(t, page.SetContent(`
204 <div id="a1">
205 <div class="foobar">
206 </div>
207 <div class="foobar">
208 </div>
209 </div>
210 `))
211 rootElement, err := page.QuerySelector("#a1")
212 require.NoError(t, err)
213 elements, err := rootElement.QuerySelectorAll(".foobar")
214 require.NoError(t, err)
215 require.Equal(t, 2, len(elements))
216 className, err := elements[0].GetAttribute("class")
217 require.NoError(t, err)
218 require.Equal(t, "foobar", className)
219 }
220
221 func TestElementHandleEvalOnSelector(t *testing.T) {
222 BeforeEach(t)
223 defer AfterEach(t)
224 _, err := page.Goto(server.EMPTY_PAGE)
225 require.NoError(t, err)
226 require.NoError(t, page.SetContent(`
227 <div id="a1">
228 <div id="a2">
229 foobar
230 </div>
231 </div>
232 `))
233 rootElement, err := page.QuerySelector("#a1")
234 require.NoError(t, err)
235 innerText, err := rootElement.EvalOnSelector("#a2", "e => e.innerText")
236 require.NoError(t, err)
237 require.Equal(t, "foobar", innerText)
238 }
239
240 func TestElementHandleEvalOnSelectorAll(t *testing.T) {
241 BeforeEach(t)
242 defer AfterEach(t)
243 _, err := page.Goto(server.EMPTY_PAGE)
244 require.NoError(t, err)
245 require.NoError(t, page.SetContent(`
246 <div id="a1">
247 <div class="foobar">
248 </div>
249 <div class="foobar">
250 </div>
251 </div>
252 `))
253 rootElement, err := page.QuerySelector("#a1")
254 require.NoError(t, err)
255 classNames, err := rootElement.EvalOnSelectorAll(".foobar", "elements => [...elements].map(e => e.getAttribute('class'))")
256 require.NoError(t, err)
257 require.Equal(t, []interface{}([]interface{}{"foobar", "foobar"}), classNames)
258 }
259
260 func TestElementHandleString(t *testing.T) {
261 BeforeEach(t)
262 defer AfterEach(t)
263 numberHandle, err := page.EvaluateHandle("() => 2")
264 require.NoError(t, err)
265 require.Equal(t, "2", numberHandle.String())
266 stringHandle, err := page.EvaluateHandle("() => 'a'")
267 require.NoError(t, err)
268 require.Equal(t, "a", stringHandle.String())
269 }
270
271 func TestElementHandleCheck(t *testing.T) {
272 BeforeEach(t)
273 defer AfterEach(t)
274 require.NoError(t, page.SetContent(`
275 <input type="checkbox"/>
276 `))
277 inputElement, err := page.QuerySelector("input")
278 require.NoError(t, err)
279 isChecked, err := inputElement.Evaluate("e => e.checked")
280 require.NoError(t, err)
281 require.Equal(t, false, isChecked)
282 require.NoError(t, inputElement.Check())
283 isChecked, err = inputElement.Evaluate("e => e.checked")
284 require.NoError(t, err)
285 require.Equal(t, true, isChecked)
286 }
287
288 func TestElementHandleUnCheck(t *testing.T) {
289 BeforeEach(t)
290 defer AfterEach(t)
291 require.NoError(t, page.SetContent(`
292 <input type="checkbox" checked/>
293 `))
294 inputElement, err := page.QuerySelector("input")
295 require.NoError(t, err)
296 require.NoError(t, inputElement.Uncheck())
297 isChecked, err := inputElement.Evaluate("e => e.checked")
298 require.NoError(t, err)
299 require.Equal(t, false, isChecked)
300 }
301
302 func TestElementHandleSelectOption(t *testing.T) {
303 BeforeEach(t)
304 defer AfterEach(t)
305 _, err := page.Goto(server.EMPTY_PAGE)
306 require.NoError(t, err)
307 require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
308 elemHandle, err := page.QuerySelector("#lang")
309 require.NoError(t, err)
310 selected, err := elemHandle.SelectOption(playwright.SelectOptionValues{
311 Values: playwright.StringSlice("go"),
312 })
313 require.NoError(t, err)
314 require.Equal(t, 1, len(selected))
315 require.Equal(t, "go", selected[0])
316 }
317
318 func TestElementHandleSelectOptionOverElementHandle(t *testing.T) {
319 BeforeEach(t)
320 defer AfterEach(t)
321 _, err := page.Goto(server.EMPTY_PAGE)
322 require.NoError(t, err)
323 require.NoError(t, page.SetContent("<select id='lang'><option value='go'>go</option><option value='python'>python</option></select>"))
324
325 pythonOption, err := page.QuerySelector("option[value=python]")
326 require.NoError(t, err)
327
328 selected, err := page.SelectOption("#lang", playwright.SelectOptionValues{
329 Elements: &[]playwright.ElementHandle{pythonOption},
330 })
331 require.NoError(t, err)
332 require.Equal(t, 1, len(selected))
333 require.Equal(t, "python", selected[0])
334 }
335
336 func TestElementHandleIsVisibleAndIsHiddenShouldWork(t *testing.T) {
337 BeforeEach(t)
338 defer AfterEach(t)
339 require.NoError(t, page.SetContent(`<div>Hi</div><span></span>`))
340 div, err := page.QuerySelector("div")
341 require.NoError(t, err)
342 isVisible, err := div.IsVisible()
343 require.NoError(t, err)
344 require.True(t, isVisible)
345 isHidden, err := div.IsHidden()
346 require.NoError(t, err)
347 require.False(t, isHidden)
348
349 isVisible, err = page.IsVisible("div")
350 require.NoError(t, err)
351 require.True(t, isVisible)
352 isHidden, err = page.IsHidden("div")
353 require.NoError(t, err)
354 require.False(t, isHidden)
355
356 span, err := page.QuerySelector("span")
357 require.NoError(t, err)
358 isVisible, err = span.IsVisible()
359 require.NoError(t, err)
360 require.False(t, isVisible)
361 isHidden, err = span.IsHidden()
362 require.NoError(t, err)
363 require.True(t, isHidden)
364
365 isVisible, err = page.IsVisible("span")
366 require.NoError(t, err)
367 require.False(t, isVisible)
368 isHidden, err = page.IsHidden("span")
369 require.NoError(t, err)
370 require.True(t, isHidden)
371 }
372
373 func TestElementHandleIsEnabledAndIsDisabledshouldWork(t *testing.T) {
374 BeforeEach(t)
375 defer AfterEach(t)
376 require.NoError(t, page.SetContent(`
377 <button disabled>button1</button>
378 <button>button2</button>
379 <div>div</div>
380 `))
381 div, err := page.QuerySelector("div")
382 require.NoError(t, err)
383 isEnabled, err := div.IsEnabled()
384 require.NoError(t, err)
385 require.True(t, isEnabled)
386 isDisabled, err := div.IsDisabled()
387 require.NoError(t, err)
388 require.False(t, isDisabled)
389
390 isEnabled, err = page.IsEnabled("div")
391 require.NoError(t, err)
392 require.True(t, isEnabled)
393 isDisabled, err = page.IsDisabled("div")
394 require.NoError(t, err)
395 require.False(t, isDisabled)
396
397 button1, err := page.QuerySelector(":text('button1')")
398 require.NoError(t, err)
399 isEnabled, err = button1.IsEnabled()
400 require.NoError(t, err)
401 require.False(t, isEnabled)
402 isDisabled, err = button1.IsDisabled()
403 require.NoError(t, err)
404 require.True(t, isDisabled)
405
406 isEnabled, err = page.IsEnabled(":text('button1')")
407 require.NoError(t, err)
408 require.False(t, isEnabled)
409 isDisabled, err = page.IsDisabled(":text('button1')")
410 require.NoError(t, err)
411 require.True(t, isDisabled)
412
413 button2, err := page.QuerySelector(":text('button2')")
414 require.NoError(t, err)
415 isEnabled, err = button2.IsEnabled()
416 require.NoError(t, err)
417 require.True(t, isEnabled)
418 isDisabled, err = button2.IsDisabled()
419 require.NoError(t, err)
420 require.False(t, isDisabled)
421
422 isEnabled, err = page.IsEnabled(":text('button2')")
423 require.NoError(t, err)
424 require.True(t, isEnabled)
425 isDisabled, err = page.IsDisabled(":text('button2')")
426 require.NoError(t, err)
427 require.False(t, isDisabled)
428 }
429
430 func TestElementHandleIsEditableShouldWork(t *testing.T) {
431 BeforeEach(t)
432 defer AfterEach(t)
433 require.NoError(t, page.SetContent(`
434 <input id=input1 disabled><textarea></textarea><input id=input2>
435 `))
436 _, err := page.EvalOnSelector("textarea", "t => t.readOnly = true")
437 require.NoError(t, err)
438 input1, err := page.QuerySelector("#input1")
439 require.NoError(t, err)
440 isEditable, err := input1.IsEditable()
441 require.NoError(t, err)
442 require.False(t, isEditable)
443 isEditable, err = page.IsEditable("#input1")
444 require.NoError(t, err)
445 require.False(t, isEditable)
446
447 input2, err := page.QuerySelector("#input2")
448 require.NoError(t, err)
449 isEditable, err = input2.IsEditable()
450 require.NoError(t, err)
451 require.True(t, isEditable)
452 isEditable, err = page.IsEditable("#input2")
453 require.NoError(t, err)
454 require.True(t, isEditable)
455
456 textarea, err := page.QuerySelector("textarea")
457 require.NoError(t, err)
458 isEditable, err = textarea.IsEditable()
459 require.NoError(t, err)
460 require.False(t, isEditable)
461 isEditable, err = page.IsEditable("textarea")
462 require.NoError(t, err)
463 require.False(t, isEditable)
464 }
465
466 func TestElementHandleIsCheckedShouldWork(t *testing.T) {
467 BeforeEach(t)
468 defer AfterEach(t)
469 require.NoError(t, page.SetContent(`
470 <input type="checkbox" checked><div>Not a checkbox</div>
471 `))
472 handle, err := page.QuerySelector("input")
473 require.NoError(t, err)
474 isChecked, err := handle.IsChecked()
475 require.NoError(t, err)
476 require.True(t, isChecked)
477 isChecked, err = page.IsChecked("input")
478 require.NoError(t, err)
479 require.True(t, isChecked)
480
481 _, err = handle.Evaluate("input => input.checked = false")
482 require.NoError(t, err)
483 isChecked, err = handle.IsChecked()
484 require.NoError(t, err)
485 require.False(t, isChecked)
486 isChecked, err = page.IsChecked("input")
487 require.NoError(t, err)
488 require.False(t, isChecked)
489
490 _, err = page.IsChecked("div")
491 require.Contains(t, err.Error(), "Not a checkbox or radio button")
492 }
493
494 func TestElementHandleWaitForElementState(t *testing.T) {
495 BeforeEach(t)
496 defer AfterEach(t)
497 _, err := page.Goto(server.EMPTY_PAGE)
498 require.NoError(t, err)
499 require.NoError(t, page.SetContent("<div><p id='result'>test result</p></div>"))
500
501 handle, err := page.QuerySelector("#result")
502 require.NoError(t, err)
503 err = handle.WaitForElementState("visible")
504 require.NoError(t, err)
505 }
506
507 func TestElementHandleWaitForSelector(t *testing.T) {
508 BeforeEach(t)
509 defer AfterEach(t)
510 _, err := page.Goto(server.EMPTY_PAGE)
511 require.NoError(t, err)
512 require.NoError(t, page.SetContent("<div><p id='result'>test result</p></div>"))
513
514 div, err := page.QuerySelector("div")
515 require.NoError(t, err)
516
517 handle, err := div.WaitForSelector("#result", playwright.ElementHandleWaitForSelectorOptions{
518 State: playwright.WaitForSelectorStateAttached,
519 })
520 require.NoError(t, err)
521 text, err := handle.InnerText()
522 require.NoError(t, err)
523 require.Equal(t, "test result", text)
524 }
525
526 func TestElemetHandleFocus(t *testing.T) {
527 BeforeEach(t)
528 defer AfterEach(t)
529 _, err := page.Goto(server.EMPTY_PAGE)
530 require.NoError(t, err)
531 require.NoError(t, page.SetContent(`<button onfocus="window.clicked=true"/>`))
532 buttonElement, err := page.QuerySelector("button")
533 require.NoError(t, err)
534 require.NoError(t, buttonElement.Focus())
535 result, err := page.Evaluate("window.clicked")
536 require.NoError(t, err)
537 require.True(t, result.(bool))
538 }
539
540 func TestElementHandleInputValue(t *testing.T) {
541 BeforeEach(t)
542 defer AfterEach(t)
543 require.NoError(t, page.SetContent(`
544 <input></input>
545 `))
546 inputElement, err := page.QuerySelector("input")
547 require.NoError(t, err)
548 require.NoError(t, inputElement.Fill("test"))
549 value, err := inputElement.InputValue()
550 require.NoError(t, err)
551 require.Equal(t, "test", value)
552 require.NoError(t, inputElement.Fill(""))
553 value, err = inputElement.InputValue()
554 require.NoError(t, err)
555 require.Equal(t, "", value)
556 }
557
558 func TestElementHandleSetChecked(t *testing.T) {
559 BeforeEach(t)
560 defer AfterEach(t)
561 require.NoError(t, page.SetContent(`<input id='checkbox' type='checkbox'></input>`))
562 selectElement, err := page.QuerySelector("input")
563 require.NoError(t, err)
564 require.NoError(t, selectElement.SetChecked(true))
565 isChecked, err := page.Evaluate("checkbox.checked")
566 require.NoError(t, err)
567 require.True(t, isChecked.(bool))
568 require.NoError(t, selectElement.SetChecked(false))
569 isChecked, err = page.Evaluate("checkbox.checked")
570 require.NoError(t, err)
571 require.False(t, isChecked.(bool))
572 }
573
View as plain text