为什么 React 的 onChange 事件不会在 IE 11 中的 Selenium WebDriver 的 SendKeys 上触发?

IT技术 reactjs selenium internet-explorer selenium-webdriver internet-explorer-11
2021-04-27 05:06:41

我们有一个相对简单的 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在 Chrome、Firefox 和 IE 11 中的 Selenium WebDriver 下处理(前提是 WebDriverEnableNativeEventstrue)。

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

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

以下是inputWebDriver的扩展事件: 来自 WebDriver 的详细输入事件

如果用户然后在相同的输入中通过键盘键入,则onChange事件在那里: onChange 在实际打字时成功触发

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

仔细分析,input事件的唯一区别是在WebDriver下isTrusted: false,而在真正的打字上isTrusted: true

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

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

  • react:16.7.0
  • Selenium.WebDriver.IEDriver: 3.14.0
1个回答

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