def test_drag_and_drop(session, test_actions_page, mouse_chain, dx, dy, drag_duration): drag_target = session.find.css("#dragTarget", all=False) initial_rect = drag_target.rect initial_center = get_inview_center(initial_rect, get_viewport_rect(session)) # Conclude chain with extra move to allow time for last queued # coordinate-update of drag_target and to test that drag_target is "dropped". mouse_chain \ .pointer_move(0, 0, origin=drag_target) \ .pointer_down() \ .pointer_move(dx, dy, duration=drag_duration, origin="pointer") \ .pointer_up() \ .pointer_move(80, 50, duration=100, origin="pointer") \ .perform() # mouseup that ends the drag is at the expected destination e = get_events(session)[1] assert e["type"] == "mouseup" assert pytest.approx(e["pageX"], initial_center["x"] + dx) assert pytest.approx(e["pageY"], initial_center["y"] + dy) # check resulting location of the dragged element final_rect = drag_target.rect assert initial_rect["x"] + dx == final_rect["x"] assert initial_rect["y"] + dy == final_rect["y"]
def test_element_center_point_with_offset(session, mouse_chain): session.url = origin_doc("width: 100px; height: 50px; background: green;") elem = session.find.css("#inner", all=False) center = get_inview_center(elem.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(10, 15, origin=elem) \ .perform() click_coords = get_click_coordinates(session) assert pytest.approx(click_coords["x"], center["x"] + 10) assert pytest.approx(click_coords["y"], center["y"] + 15)
def test_element_larger_than_viewport(session, mouse_chain): session.url = origin_doc("width: 300vw; height: 300vh; background: green;") elem = session.find.css("#inner", all=False) center = get_inview_center(elem.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(0, 0, origin=elem) \ .perform() click_coords = get_click_coordinates(session) assert pytest.approx(click_coords["x"], center["x"]) assert pytest.approx(click_coords["y"], center["y"])
def test_click_element_center(session, test_actions_page, mouse_chain): outer = session.find.css("#outer", all=False) center = get_inview_center(outer.rect, get_viewport_rect(session)) mouse_chain.click(element=outer).perform() events = get_events(session) assert len(events) == 4 event_types = [e["type"] for e in events] assert ["mousemove", "mousedown", "mouseup", "click"] == event_types for e in events: if e["type"] != "mousemove": assert pytest.approx(e["pageX"], center["x"]) assert pytest.approx(e["pageY"], center["y"]) assert e["target"] == "outer"
def test_element_in_view_center_point_partly_visible(session, mouse_chain): session.url = origin_doc("""width: 100px; height: 50px; background: green; position: relative; left: -50px; top: -25px;""") elem = session.find.css("#inner", all=False) center = get_inview_center(elem.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(0, 0, origin=elem) \ .perform() click_coords = get_click_coordinates(session) assert pytest.approx(click_coords["x"], center["x"]) assert pytest.approx(click_coords["y"], center["y"])
def test_click_element_center(session, test_actions_page, mouse_chain): outer = session.find.css("#outer", all=False) center = get_inview_center(outer.rect, get_viewport_rect(session)) mouse_chain.click(element=outer).perform() events = get_events(session) assert len(events) == 4 event_types = [e["type"] for e in events] assert ["mousemove", "mousedown", "mouseup", "click"] == event_types for e in events: if e["type"] != "mousemove": assert e["pageX"] == pytest.approx(center["x"], abs=1.0) assert e["pageY"] == pytest.approx(center["y"], abs=1.0) assert e["target"] == "outer"
def test_element_in_view_center_point_partly_visible(session, mouse_chain): session.url = origin_doc("""width: 100px; height: 50px; background: green; position: relative; left: -50px; top: -25px;""" ) elem = session.find.css("#inner", all=False) center = get_inview_center(elem.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(0, 0, origin=elem) \ .perform() click_coords = get_click_coordinates(session) assert pytest.approx(click_coords["x"], center["x"]) assert pytest.approx(click_coords["y"], center["y"])
def test_dblclick_with_pause_after_second_pointerdown(session, test_actions_page, mouse_chain): outer = session.find.css("#outer", all=False) center = get_inview_center(outer.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(int(center["x"]), int(center["y"])) \ .click() \ .pointer_down() \ .pause(_DBLCLICK_INTERVAL + 10) \ .pointer_up() \ .perform() events = get_events(session) expected = [ { "type": "mousedown", "button": 0 }, { "type": "mouseup", "button": 0 }, { "type": "click", "button": 0 }, { "type": "mousedown", "button": 0 }, { "type": "mouseup", "button": 0 }, { "type": "click", "button": 0 }, { "type": "dblclick", "button": 0 }, ] assert len(events) == 8 filtered_events = [filter_dict(e, expected[0]) for e in events] assert expected == filtered_events[1:]
def test_pen_pointer_properties(session, test_actions_pointer_page, pen_chain): pointerArea = session.find.css("#pointerArea", all=False) center = get_inview_center(pointerArea.rect, get_viewport_rect(session)) pen_chain.pointer_move(0, 0, origin=pointerArea) \ .pointer_down(pressure=0.36, tilt_x=-72, tilt_y=9, twist=86) \ .pointer_move(10, 10, origin=pointerArea) \ .pointer_up() \ .pointer_move(80, 50, origin=pointerArea) \ .perform() events = get_events(session) assert len(events) == 10 event_types = [e["type"] for e in events] assert [ "pointerover", "pointerenter", "pointermove", "pointerdown", "pointerover", "pointerenter", "pointermove", "pointerup", "pointerout", "pointerleave" ] == event_types assert events[3]["type"] == "pointerdown" assert events[3]["pageX"] == pytest.approx(center["x"], abs=1.0) assert events[3]["pageY"] == pytest.approx(center["y"], abs=1.0) assert events[3]["target"] == "pointerArea" assert events[3]["pointerType"] == "pen" # The default value of width and height for mouse and pen inputs is 1 assert round(events[3]["width"], 2) == 1 assert round(events[3]["height"], 2) == 1 assert round(events[3]["pressure"], 2) == 0.36 assert events[3]["tiltX"] == -72 assert events[3]["tiltY"] == 9 assert events[3]["twist"] == 86 assert events[6]["type"] == "pointermove" assert events[6]["pageX"] == pytest.approx(center["x"] + 10, abs=1.0) assert events[6]["pageY"] == pytest.approx(center["y"] + 10, abs=1.0) assert events[6]["target"] == "pointerArea" assert events[6]["pointerType"] == "pen" assert round(events[6]["width"], 2) == 1 assert round(events[6]["height"], 2) == 1 # The default value of pressure for all inputs is 0.5, other properties are 0 assert round(events[6]["pressure"], 2) == 0.5 assert events[6]["tiltX"] == 0 assert events[6]["tiltY"] == 0 assert events[6]["twist"] == 0
def test_no_dblclick(session, test_actions_page, mouse_chain): outer = session.find.css("#outer", all=False) center = get_inview_center(outer.rect, get_viewport_rect(session)) mouse_chain \ .pointer_move(int(center["x"]), int(center["y"])) \ .click() \ .pause(_DBLCLICK_INTERVAL + 10) \ .click() \ .perform() events = get_events(session) expected = [ {"type": "mousedown", "button": 0}, {"type": "mouseup", "button": 0}, {"type": "click", "button": 0}, {"type": "mousedown", "button": 0}, {"type": "mouseup", "button": 0}, {"type": "click", "button": 0}, ] assert len(events) == 7 filtered_events = [filter_dict(e, expected[0]) for e in events] assert expected == filtered_events[1:]
def test_touch_pointer_properties(session, test_actions_pointer_page, touch_chain): pointerArea = session.find.css("#pointerArea", all=False) center = get_inview_center(pointerArea.rect, get_viewport_rect(session)) touch_chain.pointer_move(0, 0, origin=pointerArea) \ .pointer_down(width=23, height=31, pressure=0.78, tilt_x=21, tilt_y=-8, twist=355) \ .pointer_move(10, 10, origin=pointerArea, width=39, height=35, pressure=0.91, tilt_x=-19, tilt_y=62, twist=345) \ .pointer_up() \ .pointer_move(80, 50, origin=pointerArea) \ .perform() events = get_events(session) assert len(events) == 7 event_types = [e["type"] for e in events] assert [ "pointerover", "pointerenter", "pointerdown", "pointermove", "pointerup", "pointerout", "pointerleave" ] == event_types assert events[2]["type"] == "pointerdown" assert events[2]["pageX"] == pytest.approx(center["x"], abs=1.0) assert events[2]["pageY"] == pytest.approx(center["y"], abs=1.0) assert events[2]["target"] == "pointerArea" assert events[2]["pointerType"] == "touch" assert round(events[2]["width"], 2) == 23 assert round(events[2]["height"], 2) == 31 assert round(events[2]["pressure"], 2) == 0.78 assert events[2]["tiltX"] == 21 assert events[2]["tiltY"] == -8 assert events[2]["twist"] == 355 assert events[3]["type"] == "pointermove" assert events[3]["pageX"] == pytest.approx(center["x"] + 10, abs=1.0) assert events[3]["pageY"] == pytest.approx(center["y"] + 10, abs=1.0) assert events[3]["target"] == "pointerArea" assert events[3]["pointerType"] == "touch" assert round(events[3]["width"], 2) == 39 assert round(events[3]["height"], 2) == 35 assert round(events[3]["pressure"], 2) == 0.91 assert events[3]["tiltX"] == -19 assert events[3]["tiltY"] == 62 assert events[3]["twist"] == 345
def test_drag_and_drop(session, test_actions_page, mouse_chain, dx, dy, drag_duration): drag_target = session.find.css("#dragTarget", all=False) initial_rect = drag_target.rect initial_center = get_inview_center(initial_rect, get_viewport_rect(session)) # Conclude chain with extra move to allow time for last queued # coordinate-update of drag_target and to test that drag_target is "dropped". mouse_chain \ .pointer_move(0, 0, origin=drag_target) \ .pointer_down() \ .pointer_move(dx, dy, duration=drag_duration, origin="pointer") \ .pointer_up() \ .pointer_move(80, 50, duration=100, origin="pointer") \ .perform() # mouseup that ends the drag is at the expected destination e = get_events(session)[1] assert e["type"] == "mouseup" assert e["pageX"] == pytest.approx(initial_center["x"] + dx, abs=1.0) assert e["pageY"] == pytest.approx(initial_center["y"] + dy, abs=1.0) # check resulting location of the dragged element final_rect = drag_target.rect assert initial_rect["x"] + dx == final_rect["x"] assert initial_rect["y"] + dy == final_rect["y"]