Как я могу заставить KeyboardEvents изменить значение HTMLInputElement? - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь создать модульные тесты для кода, который преобразует значение элемента ввода при вводе в него символов.Это простой обработчик событий keyup, и он работает, как и ожидалось, когда я набираю символы на клавиатуре.

Когда я пытаюсь создать автоматический тест, в котором отправляются события 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.log(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))
    ;
}

1 Ответ

0 голосов
/ 19 марта 2019

@ Артем Божко прав - это невозможно. Синтетические события (созданные в скрипте) имеют isTrusted false. Ненадежные события не могут инициировать действия по умолчанию, поэтому они никогда не изменяют входное значение. По очевидным причинам безопасности isTrusted является свойством только для чтения, поэтому, насколько я могу судить, все.

Это, к сожалению, делает невозможным создание модульных тестов, которые проверяют поведение пользовательского интерфейса в браузере. Я предполагаю, что Selenium справляется с этим, взаимодействуя с браузером на более низком уровне, но Selenium немного тяжеловесен для тех модульных тестов, к которым я стремлюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...