Как имитировать события клавиатуры (вниз, вверх, нажатие)?Python

Программы на Python
Ответить
Anonymous
 Как имитировать события клавиатуры (вниз, вверх, нажатие)?

Сообщение Anonymous »

Я использую PyChrome на Python для имитации событий клавиатуры, таких как keyDown, keyUp и keyPress, через протокол Chrome DevTools (CDP). Метод type работает нормально, но методы «вниз», «вверх» и «нажатие» работают не так, как ожидалось.
Проблема:

Код: Выделить всё

key_mapping = {
"Backspace": {"code": "Backspace", "keyCode": 8},
"Tab": {"code": "Tab", "keyCode": 9, "text": "\t"},
"Enter": {"code": "Enter", "keyCode": 13, "text": "\r"},
"Escape": {"code": "Escape", "keyCode": 27},
"Space": {"code": "Space", "keyCode": 32, "text": " "},
"Delete": {"code": "Delete", "keyCode": 46},
"A": {"code": "KeyA", "keyCode": 65, "text": "a"},
"B": {"code": "KeyB", "keyCode": 66, "text": "b"},
"C": {"code": "KeyC", "keyCode": 67, "text": "c"},
"D": {"code": "KeyD", "keyCode": 68, "text": "d"},
"E": {"code": "KeyE", "keyCode": 69, "text": "e"},
"F": {"code": "KeyF", "keyCode": 70, "text": "f"},
"G": {"code": "KeyG", "keyCode": 71, "text": "g"},
"H": {"code": "KeyH", "keyCode": 72, "text": "h"},
"I": {"code": "KeyI", "keyCode": 73, "text": "i"},
"J": {"code": "KeyJ", "keyCode": 74, "text": "j"},
"K": {"code": "KeyK", "keyCode": 75, "text": "k"},
"L": {"code": "KeyL", "keyCode": 76, "text": "l"},
"M": {"code": "KeyM", "keyCode": 77, "text": "m"},
"N": {"code": "KeyN", "keyCode": 78, "text": "n"},
"O": {"code": "KeyO", "keyCode": 79, "text": "o"},
"P": {"code": "KeyP", "keyCode": 80, "text": "p"},
"Q": {"code": "KeyQ", "keyCode": 81, "text": "q"},
"R": {"code": "KeyR", "keyCode": 82, "text": "r"},
"S": {"code": "KeyS", "keyCode": 83, "text": "s"},
}

Я создал класс клавиатуры, который предоставляет несколько методов, таких как (вверх, нажатие, вниз, ввод).
В настоящее время ввод работает так, как я ожидал. Но вверх, нажатие или вниз не работает. Я пытался их устранить, но они работают неправильно.

Код: Выделить всё

class Keyboard:
"""Handles keyboard interactions on the page"""

def __init__(self, tab: Tab):
self._tab = tab

def type(self, text: str):
"""Simulates typing text character by character."""
for char in text:
# self._tab.call_method("Input.dispatchKeyEvent", type="keyDown", text=char)
self._dispatch_key_event("keyDown", text=char)

# self._tab.call_method("Input.dispatchKeyEvent", type="keyUp", text=char)
self._dispatch_key_event("keyUp", text=char)

def down(self, key: str):
"""Holds down a specified key without releasing it."""
key_data = self._get_key_data(key)
if key_data:
print(f"Holding down: {key} -> {key_data}")
self._dispatch_key_event("keyDown", **key_data)

def up(self, key: str):
"""Releases a held key."""
key_data = self._get_key_data(key)
if key_data:
print(f"Releasing: {key} -> {key_data}")
self._dispatch_key_event("keyUp", **key_data)

def press(self, combination: str):
keys = combination.split("+")

for key in keys[:-1]:  # Everything except the last key
key_data = self._get_key_data(key)
self._dispatch_key_event("keyDown", **key_data)

# Press the main key
key_data = self._get_key_data(keys[-1])  # Last key in combination
self._dispatch_key_event("keyDown", **key_data)
self._dispatch_key_event("keyUp", **key_data)

for key in reversed(keys[:-1]):
key_data = self._get_key_data(key)
self._dispatch_key_event("keyUp", **key_data)

def _dispatch_key_event(self, event_type: str, **kwargs):
"""Dispatches a key event to the tab."""
print(f"Dispatching {event_type} with arguments: {kwargs}")
self._tab.call_method(
"Input.dispatchKeyEvent", type=event_type, _timeout=5, **kwargs
)

def _get_key_data(self, key: str):
"""Helper method to retrieve the appropriate key data from the key mapping."""
normalized_key = self._normalize_key(key)
key_data = key_mapping.get(normalized_key)
if not key_data:
print(f"Warning: Key '{key}' not found in key_mapping.")
return key_data

@staticmethod
def _normalize_key(key: str) -> str:
"""Normalizes key names for compatibility with the key mapping."""
key = key.capitalize()
if key == "Ctrl":
return "Control"
elif key == "Cmd":
return "Meta"  # For Mac "Cmd" becomes "Meta"
elif key == "Controlormeta":
# Automatically use 'Meta' for Mac, 'Control' for Windows/Linux
return "Meta" if sys.platform == "darwin" else "Control"
return key
Итак, если вы вызовете вот так -> Keyboard.press("Control+T"), ожидаемое поведение приведет к открытию новой вкладки справа. Но это не работает.


Подробнее здесь: https://stackoverflow.com/questions/791 ... n-up-press
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»