1from tests.support.asserts import assert_error, assert_success
2
3
4def element_send_keys(session, element, text):
5    return session.transport.send(
6        "POST", "/session/{session_id}/element/{element_id}/value".format(
7            session_id=session.session_id,
8            element_id=element.id),
9        {"text": text})
10
11
12def test_body_is_interactable(session, inline):
13    session.url = inline("""
14        <body onkeypress="document.querySelector('input').value += event.key">
15          <input>
16        </body>
17    """)
18
19    element = session.find.css("body", all=False)
20    result = session.find.css("input", all=False)
21
22    # By default body is the active element
23    assert session.active_element == element
24
25    response = element_send_keys(session, element, "foo")
26    assert_success(response)
27    assert session.active_element == element
28    assert result.property("value") == "foo"
29
30
31def test_document_element_is_interactable(session, inline):
32    session.url = inline("""
33        <html onkeypress="document.querySelector('input').value += event.key">
34          <input>
35        </html>
36    """)
37
38    body = session.find.css("body", all=False)
39    element = session.find.css(":root", all=False)
40    result = session.find.css("input", all=False)
41
42    # By default body is the active element
43    assert session.active_element == body
44
45    response = element_send_keys(session, element, "foo")
46    assert_success(response)
47    assert session.active_element == element
48    assert result.property("value") == "foo"
49
50
51def test_iframe_is_interactable(session, inline, iframe):
52    session.url = inline(iframe("""
53        <body onkeypress="document.querySelector('input').value += event.key">
54          <input>
55        </body>
56    """))
57
58    body = session.find.css("body", all=False)
59    frame = session.find.css("iframe", all=False)
60
61    # By default the body has the focus
62    assert session.active_element == body
63
64    response = element_send_keys(session, frame, "foo")
65    assert_success(response)
66    assert session.active_element == frame
67
68    # Any key events are immediately routed to the nested
69    # browsing context's active document.
70    session.switch_frame(frame)
71    result = session.find.css("input", all=False)
72    assert result.property("value") == "foo"
73
74
75def test_transparent_element(session, inline):
76    session.url = inline("""<input style="opacity: 0">""")
77    element = session.find.css("input", all=False)
78
79    response = element_send_keys(session, element, "foo")
80    assert_success(response)
81    assert element.property("value") == "foo"
82
83
84def test_readonly_element(session, inline):
85    session.url = inline("<input readonly>")
86    element = session.find.css("input", all=False)
87
88    response = element_send_keys(session, element, "foo")
89    assert_success(response)
90    assert element.property("value") == ""
91
92
93def test_obscured_element(session, inline):
94    session.url = inline("""
95      <input>
96      <div style="position: relative; top: -3em; height: 5em; background: blue;"></div>
97    """)
98    element = session.find.css("input", all=False)
99
100    response = element_send_keys(session, element, "foo")
101    assert_success(response)
102    assert element.property("value") == "foo"
103
104
105def test_not_a_focusable_element(session, inline):
106    session.url = inline("<div>foo</div>")
107    element = session.find.css("div", all=False)
108
109    response = element_send_keys(session, element, "foo")
110    assert_error(response, "element not interactable")
111
112
113def test_display_none(session, inline):
114    session.url = inline("""<input style="display: none">""")
115    element = session.find.css("input", all=False)
116
117    response = element_send_keys(session, element, "foo")
118    assert_error(response, "element not interactable")
119
120
121def test_visibility_hidden(session, inline):
122    session.url = inline("""<input style="visibility: hidden">""")
123    element = session.find.css("input", all=False)
124
125    response = element_send_keys(session, element, "foo")
126    assert_error(response, "element not interactable")
127
128
129def test_hidden(session, inline):
130    session.url = inline("<input hidden>")
131    element = session.find.css("input", all=False)
132
133    response = element_send_keys(session, element, "foo")
134    assert_error(response, "element not interactable")
135
136
137def test_disabled(session, inline):
138    session.url = inline("""<input disabled>""")
139    element = session.find.css("input", all=False)
140
141    response = element_send_keys(session, element, "foo")
142    assert_error(response, "element not interactable")
143