Почему событие onChange от React не запускается для ключей отправки Selenium WebDriver в IE 11?

#reactjs #selenium #internet-explorer #selenium-webdriver #internet-explorer-11

#reactjs #селен #internet-explorer #selenium-webdriver #internet-explorer-11

Вопрос:

У нас есть относительно простой компонент React с input элементом в нем:

 export class MyInput extends Component {
  componentDidMount() {
    function log(e) {
      console.log(`Event: ${e.type}, isTrusted: ${e.isTrusted}, input value: ${e.target.value}`, e);
    }

    this.rawInput.addEventListener("change", log);
    this.rawInput.addEventListener("input", log);
  }

  onChanged(e) {
    console.log("raw-input.onChanged: e.target.value", e.target.value);

    this.props.onChanged(e.target.value);
  }

  render() {
    return (
      <div className="my-class">
        <input
          value={this.props.value}
          onChange={this.onChanged.bind(this)}
          ref={(input) => { this.rawInput = input; }}
          />
      </div>
    );
  }
}
  

По сути, это всего лишь слегка завернутый input элемент, в то время как ведение журнала, добавленное сверху, предназначено для целей отладки.

Он отлично справляется с вводом текста при обычном использовании, он также обрабатывает SendKeys Selenium WebDriver в Chrome, Firefox и IE 11 (при условии, что WebDriver EnableNativeEvents есть true ).

Однако при запуске в Internet Explorer 11 с помощью WebDriver и с EnableNativeEvents = false помощью, onChanged событие не запускается при SendKeys выполнении. Что самое странное input , так это то, что запускается событие HTML. Ниже приведен вывод консоли: Отсутствует onChange в WebDriver

Обратите внимание, что входные value данные меняются во время ввода «test», но нет onChange .

Ниже приведено расширенное input событие в случае WebDriver: Подробное событие ввода из WebDriver

Если пользователь затем вводит с клавиатуры тот же ввод, onChange событие есть: onChange успешно запускается при реальном наборе текста

Ниже приведено расширенное input событие в случае ввода пользователем: Подробное событие ввода при вводе пользователем

Тщательный анализ показывает, что единственное различие в input событиях заключается в том, что при WebDriver isTrusted: false , в то время как при реальном наборе isTrusted: true текста .

Вопрос в том, почему в первом случае onChange события не запускаются React?

Я предполагаю, что это связано с тем, что React пропускает события, isTrusted: false потому что это означает, что они имитируются, а не реальные пользовательские события. Однако я не смог найти никаких доказательств этого. Если это так, не могли бы вы предоставить ссылку на сообщение или строку в источниках React, которая его обрабатывает?

  • Реакция: 16.7.0
  • Селен.WebDriver.IEDriver: 3.14.0

Комментарии:

1. Вы пытались сравнить объекты событий из обоих действий?

2. @fard, если вы имеете в виду сравнение ключей отправки WebDriver и ввода пользователем — да, я сравнил объекты, и, по крайней мере, на первом уровне свойств, единственное различие — это isTrusted значение свойства

3. Я имею в виду весь объект события

4. @fard, добавлено к вопросу. На первом уровне я не вижу никаких отличий, кроме isTrusted . Не уверен, имеет ли смысл расширять глубже. События» srcElement и target указывают на один и тот же правильный элемент ввода. Должен ли я исследовать что-то конкретное?

5. onChange Событие не запускается, потому что драйвер не эмулирует это событие, когда EnableNativeEvents оно равно false . Это не имеет никакого отношения к isTrusted . Проблема связана с введенным кодом , используемым драйвером.

Ответ №1:

При установке nativeEvents возможности false (которую вы устанавливаете с EnableNativeEvents помощью свойства) вы указываете драйверу IE использовать JavaScript для имитации событий. События, моделируемые с помощью JavaScript, не могут иметь свойство isTrusted, равное true. Это свойство предназначено для точного определения сценария, с которым вы сталкиваетесь. Реализации драйверов для Firefox и Chrome создаются и поддерживаются поставщиками для этих браузеров (Mozilla и Google соответственно), и, таким образом, эти драйверы имеют доступ к внутренним функциям браузера способами, которых нет (и, вероятно, никогда не будет) у драйвера IE. Если React действительно отключает это свойство для запуска onChanged события, то здесь задано правильное EnableNativeEvents = true действие.

Комментарии:

1. Спасибо за ваше объяснение. Это подтверждает мои общие предположения. Есть ли шанс, что вы знаете, фильтрует ли React by isTrusted ? Я не смог найти ничего подобного в источниках, поэтому мне интересно, мешает ли что-то еще