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