1from tests.support.asserts import assert_error, assert_is_active_element, assert_success
2
3
4def read_global(session, name):
5    return session.execute_script("return %s;" % name)
6
7
8def get_active_element(session):
9    return session.transport.send(
10        "GET", "session/{session_id}/element/active".format(**vars(session)))
11
12
13def test_no_top_browsing_context(session, closed_window):
14    response = get_active_element(session)
15    assert_error(response, "no such window")
16
17
18def test_no_browsing_context(session, closed_frame):
19    response = get_active_element(session)
20    assert_error(response, "no such window")
21
22
23def test_success_document(session, inline):
24    session.url = inline("""
25        <body>
26            <h1>Heading</h1>
27            <input />
28            <input />
29            <input style="opacity: 0" />
30            <p>Another element</p>
31        </body>""")
32
33    response = get_active_element(session)
34    element = assert_success(response)
35    assert_is_active_element(session, element)
36
37
38def test_sucess_input(session, inline):
39    session.url = inline("""
40        <body>
41            <h1>Heading</h1>
42            <input autofocus />
43            <input style="opacity: 0" />
44            <p>Another element</p>
45        </body>""")
46
47    response = get_active_element(session)
48    element = assert_success(response)
49    assert_is_active_element(session, element)
50
51
52def test_sucess_input_non_interactable(session, inline):
53    session.url = inline("""
54        <body>
55            <h1>Heading</h1>
56            <input />
57            <input style="opacity: 0" autofocus />
58            <p>Another element</p>
59        </body>""")
60
61    response = get_active_element(session)
62    element = assert_success(response)
63    assert_is_active_element(session, element)
64
65
66def test_success_explicit_focus(session, inline):
67    session.url = inline("""
68        <body>
69            <h1>Heading</h1>
70            <input />
71            <iframe></iframe>
72        </body>""")
73
74    session.execute_script("document.body.getElementsByTagName('h1')[0].focus()")
75    response = get_active_element(session)
76    element = assert_success(response)
77    assert_is_active_element(session, element)
78
79    session.execute_script("document.body.getElementsByTagName('input')[0].focus()")
80    response = get_active_element(session)
81    element = assert_success(response)
82    assert_is_active_element(session, element)
83
84    session.execute_script("document.body.getElementsByTagName('iframe')[0].focus()")
85    response = get_active_element(session)
86    element = assert_success(response)
87    assert_is_active_element(session, element)
88
89    session.execute_script("document.body.getElementsByTagName('iframe')[0].focus();")
90    session.execute_script("""
91        var iframe = document.body.getElementsByTagName('iframe')[0];
92        if (iframe.remove) {
93          iframe.remove();
94        } else {
95          iframe.removeNode(true);
96        }""")
97    response = get_active_element(session)
98    element = assert_success(response)
99    assert_is_active_element(session, element)
100
101    session.execute_script("document.body.appendChild(document.createElement('textarea'))")
102    response = get_active_element(session)
103    element = assert_success(response)
104    assert_is_active_element(session, element)
105
106
107def test_success_iframe_content(session, inline):
108    session.url = inline("<body></body>")
109    session.execute_script("""
110        let iframe = document.createElement('iframe');
111        document.body.appendChild(iframe);
112        let input = iframe.contentDocument.createElement('input');
113        iframe.contentDocument.body.appendChild(input);
114        input.focus();
115        """)
116
117    response = get_active_element(session)
118    element = assert_success(response)
119    assert_is_active_element(session, element)
120
121
122def test_missing_document_element(session, inline):
123    session.url = inline("<body></body>")
124    session.execute_script("""
125        if (document.body.remove) {
126          document.body.remove();
127        } else {
128          document.body.removeNode(true);
129        }""")
130
131    response = get_active_element(session)
132    assert_error(response, "no such element")
133