Skip to content

Commit 3aefe16

Browse files
authored
test(elementhandle): generate more tests (#18)
1 parent a7d7cc8 commit 3aefe16

File tree

4 files changed

+165
-3
lines changed

4 files changed

+165
-3
lines changed

playwright/element_handle.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ async def fill(self,
9393
value: str,
9494
timeout: int = None,
9595
noWaitAfter: bool = None) -> None:
96-
await self._channel.send('dblclick', locals_to_params(locals()))
96+
await self._channel.send('fill', locals_to_params(locals()))
9797

9898
async def selectText(self, timeout: int = None) -> None:
9999
await self._channel.send('selectText', locals_to_params(locals()))

tests/assets/dom.html

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
<div id="outer" name="value"><div id="inner">Text,
2+
more text</div></div><input id="check" type=checkbox checked foo="bar&quot;">

tests/assets/input/select.html

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Selection Test</title>
5+
</head>
6+
<body>
7+
<select>
8+
<option value="black">Black</option>
9+
<option value="blue">Blue</option>
10+
<option value="brown">Brown</option>
11+
<option value="cyan">Cyan</option>
12+
<option value="gray">Gray</option>
13+
<option value="green">Green</option>
14+
<option value="indigo">Indigo</option>
15+
<option value="magenta">Magenta</option>
16+
<option value="orange">Orange</option>
17+
<option value="pink">Pink</option>
18+
<option value="purple">Purple</option>
19+
<option value="red">Red</option>
20+
<option value="violet">Violet</option>
21+
<option value="white" id="whiteOption">White</option>
22+
<option value="yellow">Yellow</option>
23+
</select>
24+
<script>
25+
window.result = {
26+
onInput: null,
27+
onChange: null,
28+
onBubblingChange: null,
29+
onBubblingInput: null,
30+
};
31+
32+
let select = document.querySelector('select');
33+
34+
function makeEmpty() {
35+
for (let i = select.options.length - 1; i >= 0; --i) {
36+
select.remove(i);
37+
}
38+
}
39+
40+
function makeMultiple() {
41+
select.setAttribute('multiple', true);
42+
}
43+
44+
select.addEventListener('input', () => {
45+
result.onInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
46+
return option.value;
47+
});
48+
}, false);
49+
50+
select.addEventListener('change', () => {
51+
result.onChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
52+
return option.value;
53+
});
54+
}, false);
55+
56+
document.body.addEventListener('input', () => {
57+
result.onBubblingInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
58+
return option.value;
59+
});
60+
}, false);
61+
62+
document.body.addEventListener('change', () => {
63+
result.onBubblingChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
64+
return option.value;
65+
});
66+
}, false);
67+
</script>
68+
</body>
69+
</html>

tests/test_element_handle.py

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,14 +154,14 @@ async def test_owner_frame_for_iframe_elements(page, server, utils):
154154
await page.goto(server.EMPTY_PAGE)
155155
await utils.attach_frame(page, 'frame1', server.EMPTY_PAGE)
156156
frame = page.mainFrame
157-
element_handle = await frame.evaluateHandle('() => document.querySelector("#frame1")')
157+
element_handle = await frame.evaluateHandle('document.querySelector("#frame1")')
158158
assert await element_handle.ownerFrame() == frame
159159

160160
async def test_owner_frame_for_cross_frame_evaluations(page, server, utils):
161161
await page.goto(server.EMPTY_PAGE)
162162
await utils.attach_frame(page, 'frame1', server.EMPTY_PAGE)
163163
frame = page.mainFrame
164-
element_handle = await frame.evaluateHandle('() => document.querySelector("#frame1").contentWindow.document.body')
164+
element_handle = await frame.evaluateHandle('document.querySelector("#frame1").contentWindow.document.body')
165165
assert await element_handle.ownerFrame() == frame.childFrames[0]
166166

