Я пытаюсь создать модульные тесты для кода, который преобразует значение элемента ввода по мере ввода в него символов. Это простой обработчик событий нажатия клавиш, и он работает, как и ожидалось, когда я набираю символы на клавиатуре.
Когда я пытаюсь создать автоматический тест, в котором отправляются события keydown и keyup, я вижу срабатывание обработчика событий, но свойство value элемента ввода никогда не изменяется. Я пытался использовать JQuery для запуска событий и использовать основные методы DOM; ни один из них не работает.
Кто-нибудь может подсказать, как изменить значение? Я предполагаю, что это возможно, как это делают тесты Selenium.
Это пример кода:
function setupTest(elem) {
const input = elem[0] as HTMLInputElement;
const letters = "aSdFgH";
let index = 0;
$("#injectButton").click(() => {
const char = letters.charAt(index);
const keydown = new KeyboardEvent("keydown", {
key: char,
shiftKey: char >= 'A' && char <= 'Z'
});
const keyup = new KeyboardEvent("keyup", {
key: char,
shiftKey: char >= 'A' && char <= 'Z'
});
index++;
input.dispatchEvent(keydown);
input.dispatchEvent(keyup);
});
const report = (name, event) => {
const target = event.target as HTMLInputElement;
console.info(name, target.value, event);
}
$(elem)
.focus(event => report("FOCUS", event))
.keydown(event => report("KEYDOWN", event))
.keyup(event => report("KEYUP", event))
.blur(event => report("BLUR", event))
;
}
@zer00ne — похоже на TypeScript
Я думаю, что это не сработает из соображений безопасности. Прочтите примечание ниже: developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Exampфайл
@ zer00ne извините, это TypeScript. Я думал, что свел все к JS, но немного промахнулся. Приведение не влияет на функциональность.
@ArtemBozhko, возможно, вы правы, но сообщения консоли показывают, что события запускаются. Я не вижу на странице MDN ничего, что предполагало бы, что действие события по умолчанию не произойдет.
@Chris Примечание. Запуск события вручную не приводит к действию по умолчанию, связанному с этим событием. Например, ручное срабатывание ключевого события не приводит к тому, что эта буква появляется в сфокусированном текстовом вводе. В случае событий пользовательского интерфейса это важно из соображений безопасности, поскольку предотвращает имитацию скриптами действий пользователя, которые взаимодействуют с самим браузером.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


@Артем Божко прав - это невозможно. Синтетические события (созданные в скрипте) имеют isTrusted false. Ненадежные события не могут инициировать действия по умолчанию, поэтому они никогда не изменяют входное значение. По очевидным причинам безопасности isTrusted является свойством только для чтения, так что, насколько я могу судить, это все.
К сожалению, это делает невозможным создание модульных тестов, проверяющих поведение пользовательского интерфейса в браузере. Я предполагаю, что Selenium обходит это за счет низкоуровневого взаимодействия с браузером, но Selenium немного тяжеловат для тех модульных тестов, к которым я стремлюсь.
Это настоящий синтаксис:
const input = elem[0] as HTMLInputElement;?