8

我想在文本框中为一些输入过滤代码编写一些测试。对于大多数测试,我可以调用setValue并触发更改事件,这很容易做到。但是,在这种情况下,因为我想测试输入是否被过滤掉(或不被过滤掉),所以我不能setValue()直接。

我尝试调度keydown, keyup, keypress,textinput事件。我可以看到正在调用它们的处理程序,但文本实际上并未显示在文本框中请注意,这仅在 Firefox 中“有效”,我了解其他浏览器的代码看起来会有所不同。

function dispatch(target, eventType, charCode) {
   var evt = document.createEvent("KeyboardEvent");
   evt.initKeyEvent(
     eventType,
     true,
     true,
     window,
     false,
     false,
     false,
     false,
     charCode,
     0
   );
   target.dispatchEvent(evt);
}


var id = document.getElementById('id');
id.onkeydown = id.onkeyup = id.onkeypress = function() {console.log(arguments)}

dispatch(id, 'keydown', 65);
dispatch(id, 'keyup', 65);
dispatch(id, 'keypress', 65);
dispatch(id, 'textinput', 65);
// I can see the handlers were called but it doesn't display in the text box

我知道这有一些限制,因为我们不希望网络应用程序只是假装它们是在为用户行事。但是,这是为了测试我自己的应用程序,我可以使用特定的配置文件启动 Firefox 并安装插件,或者如果我知道它会有所帮助,甚至可以自己编写。

我所追求的是避免使用 Selenium,我想让 Java 排除在我的 JS 测试之外,因为它不仅速度慢,而且我必须在 Java 中重新实现很多 DOM 查询。

毕竟,问题是,有人知道如何让该代码实际修改输入吗?调整设置,安装插件?

不回答我的问题的问题列表

4

1 回答 1

1

我刚刚发现以下代码至少可以在 Chrome 中运行。不能进入 firefox 或 IE http://jsfiddle.net/D2s5T/14/

function dispatch(target, eventType, char) {
   var evt = document.createEvent("TextEvent");    
   evt.initTextEvent (eventType, true, true, window, char, 0, "en-US");
   target.focus();
   target.dispatchEvent(evt);
}
dispatch(el, "textInput", "a");
于 2013-03-08T23:17:33.997 回答