1import pytest 2 3from tests.support.asserts import assert_error, assert_success 4from tests.support.helpers import center_point 5 6 7def element_click(session, element): 8 return session.transport.send( 9 "POST", "session/{session_id}/element/{element_id}/click".format( 10 session_id=session.session_id, 11 element_id=element.id)) 12 13 14def square(inline, size): 15 return inline(""" 16 <style> 17 body {{ margin: 0 }} 18 19 div {{ 20 background: blue; 21 width: {size}px; 22 height: {size}px; 23 }} 24 </style> 25 26 <div id=target></div> 27 28 <script> 29 window.clicks = []; 30 let div = document.querySelector("div"); 31 div.addEventListener("click", function(e) {{ window.clicks.push([e.clientX, e.clientY]) }}); 32 </script> 33 """.format(size=size)) 34 35 36def assert_one_click(session): 37 """Asserts there has only been one click, and returns that.""" 38 clicks = session.execute_script("return window.clicks") 39 assert len(clicks) == 1 40 return tuple(clicks[0]) 41 42 43def test_entirely_in_view(session, inline): 44 session.url = square(inline, 444) 45 element = session.find.css("#target", all=False) 46 47 response = element_click(session, element) 48 assert_success(response) 49 50 click_point = assert_one_click(session) 51 assert click_point == (222, 222) 52 53 54@pytest.mark.parametrize("size", range(1, 11)) 55def test_css_pixel_rounding(session, inline, size): 56 session.url = square(inline, size) 57 element = session.find.css("#target", all=False) 58 expected_click_point = center_point(element) 59 60 response = element_click(session, element) 61 assert_success(response) 62 63 actual_click_point = assert_one_click(session) 64 assert actual_click_point == expected_click_point 65