我想在文本框中为一些输入过滤代码编写一些测试。对于大多数测试,我只需调用setValue
并触发更改事件,这很容易。但是,在这种情况下,因为我想测试输入被过滤掉(或不是),我不能直接setValue()
。
我尝试调度keydown,keyup,keypress,textinput事件。 I can see that the handlers for them are being called, but the text doesn't actually show in the text box请注意,这仅适用于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查询。
毕竟,问题是,是否有人知道如何让代码实际修改输入?调整设置,安装插件?
不回答我问题的问题列表
答案 0 :(得分: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");