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