def test_sequence_of_keydown_printable_keys_sends_events( session, key_reporter, key_chain): key_chain \ .key_down("a") \ .key_down("b") \ .perform() expected = [ { "code": "KeyA", "key": "a", "type": "keydown" }, { "code": "KeyA", "key": "a", "type": "keypress" }, { "code": "KeyB", "key": "b", "type": "keydown" }, { "code": "KeyB", "key": "b", "type": "keypress" }, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected assert get_keys(key_reporter) == "ab"
def test_webdriver_special_key_sends_keydown(session, key_reporter, key_chain, name, expected): if name.startswith("F"): # Prevent default behavior for F1, etc., but only after keydown # bubbles up to body. (Otherwise activated browser menus/functions # may interfere with subsequent tests.) session.execute_script(""" document.body.addEventListener("keydown", (e) => e.preventDefault()); """) key_chain.key_down(getattr(Keys, name)).perform() # only interested in keydown first_event = get_events(session)[0] # make a copy so we can throw out irrelevant keys and compare to events expected = dict(expected) del expected["value"] # check and remove keys that aren't in expected assert first_event["type"] == "keydown" assert first_event["repeat"] == False first_event = filter_dict(first_event, expected) assert first_event == expected # only printable characters should be recorded in input field entered_keys = get_keys(key_reporter) if len(expected["key"]) == 1: assert entered_keys == expected["key"] else: assert len(entered_keys) == 0
def test_single_nonprintable_key_sends_events(session, key_reporter, key_chain, value, code, key): key_chain \ .key_down(value) \ .key_up(value) \ .perform() expected = [ { "code": code, "key": key, "type": "keydown" }, { "code": code, "key": key, "type": "keypress" }, { "code": code, "key": key, "type": "keyup" }, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] if len(events) == 2: # most browsers don't send a keypress for non-printable keys assert events == [expected[0], expected[2]] else: assert events == expected assert len(get_keys(key_reporter)) == 0
def test_click_at_coordinates(session, test_actions_page, mouse_chain): div_point = { "x": 82, "y": 187, } button = 0 mouse_chain \ .pointer_move(div_point["x"], div_point["y"], duration=1000) \ .pointer_down(button) \ .pointer_up(button) \ .perform() events = get_events(session) assert len(events) == 4 for e in events: if e["type"] != "mousemove": assert e["pageX"] == div_point["x"] assert e["pageY"] == div_point["y"] assert e["target"] == "outer" if e["type"] != "mousedown": assert e["buttons"] == 0 assert e["button"] == button expected = [ {"type": "mousedown", "buttons": 1}, {"type": "mouseup", "buttons": 0}, {"type": "click", "buttons": 0}, ] filtered_events = [filter_dict(e, expected[0]) for e in events] assert expected == filtered_events[1:]
def test_click_at_coordinates(session, test_actions_page, mouse_chain): div_point = { "x": 82, "y": 187, } mouse_chain \ .pointer_move(div_point["x"], div_point["y"], duration=1000) \ .click() \ .perform() events = get_events(session) assert len(events) == 4 for e in events: if e["type"] != "mousemove": assert e["pageX"] == div_point["x"] assert e["pageY"] == div_point["y"] assert e["target"] == "outer" if e["type"] != "mousedown": assert e["buttons"] == 0 assert e["button"] == 0 expected = [ { "type": "mousedown", "buttons": 1 }, { "type": "mouseup", "buttons": 0 }, { "type": "click", "buttons": 0 }, ] filtered_events = [filter_dict(e, expected[0]) for e in events] assert expected == filtered_events[1:]
def test_control_click(session, test_actions_page, key_chain, mouse_chain, modifier, prop): key_chain \ .pause(0) \ .key_down(modifier) \ .pause(200) \ .key_up(modifier) outer = session.find.css("#outer", all=False) mouse_chain.click(element=outer) session.actions.perform([key_chain.dict, mouse_chain.dict]) expected = [ {"type": "mousemove"}, {"type": "mousedown"}, {"type": "mouseup"}, {"type": "click"}, ] defaults = { "altKey": False, "metaKey": False, "shiftKey": False, "ctrlKey": False } for e in expected: e.update(defaults) if e["type"] != "mousemove": e[prop] = True filtered_events = [filter_dict(e, expected[0]) for e in get_events(session)] assert expected == filtered_events
def test_release_control_click(session, key_reporter, key_chain, mouse_chain): key_chain \ .pause(0) \ .key_down(Keys.CONTROL) mouse_chain \ .pointer_move(0, 0, origin=key_reporter) \ .pointer_down() session.actions.perform([key_chain.dict, mouse_chain.dict]) session.execute_script(""" var keyReporter = document.getElementById("keys"); ["mousedown", "mouseup"].forEach((e) => { keyReporter.addEventListener(e, recordPointerEvent); }); resetEvents(); """) session.actions.release() expected = [ { "type": "mouseup" }, { "type": "keyup" }, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected
def test_single_printable_key_sends_correct_events(session, key_reporter, key_chain, value, code): key_chain \ .key_down(value) \ .key_up(value) \ .perform() expected = [ { "code": code, "key": value, "type": "keydown" }, { "code": code, "key": value, "type": "keypress" }, { "code": code, "key": value, "type": "keyup" }, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected assert get_keys(key_reporter) == value
def test_sequence_of_keydown_character_keys(session, key_reporter, key_chain): key_chain.send_keys("ef").perform() expected = [ {"code": "KeyE", "key": "e", "type": "keydown"}, {"code": "KeyE", "key": "e", "type": "keypress"}, {"code": "KeyE", "key": "e", "type": "keyup"}, {"code": "KeyF", "key": "f", "type": "keydown"}, {"code": "KeyF", "key": "f", "type": "keypress"}, {"code": "KeyF", "key": "f", "type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected assert get_keys(key_reporter) == "ef"
def test_many_modifiers_click(session, test_actions_page, key_chain, mouse_chain): outer = session.find.css("#outer", all=False) key_chain \ .pause(0) \ .key_down(Keys.CONTROL) \ .key_down(Keys.SHIFT) \ .pause(0) \ .key_up(Keys.CONTROL) \ .key_up(Keys.SHIFT) mouse_chain \ .pointer_move(0, 0, origin=outer) \ .pause(0) \ .pointer_down() \ .pointer_up() \ .pause(0) \ .pause(0) \ .pointer_down() session.actions.perform([key_chain.dict, mouse_chain.dict]) expected = [ { "type": "mousemove" }, # shift and ctrl presses { "type": "mousedown" }, { "type": "mouseup" }, { "type": "click" }, # no modifiers pressed { "type": "mousedown" }, ] defaults = { "altKey": False, "metaKey": False, "shiftKey": False, "ctrlKey": False } for e in expected: e.update(defaults) for e in expected[1:4]: e["shiftKey"] = True e["ctrlKey"] = True events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected
def test_release_char_sequence_sends_keyup_events_in_reverse(session, key_reporter, key_chain): key_chain \ .key_down("a") \ .key_down("b") \ .perform() # reset so we only see the release events session.execute_script("resetEvents();") session.actions.release() expected = [ {"code": "KeyB", "key": "b", "type": "keyup"}, {"code": "KeyA", "key": "a", "type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected
def test_sequence_of_keydown_printable_keys_sends_events(session, key_reporter, key_chain): key_chain \ .key_down("a") \ .key_down("b") \ .perform() expected = [ {"code": "KeyA", "key": "a", "type": "keydown"}, {"code": "KeyA", "key": "a", "type": "keypress"}, {"code": "KeyB", "key": "b", "type": "keydown"}, {"code": "KeyB", "key": "b", "type": "keypress"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected assert get_keys(key_reporter) == "ab"
def test_single_printable_key_sends_correct_events(session, key_reporter, key_chain, value, code): key_chain \ .key_down(value) \ .key_up(value) \ .perform() expected = [ {"code": code, "key": value, "type": "keydown"}, {"code": code, "key": value, "type": "keypress"}, {"code": code, "key": value, "type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected assert get_keys(key_reporter) == value
def test_single_modifier_key_sends_correct_events(session, key_reporter, key_chain, value, code, key): key_chain \ .key_down(value) \ .key_up(value) \ .perform() all_events = get_events(session) expected = [ {"code": code, "key": key, "type": "keydown"}, {"code": code, "key": key, "type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in all_events] assert events == expected assert len(get_keys(key_reporter)) == 0
def test_webdriver_special_key_sends_keydown(session, key_reporter, key_chain, name, expected): key_chain.key_down(getattr(Keys, name)).perform() # only interested in keydown first_event = get_events(session)[0] # make a copy so we can throw out irrelevant keys and compare to events expected = dict(expected) del expected["value"] # check and remove keys that aren't in expected assert first_event["type"] == "keydown" assert first_event["repeat"] == False first_event = filter_dict(first_event, expected) assert first_event == expected # only printable characters should be recorded in input field entered_keys = get_keys(key_reporter) if len(expected["key"]) == 1: assert entered_keys == expected["key"] else: assert len(entered_keys) == 0
def test_many_modifiers_click(session, test_actions_page, key_chain, mouse_chain): outer = session.find.css("#outer", all=False) key_chain \ .pause(0) \ .key_down(Keys.CONTROL) \ .key_down(Keys.SHIFT) \ .pause(0) \ .key_up(Keys.CONTROL) \ .key_up(Keys.SHIFT) mouse_chain \ .pointer_move(0, 0, origin=outer) \ .pause(0) \ .pointer_down() \ .pointer_up() \ .pause(0) \ .pause(0) \ .pointer_down() session.actions.perform([key_chain.dict, mouse_chain.dict]) expected = [ {"type": "mousemove"}, # shift and ctrl presses {"type": "mousedown"}, {"type": "mouseup"}, {"type": "click"}, # no modifiers pressed {"type": "mousedown"}, ] defaults = { "altKey": False, "metaKey": False, "shiftKey": False, "ctrlKey": False } for e in expected: e.update(defaults) for e in expected[1:4]: e["shiftKey"] = True e["ctrlKey"] = True events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected
def test_release_control_click(session, key_reporter, key_chain, mouse_chain): key_chain \ .pause(0) \ .key_down(Keys.CONTROL) mouse_chain \ .pointer_move(0, 0, origin=key_reporter) \ .pointer_down() session.actions.perform([key_chain.dict, mouse_chain.dict]) session.execute_script(""" var keyReporter = document.getElementById("keys"); ["mousedown", "mouseup"].forEach((e) => { keyReporter.addEventListener(e, recordPointerEvent); }); resetEvents(); """) session.actions.release() expected = [ {"type": "mouseup"}, {"type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected
def test_single_nonprintable_key_sends_events(session, key_reporter, key_chain, value, code, key): key_chain \ .key_down(value) \ .key_up(value) \ .perform() expected = [ {"code": code, "key": key, "type": "keydown"}, {"code": code, "key": key, "type": "keypress"}, {"code": code, "key": key, "type": "keyup"}, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] if len(events) == 2: # most browsers don't send a keypress for non-printable keys assert events == [expected[0], expected[2]] else: assert events == expected assert len(get_keys(key_reporter)) == 0
def test_control_click(session, test_actions_page, key_chain, mouse_chain, modifier, prop): key_chain \ .pause(0) \ .key_down(modifier) \ .pause(200) \ .key_up(modifier) outer = session.find.css("#outer", all=False) mouse_chain.click(element=outer) session.actions.perform([key_chain.dict, mouse_chain.dict]) expected = [ { "type": "mousemove" }, { "type": "mousedown" }, { "type": "mouseup" }, { "type": "click" }, ] defaults = { "altKey": False, "metaKey": False, "shiftKey": False, "ctrlKey": False } for e in expected: e.update(defaults) if e["type"] != "mousemove": e[prop] = True filtered_events = [ filter_dict(e, expected[0]) for e in get_events(session) ] assert expected == filtered_events
def test_release_char_sequence_sends_keyup_events_in_reverse( session, key_reporter, key_chain): key_chain \ .key_down("a") \ .key_down("b") \ .perform() # reset so we only see the release events session.execute_script("resetEvents();") session.actions.release() expected = [ { "code": "KeyB", "key": "b", "type": "keyup" }, { "code": "KeyA", "key": "a", "type": "keyup" }, ] events = [filter_dict(e, expected[0]) for e in get_events(session)] assert events == expected