【问题标题】:Why is React's onChange event not fired on Selenium WebDriver's SendKeys in IE 11?为什么在 IE 11 中的 Selenium WebDriver 的 SendKeys 上没有触发 React 的 onChange 事件?
【发布时间】:2019-09-03 08:12:09
【问题描述】:

我们有一个相对简单的 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 元素,而添加到顶部的日志记录是用于调试目的。

它可以很好地处理常规使用中的输入,它还可以处理 Chrome、Firefox 和 IE 11 中 Selenium WebDriver 下的 SendKeys(前提是 WebDriver 的 EnableNativeEventstrue)。

但是,当通过 WebDriver 在 Internet Explorer 11 中运行并使用 EnableNativeEvents = false 时,在执行 SendKeys 时不会触发 onChanged 事件。最奇怪的是触发了 HTML input 事件。下面是控制台输出:

请注意,输入的 value 在输入“test”时发生变化,但没有 onChange

以下是 WebDriver 的扩展 input 事件:

如果用户随后通过键盘在同一输入中键入,则onChange 事件在那里:

以下是用户输入时的扩展input 事件:

仔细分析表明,input 事件的唯一区别是在 WebDriver 下isTrusted: false,而在实际输入isTrusted: true

问题是为什么在第一种情况下onChange 事件不会被 React 触发?

我认为这是因为 React 跳过了带有 isTrusted: false 的事件,因为这意味着它们是模拟的,而不是真实的用户事件。但是,我无法找到任何证据。如果是这种情况,您介意在处理它的 React 源中提供一个帖子或一行的链接吗?

  • 反应:16.7.0
  • Selenium.WebDriver.IEDriver:3.14.0

【问题讨论】:

  • 您是否尝试比较两个操作的事件对象?
  • @fard,如果您的意思是比较 WebDriver 的 SendKeys 和用户输入 - 是的,我已经比较了对象,至少在第一级属性上,唯一的区别是 isTrusted 属性值跨度>
  • 我的意思是整个事件对象
  • @fard,添加到问题中。在第一层,除了isTrusted,我没有看到任何区别。不知道深入扩展是否有意义。事件的srcElementtarget 指向同一个正确的输入元素。我应该调查一些具体的事情吗?
  • onChange 事件不会被触发,因为当EnableNativeEvents 为假时驱动程序不会模拟此事件。这与isTrusted 无关。问题在于驱动程序使用的injected code

标签: reactjs selenium internet-explorer selenium-webdriver internet-explorer-11


【解决方案1】:

nativeEvents 功能设置为false(这是您使用EnableNativeEvents 属性设置的内容)时,您是在告诉IE 驱动程序使用JavaScript 来模拟事件。通过 JavaScript 模拟的事件 cannot have the isTrusted property set to true。该属性旨在准确检测您正在经历的场景。 Firefox 和 Chrome 的驱动程序实现由这些浏览器的供应商(分别为 Mozilla 和 Google)生产和维护,因此,这些驱动程序可以访问浏览器的内部,而 IE 驱动程序没有(并且可能永远不会)会)有。如果 React 确实关闭了该属性以触发 onChanged 事件,那么正确的做法是设置 EnableNativeEvents = true

【讨论】:

  • 感谢您的解释。它证实了我的一般假设。你有没有机会知道 React 是否按 isTrusted 过滤?我无法在源代码中找到类似的内容,所以我想知道是否还有其他问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 2015-10-20
  • 1970-01-01
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多