Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion playwright/element_handle.py
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ async def fill(self,
value: str,
timeout: int = None,
noWaitAfter: bool = None) -> None:
await self._channel.send('dblclick', locals_to_params(locals()))
await self._channel.send('fill', locals_to_params(locals()))

async def selectText(self, timeout: int = None) -> None:
await self._channel.send('selectText', locals_to_params(locals()))
Expand Down
2 changes: 2 additions & 0 deletions tests/assets/dom.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<div id="outer" name="value"><div id="inner">Text,
more text</div></div><input id="check" type=checkbox checked foo="bar&quot;">
69 changes: 69 additions & 0 deletions tests/assets/input/select.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<!DOCTYPE html>
<html>
<head>
<title>Selection Test</title>
</head>
<body>
<select>
<option value="black">Black</option>
<option value="blue">Blue</option>
<option value="brown">Brown</option>
<option value="cyan">Cyan</option>
<option value="gray">Gray</option>
<option value="green">Green</option>
<option value="indigo">Indigo</option>
<option value="magenta">Magenta</option>
<option value="orange">Orange</option>
<option value="pink">Pink</option>
<option value="purple">Purple</option>
<option value="red">Red</option>
<option value="violet">Violet</option>
<option value="white" id="whiteOption">White</option>
<option value="yellow">Yellow</option>
</select>
<script>
window.result = {
onInput: null,
onChange: null,
onBubblingChange: null,
onBubblingInput: null,
};

let select = document.querySelector('select');

function makeEmpty() {
for (let i = select.options.length - 1; i >= 0; --i) {
select.remove(i);
}
}

function makeMultiple() {
select.setAttribute('multiple', true);
}

select.addEventListener('input', () => {
result.onInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
return option.value;
});
}, false);

select.addEventListener('change', () => {
result.onChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
return option.value;
});
}, false);

document.body.addEventListener('input', () => {
result.onBubblingInput = Array.from(select.querySelectorAll('option:checked')).map((option) => {
return option.value;
});
}, false);

document.body.addEventListener('change', () => {
result.onBubblingChange = Array.from(select.querySelectorAll('option:checked')).map((option) => {
return option.value;
});
}, false);
</script>
</body>
</html>
95 changes: 93 additions & 2 deletions tests/test_element_handle.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,14 +154,14 @@ async def test_owner_frame_for_iframe_elements(page, server, utils):
await page.goto(server.EMPTY_PAGE)
await utils.attach_frame(page, 'frame1', server.EMPTY_PAGE)
frame = page.mainFrame
element_handle = await frame.evaluateHandle('() => document.querySelector("#frame1")')
element_handle = await frame.evaluateHandle('document.querySelector("#frame1")')
assert await element_handle.ownerFrame() == frame

async def test_owner_frame_for_cross_frame_evaluations(page, server, utils):
await page.goto(server.EMPTY_PAGE)
await utils.attach_frame(page, 'frame1', server.EMPTY_PAGE)
frame = page.mainFrame
element_handle = await frame.evaluateHandle('() => document.querySelector("#frame1").contentWindow.document.body')
element_handle = await frame.evaluateHandle('document.querySelector("#frame1").contentWindow.document.body')
assert await element_handle.ownerFrame() == frame.childFrames[0]

async def test_owner_frame_for_detached_elements(page, server):
Expand Down Expand Up @@ -289,3 +289,94 @@ async def test_hover_when_node_is_removed(page, server):
button = await page.querySelector('#button-6')
await button.hover()
assert await page.evaluate('document.querySelector("button:hover").id') == 'button-6'

async def test_should_fill_input(page, server):
await page.goto(server.PREFIX + '/input/textarea.html')
handle = await page.querySelector('input')
await handle.fill('some value')
assert await page.evaluate('result') == 'some value'

async def test_should_fill_input_when_Node_is_removed(page, server):
await page.goto(server.PREFIX + '/input/textarea.html')
await page.evaluate('delete window["Node"]')
handle = await page.querySelector('input')
await handle.fill('some value')
assert await page.evaluate('result') == 'some value'

async def test_should_have_a_nice_preview(page, server):
await page.goto(f'{server.PREFIX}/dom.html')
outer = await page.querySelector('#outer')
inner = await page.querySelector('#inner')
check = await page.querySelector('#check')
text = await inner.evaluateHandle('e => e.firstChild')
await page.evaluate('1') # Give them a chance to calculate the preview.
assert outer.toString() == 'JSHandle@<div id="outer" name="value">…</div>'
assert inner.toString() == 'JSHandle@<div id="inner">Text,↵more text</div>'
assert text.toString() == 'JSHandle@#text=Text,↵more text'
assert check.toString() == 'JSHandle@<input checked id="check" foo="bar"" type="checkbox"/>'

async def test_get_attribute(page, server):
await page.goto(f'{server.PREFIX}/dom.html')
handle = await page.querySelector('#outer')
assert await handle.getAttribute('name') == 'value'
assert await page.getAttribute('#outer', 'name') == 'value'

async def test_inner_html(page, server):
await page.goto(f'{server.PREFIX}/dom.html')
handle = await page.querySelector('#outer')
assert await handle.innerHTML() == '<div id="inner">Text,\nmore text</div>'
assert await page.innerHTML('#outer') == '<div id="inner">Text,\nmore text</div>'

async def test_inner_text(page, server):
await page.goto(f'{server.PREFIX}/dom.html')
handle = await page.querySelector('#inner')
assert await handle.innerText() == 'Text, more text'
assert await page.innerText('#inner') == 'Text, more text'

async def test_inner_text_should_throw(page, server):
await page.setContent('<svg>text</svg>')
error1 = None
try:
await page.innerText('svg')
except Error as e:
error1 = e
assert 'Not an HTMLElement' in error1.message
handle = await page.querySelector('svg')
error2 = None
try:
await handle.innerText()
except Error as e:
error2 = e
assert 'Not an HTMLElement' in error2.message

async def test_text_content(page, server):
await page.goto(f'{server.PREFIX}/dom.html')
handle = await page.querySelector('#inner')
assert await handle.textContent() == 'Text,\nmore text'
assert await page.textContent('#inner') == 'Text,\nmore text'

async def test_should_check_the_box(page):
await page.setContent('<input id="checkbox" type="checkbox"></input>')
input = await page.querySelector('input')
await input.check()
assert await page.evaluate('checkbox.checked')

async def test_should_uncheck_the_box(page):
await page.setContent('<input id="checkbox" type="checkbox" checked></input>')
input = await page.querySelector('input')
await input.uncheck()
assert await page.evaluate('checkbox.checked') == False

async def test_should_select_single_option(page, server):
await page.goto(server.PREFIX + '/input/select.html')
select = await page.querySelector('select')
await select.selectOption('blue')
assert await page.evaluate('result.onInput') == ['blue']
assert await page.evaluate('result.onChange') == ['blue']

async def test_should_focus_a_button(page, server):
await page.goto(server.PREFIX + '/input/button.html')
button = await page.querySelector('button')
assert await button.evaluate('button => document.activeElement === button') == False
await button.focus()
assert await button.evaluate('button => document.activeElement === button')