1import pytest
2
3from tests.support.asserts import assert_error, assert_success
4
5
6def get_element_property(session, element_id, prop):
7    return session.transport.send(
8        "GET", "session/{session_id}/element/{element_id}/property/{prop}".format(
9            session_id=session.session_id,
10            element_id=element_id,
11            prop=prop))
12
13
14def test_no_top_browsing_context(session, closed_window):
15    original_handle, element = closed_window
16    response = get_element_property(session, element.id, "value")
17    assert_error(response, "no such window")
18    response = get_element_property(session, "foo", "id")
19    assert_error(response, "no such window")
20
21    session.window_handle = original_handle
22    response = get_element_property(session, element.id, "value")
23    assert_error(response, "no such element")
24
25
26def test_no_browsing_context(session, closed_frame):
27    response = get_element_property(session, "foo", "id")
28    assert_error(response, "no such window")
29
30
31def test_element_not_found(session):
32    response = get_element_property(session, "foo", "id")
33    assert_error(response, "no such element")
34
35
36def test_element_stale(session, inline):
37    session.url = inline("<input id=foobar>")
38    element = session.find.css("input", all=False)
39    session.refresh()
40
41    response = get_element_property(session, element.id, "id")
42    assert_error(response, "stale element reference")
43
44
45def test_property_non_existent(session, inline):
46    session.url = inline("<input>")
47    element = session.find.css("input", all=False)
48
49    response = get_element_property(session, element.id, "foo")
50    assert_success(response, None)
51    assert session.execute_script("return arguments[0].foo", args=(element,)) is None
52
53
54def test_content_attribute(session, inline):
55    session.url = inline("<input value=foobar>")
56    element = session.find.css("input", all=False)
57
58    response = get_element_property(session, element.id, "value")
59    assert_success(response, "foobar")
60
61
62def test_idl_attribute(session, inline):
63    session.url = inline("<input value=foo>")
64    element = session.find.css("input", all=False)
65    session.execute_script("""arguments[0].value = "bar";""", args=(element,))
66
67    response = get_element_property(session, element.id, "value")
68    assert_success(response, "bar")
69
70
71@pytest.mark.parametrize("js_primitive,py_primitive", [
72    ("\"foobar\"", "foobar"),
73    (42, 42),
74    ([], []),
75    ({}, {}),
76    ("null", None),
77    ("undefined", None),
78])
79def test_primitives(session, inline, js_primitive, py_primitive):
80    session.url = inline("""
81        <input>
82
83        <script>
84        const input = document.querySelector("input");
85        input.foobar = {js_primitive};
86        </script>
87        """.format(js_primitive=js_primitive))
88    element = session.find.css("input", all=False)
89
90    response = get_element_property(session, element.id, "foobar")
91    assert_success(response, py_primitive)
92
93
94@pytest.mark.parametrize("js_primitive,py_primitive", [
95    ("\"foobar\"", "foobar"),
96    (42, 42),
97    ([], []),
98    ({}, {}),
99    ("null", None),
100    ("undefined", None),
101])
102def test_primitives_set_by_execute_script(session, inline, js_primitive, py_primitive):
103    session.url = inline("<input>")
104    element = session.find.css("input", all=False)
105    session.execute_script("arguments[0].foobar = {}".format(js_primitive), args=(element,))
106
107    response = get_element_property(session, element.id, "foobar")
108    assert_success(response, py_primitive)
109
110
111def test_mutated_element(session, inline):
112    session.url = inline("<input type=checkbox>")
113    element = session.find.css("input", all=False)
114    element.click()
115
116    checked = session.execute_script("""
117        return arguments[0].hasAttribute('checked')
118        """, args=(element,))
119    assert checked is False
120
121    response = get_element_property(session, element.id, "checked")
122    assert_success(response, True)
123
124
125@pytest.mark.parametrize("is_relative", [True, False], ids=["relative", "absolute"])
126def test_anchor_href(session, inline, url, is_relative):
127    href = "/foo.html" if is_relative else url("/foo.html")
128
129    session.url = inline("<a href='{}'>foo</a>".format(href))
130    element = session.find.css("a", all=False)
131
132    response = get_element_property(session, element.id, "href")
133    assert_success(response, url("/foo.html"))
134