【发布时间】: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 的 EnableNativeEvents 是 true)。
但是,当通过 WebDriver 在 Internet Explorer 11 中运行并使用 EnableNativeEvents = false 时,在执行 SendKeys 时不会触发 onChanged 事件。最奇怪的是触发了 HTML input 事件。下面是控制台输出:
请注意,输入的 value 在输入“test”时发生变化,但没有 onChange。
如果用户随后通过键盘在同一输入中键入,则onChange 事件在那里:
仔细分析表明,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,我没有看到任何区别。不知道深入扩展是否有意义。事件的srcElement和target指向同一个正确的输入元素。我应该调查一些具体的事情吗? -
onChange事件不会被触发,因为当EnableNativeEvents为假时驱动程序不会模拟此事件。这与isTrusted无关。问题在于驱动程序使用的injected code。
标签: reactjs selenium internet-explorer selenium-webdriver internet-explorer-11