167167
async def test_owner_frame_for_detached_elements(page, server):
@@ -289,3 +289,94 @@ async def test_hover_when_node_is_removed(page, server):
289289
button = await page.querySelector('#button-6')
290290
await button.hover()
291291
assert await page.evaluate('document.querySelector("button:hover").id') == 'button-6'
292+
293+
async def test_should_fill_input(page, server):
294+
await page.goto(server.PREFIX + '/input/textarea.html')
295+
handle = await page.querySelector('input')
296+
await handle.fill('some value')
297+
assert await page.evaluate('result') == 'some value'
298+
299+
async def test_should_fill_input_when_Node_is_removed(page, server):
300+
await page.goto(server.PREFIX + '/input/textarea.html')
301+
await page.evaluate('delete window["Node"]')
302+
handle = await page.querySelector('input')
303+
await handle.fill('some value')
304+
assert await page.evaluate('result') == 'some value'
305+
306+
async def test_should_have_a_nice_preview(page, server):
307+
await page.goto(f'{server.PREFIX}/dom.html')
308+
outer = await page.querySelector('#outer')
309+
inner = await page.querySelector('#inner')
310+
check = await page.querySelector('#check')
311+
text = await inner.evaluateHandle('e => e.firstChild')
312+
await page.evaluate('1') # Give them a chance to calculate the preview.
313+
assert outer.toString() == 'JSHandle@<div id="outer" name="value">…</div>'
314+
assert inner.toString() == 'JSHandle@<div id="inner">Text,↵more text</div>'
315+
assert text.toString() == 'JSHandle@#text=Text,↵more text'
316+
assert check.toString() == 'JSHandle@<input checked id="check" foo="bar"" type="checkbox"/>'
317+
318+
async def test_get_attribute(page, server):
319+
await page.goto(f'{server.PREFIX}/dom.html')
320+
handle = await page.querySelector('#outer')
321+
assert await handle.getAttribute('name') == 'value'
322+
assert await page.getAttribute('#outer', 'name') == 'value'
323+
324+
async def test_inner_html(page, server):
325+
await page.goto(f'{server.PREFIX}/dom.html')
326+
handle = await page.querySelector('#outer')
327+
assert await handle.innerHTML() == '<div id="inner">Text,\nmore text</div>'
328+
assert await page.innerHTML('#outer') == '<div id="inner">Text,\nmore text</div>'
329+
330+
async def test_inner_text(page, server):
331+
await page.goto(f'{server.PREFIX}/dom.html')
332+
handle = await page.querySelector('#inner')
333+
assert await handle.innerText() == 'Text, more text'
334+
assert await page.innerText('#inner') == 'Text, more text'
335+
336+
async def test_inner_text_should_throw(page, server):
337+
await page.setContent('<svg>text</svg>')
338+
error1 = None
339+
try:
340+
await page.innerText('svg')
341+
except Error as e:
342+
error1 = e
343+
assert 'Not an HTMLElement' in error1.message
344+
handle = await page.querySelector('svg')
345+
error2 = None
346+
try:
347+
await handle.innerText()
348+
except Error as e:
349+
error2 = e
350+
assert 'Not an HTMLElement' in error2.message
351+
352+
async def test_text_content(page, server):
353+
await page.goto(f'{server.PREFIX}/dom.html')
354+
handle = await page.querySelector('#inner')
355+
assert await handle.textContent() == 'Text,\nmore text'
356+
assert await page.textContent('#inner') == 'Text,\nmore text'
357+
358+
async def test_should_check_the_box(page):
359+
await page.setContent('<input id="checkbox" type="checkbox"></input>')
360+
input = await page.querySelector('input')
361+
await input.check()
362+
assert await page.evaluate('checkbox.checked')
363+
364+
async def test_should_uncheck_the_box(page):
365+
await page.setContent('<input id="checkbox" type="checkbox" checked></input>')
366+
input = await page.querySelector('input')
367+
await input.uncheck()
368+
assert await page.evaluate('checkbox.checked') == False
369+
370+
async def test_should_select_single_option(page, server):
371+
await page.goto(server.PREFIX + '/input/select.html')
372+
select = await page.querySelector('select')
373+
await select.selectOption('blue')
374+
assert await page.evaluate('result.onInput') == ['blue']
375+
assert await page.evaluate('result.onChange') == ['blue']
376+
377+
async def test_should_focus_a_button(page, server):
378+
await page.goto(server.PREFIX + '/input/button.html')
379+
button = await page.querySelector('button')
380+
assert await button.evaluate('button => document.activeElement === button') == False
381+
await button.focus()
382+
assert await button.evaluate('button => document.activeElement === button')

0 commit comments

Comments
 (0)