Bug 1433463 - WebDriver:ElementSendKeys should not run unfocussing steps. r=automatedtester

According to the WebDriver standard the Element Send Keys command
should not run the unfocussing steps.  Not blurring the element
causes the DOM "change" event not to fire, but the specification
only expects the "input" event to fire.

The standard does, however, expect the Element Clear command to
run the unfocussing steps and to blur the element for historical reasons.

MozReview-Commit-ID: FHD1whho0jT

--HG--
extra : rebase_source : a03f2befd3373a0e5a167deca012540887546a4b
This commit is contained in:
Andreas Tolfsen 2018-02-22 11:26:01 +00:00
Родитель 2f6a0dfa63
Коммит 52b1eae73c
4 изменённых файлов: 42 добавлений и 30 удалений

Просмотреть файл

@ -577,8 +577,6 @@ async function webdriverSendKeysToElement(el, value, a11y) {
} else {
event.sendKeysToElement(value, el, win);
}
el.blur();
}
async function legacySendKeysToElement(el, value, a11y) {

Просмотреть файл

@ -584741,7 +584741,7 @@
"testharness"
],
"service-workers/service-worker/svg-target-reftest.https.html": [
"c8d97ffed68ca40b4154bde36d9a0ca65d2e3816",
"9eb665d5cd1f62f2591130e372fd6dc1e9c61f64",
"reftest"
],
"service-workers/service-worker/synced-state.https.html": [
@ -592485,11 +592485,11 @@
"support"
],
"webdriver/tests/element_send_keys/form_controls.py": [
"7c4a249f9575a69268b5f2970a5623fc1724e6e1",
"a1ade96c599a336684ee5a46dbc1716aac8ed9ae",
"wdspec"
],
"webdriver/tests/element_send_keys/interactability.py": [
"bd5d26173017dc3cbdc282809028639a7b4a214a",
"197bf11c6cae354d9f3cc07f836a857345046e1c",
"wdspec"
],
"webdriver/tests/element_send_keys/scroll_into_view.py": [
@ -598777,7 +598777,7 @@
"support"
],
"workers/support/name-as-accidental-global.js": [
"530670268fae610b60066773ee475743b8498b53",
"5f75e855287f1a8b391498a3c567b68c75f56416",
"support"
],
"workers/support/name.js": [

Просмотреть файл

@ -1,6 +1,11 @@
import pytest
from tests.support.asserts import assert_error, assert_same_element, assert_success
from tests.support.asserts import (
assert_element_has_focus,
assert_error,
assert_same_element,
assert_success,
)
from tests.support.inline import inline
@ -17,7 +22,7 @@ def add_event_listeners(element):
element.session.execute_script("""
let [target] = arguments;
window.events = [];
for (let expected of ["focus", "blur", "change", "keypress", "keydown", "keyup", "input"]) {
for (let expected of ["focus", "change", "keypress", "keydown", "keyup", "input"]) {
target.addEventListener(expected, ({type}) => window.events.push(type));
}
""", args=(element,))
@ -34,6 +39,7 @@ def test_input(session):
element_send_keys(session, element, "foo")
assert element.property("value") == "foo"
assert_element_has_focus(element)
def test_textarea(session):
@ -43,6 +49,7 @@ def test_textarea(session):
element_send_keys(session, element, "foo")
assert element.property("value") == "foo"
assert_element_has_focus(element)
def test_input_append(session):
@ -89,6 +96,13 @@ def test_events(session, tag):
"keydown",
"keypress",
"input",
"keyup",
"change",
"blur"]
"keyup"]
@pytest.mark.parametrize("tag", ["input", "textarea"])
def test_not_blurred(session, tag):
session.url = inline("<%s>" % tag)
element = session.find.css(tag, all=False)
element_send_keys(session, element, "")
assert_element_has_focus(element)

Просмотреть файл

@ -1,4 +1,4 @@
from tests.support.asserts import assert_error, assert_same_element, assert_success
from tests.support.asserts import assert_error, assert_success
from tests.support.inline import iframe, inline
@ -13,8 +13,8 @@ def send_keys_to_element(session, element, text):
def test_body_is_interactable(session):
session.url = inline("""
<body onkeypress="document.getElementById('result').value += event.key">
<input type="text" id="result"/>
<body onkeypress="document.querySelector('input').value += event.key">
<input>
</body>
""")
@ -22,18 +22,18 @@ def test_body_is_interactable(session):
result = session.find.css("input", all=False)
# By default body is the active element
assert_same_element(session, element, session.active_element)
assert session.active_element is element
response = send_keys_to_element(session, element, "foo")
assert_success(response)
assert_same_element(session, element, session.active_element)
assert session.active_element is element
assert result.property("value") == "foo"
def test_document_element_is_interactable(session):
session.url = inline("""
<html onkeypress="document.getElementById('result').value += event.key">
<input type="text" id="result"/>
<html onkeypress="document.querySelector('input').value += event.key">
<input>
</html>
""")
@ -42,18 +42,18 @@ def test_document_element_is_interactable(session):
result = session.find.css("input", all=False)
# By default body is the active element
assert_same_element(session, body, session.active_element)
assert session.active_element is body
response = send_keys_to_element(session, element, "foo")
assert_success(response)
assert_same_element(session, body, session.active_element)
assert session.active_element is element
assert result.property("value") == "foo"
def test_iframe_is_interactable(session):
session.url = inline(iframe("""
<body onkeypress="document.getElementById('result').value += event.key">
<input type="text" id="result"/>
<body onkeypress="document.querySelector('input').value += event.key">
<input>
</body>
"""))
@ -61,11 +61,11 @@ def test_iframe_is_interactable(session):
frame = session.find.css("iframe", all=False)
# By default the body has the focus
assert_same_element(session, body, session.active_element)
assert session.active_element is body
response = send_keys_to_element(session, frame, "foo")
assert_success(response)
assert_same_element(session, body, session.active_element)
assert session.active_element is frame
# Any key events are immediately routed to the nested
# browsing context's active document.
@ -75,7 +75,7 @@ def test_iframe_is_interactable(session):
def test_transparent_element(session):
session.url = inline("<input style=\"opacity: 0;\">")
session.url = inline("""<input style="opacity: 0">""")
element = session.find.css("input", all=False)
response = send_keys_to_element(session, element, "foo")
@ -94,8 +94,8 @@ def test_readonly_element(session):
def test_obscured_element(session):
session.url = inline("""
<input type="text" />
<div style="position: relative; top: -3em; height: 5em; background-color: blue"></div>
<input>
<div style="position: relative; top: -3em; height: 5em; background: blue;"></div>
""")
element = session.find.css("input", all=False)
@ -113,7 +113,7 @@ def test_not_a_focusable_element(session):
def test_not_displayed_element(session):
session.url = inline("<input style=\"display: none\">")
session.url = inline("""<input style="display: none">""")
element = session.find.css("input", all=False)
response = send_keys_to_element(session, element, "foo")
@ -121,7 +121,7 @@ def test_not_displayed_element(session):
def test_hidden_element(session):
session.url = inline("<input style=\"visibility: hidden\">")
session.url = inline("""<input style="visibility: hidden">""")
element = session.find.css("input", all=False)
response = send_keys_to_element(session, element, "foo")
@ -129,7 +129,7 @@ def test_hidden_element(session):
def test_disabled_element(session):
session.url = inline("<input disabled=\"false\">")
session.url = inline("""<input disabled>""")
element = session.find.css("input", all=False)
response = send_keys_to_element(session, element, "foo")