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