1import pytest
2
3from tests.support.asserts import assert_error, assert_success
4
5
6def element_click(session, element):
7    return session.transport.send(
8        "POST", "session/{session_id}/element/{element_id}/click".format(
9            session_id=session.session_id,
10            element_id=element.id))
11
12
13def test_display_none(session, inline):
14    session.url = inline("""<button style="display: none">foobar</button>""")
15    element = session.find.css("button", all=False)
16
17    response = element_click(session, element)
18    assert_error(response, "element not interactable")
19
20
21def test_visibility_hidden(session, inline):
22    session.url = inline("""<button style="visibility: hidden">foobar</button>""")
23    element = session.find.css("button", all=False)
24
25    response = element_click(session, element)
26    assert_error(response, "element not interactable")
27
28
29def test_hidden(session, inline):
30    session.url = inline("<button hidden>foobar</button>")
31    element = session.find.css("button", all=False)
32
33    response = element_click(session, element)
34    assert_error(response, "element not interactable")
35
36
37def test_disabled(session, inline):
38    session.url = inline("""<button disabled>foobar</button>""")
39    element = session.find.css("button", all=False)
40
41    response = element_click(session, element)
42    assert_success(response)
43
44
45@pytest.mark.parametrize("transform", ["translate(-100px, -100px)", "rotate(50deg)"])
46def test_element_not_interactable_css_transform(session, inline, transform):
47    session.url = inline("""
48        <div style="width: 500px; height: 100px;
49            background-color: blue; transform: {transform};">
50            <input type=button>
51        </div>""".format(transform=transform))
52    element = session.find.css("input", all=False)
53    response = element_click(session, element)
54    assert_error(response, "element not interactable")
55
56
57def test_element_not_interactable_out_of_view(session, inline):
58    session.url = inline("""
59        <style>
60        input {
61          position: absolute;
62          margin-top: -100vh;
63          background: red;
64        }
65        </style>
66
67        <input>
68        """)
69    element = session.find.css("input", all=False)
70    response = element_click(session, element)
71    assert_error(response, "element not interactable")
72
73
74@pytest.mark.parametrize("tag_name", ["div", "span"])
75def test_zero_sized_element(session, inline, tag_name):
76    session.url = inline("<{0}></{0}>".format(tag_name))
77    element = session.find.css(tag_name, all=False)
78
79    response = element_click(session, element)
80    assert_error(response, "element not interactable")
81
82
83def test_element_intercepted(session, inline):
84    session.url = inline("""
85        <style>
86        div {
87          position: absolute;
88          height: 100vh;
89          width: 100vh;
90          background: blue;
91          top: 0;
92          left: 0;
93        }
94        </style>
95
96        <input type=button value=Roger>
97        <div></div>
98        """)
99    element = session.find.css("input", all=False)
100    response = element_click(session, element)
101    assert_error(response, "element click intercepted")
102
103
104def test_element_intercepted_no_pointer_events(session, inline):
105    session.url = inline("""<input type=button value=Roger style="pointer-events: none">""")
106    element = session.find.css("input", all=False)
107    response = element_click(session, element)
108    assert_error(response, "element click intercepted")
109
110
111def test_element_not_visible_overflow_hidden(session, inline):
112    session.url = inline("""
113        <style>
114        div {
115          overflow: hidden;
116          height: 50px;
117          background: green;
118        }
119
120        input {
121          margin-top: 100px;
122          background: red;
123        }
124        </style>
125
126        <div><input></div>
127        """)
128    element = session.find.css("input", all=False)
129    response = element_click(session, element)
130    assert_error(response, "element not interactable")
131