Как нажмите и удерживайте не-модифицирующая клавиша (клавиша пробел), используя селен?
Я столкнулся с проблемой, что selenium не может нажать и удерживать клавишу, которой нет в этом списке -
Keys.SHIFT,
Keys.CONTROL,
Keys.ALT,
Keys.META,
Keys.COMMAND,
Keys.LEFT_ALT,
Keys.LEFT_CONTROL,
Keys.LEFT_SHIFT
Мое приложение показывает инструкции только тогда, когда клавиша пробел нажата и удерживается. Я хочу написать браузерные тесты для этого.
Я использую ProtractorJS, но это похоже на общее ограничение для такого действия, везде в selenium, когда вы пытаетесь использовать keyDown для другого ключа - вы получите исключение с сообщением вроде этого - "события Key Down / Up имеют смысл только для ключей-модификаторов."
Вот ссылка на код Selenium Java:
https://github.com/SeleniumHQ/selenium/blob/master/java/client/src/org/openqa/selenium/interactions/internal/SingleKeyAction.java#L48
И та же проверка в коде selenium js:
https://github.com/SeleniumHQ/selenium/blob/master/javascript/webdriver/actionsequence.js#L301
Как я могу нажать и удерживать немодификаторную клавишу? Космический ключ в моем чемодане.
Обновление:
Спасибо Флоренту Б. ответьте.
После небольшой модификации - отлично работает для меня. Пришлось добавить переключение на фрейм, а отправку события в документ вместо конкретного элемента для моего случая.
browser.switchTo().frame('workspace');
const SIMULATE_KEY =
"var e = new Event('keydown');" +
"e.keyCode = 32;" + //spacebar keycode
"e.which = e.keyCode;" +
"e.altKey = false;" +
"e.ctrlKey = false;" +
"e.shiftKey = false;" +
"e.metaKey = false;" +
"e.bubbles = true;" +
"document.dispatchEvent(e);";
browser.executeScript(SIMULATE_KEY);
2 ответов:
API Selenium не предоставляет эту функцию. Из официальной документации:
Https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
Сервер должен обработать последовательность ключей следующим образом: Каждая клавиша, которая появляется на клавиатуре, не требуя модификаторов, отправляется как клавиша вниз, за которой следует клавиша вверх.
Однако вы можете смоделировать ключевое событие с помощью фрагмента Javascript:
const SIMULATE_KEY = "var e = new Event(arguments[0]);" + "e.key = arguments[1];" + "e.keyCode = e.key.charCodeAt(0);" + "e.which = e.keyCode;" + "e.altKey = false;" + "e.ctrlKey = false;" + "e.shiftKey = false;" + "e.metaKey = false;" + "e.bubbles = true;" + "arguments[2].dispatchEvent(e);"; var target = driver.findElement(By.Id("...")); // press the key "a" browser.executeScript(SIMULATE_KEY, "keydown", "a", target); // release the key "a" browser.executeScript(SIMULATE_KEY, "keyup", "a", target);
Если вы не можете найти ответ с помощью selenium, вы можете запустить скрипт с помощью другого инструмента (например, AutoIt или AutoHotKey), чтобы просто нажать и удерживать клавишу.
Это боль в заднице, но это может быть вашим единственным вариантом.
Comments