我正在尝试为代码创建单元测试,这些代码在输入字符时转换输入元素的值。这是一个简单的keyup事件处理程序,当我在键盘上键入字符时,它会按预期工作。
当我尝试创建一个分派keydown和keyup事件的自动化测试时,我可以看到事件处理程序正在触发,但input元素的value属性从未更改。我尝试过使用JQuery来触发事件,并使用基本的DOM方法;似乎都不起作用。
有没有人能建议如何改变这个值?我假设这是可能的,因为Selenium测试可以做到这一点。
以下是代码的示例:
function setupTest(elem) {
const input = elem[0] as HTMLInputElement;
const letters = "aSdFgH";
let index = 0;
$("#injectButton").click(() => {
const char = letters.charAt(index);
const keydown = new KeyboardEvent("keydown", {
key: char,
shiftKey: char >= 'A' && char <= 'Z'
});
const keyup = new KeyboardEvent("keyup", {
key: char,
shiftKey: char >= 'A' && char <= 'Z'
});
index++;
input.dispatchEvent(keydown);
input.dispatchEvent(keyup);
});
const report = (name, event) => {
const target = event.target as HTMLInputElement;
console.log(name, target.value, event);
}
$(elem)
.focus(event => report("FOCUS", event))
.keydown(event => report("KEYDOWN", event))
.keyup(event => report("KEYUP", event))
.blur(event => report("BLUR", event))
;
}发布于 2019-03-19 19:27:19
@Artem Bozhko是对的-这是不可能的。合成事件(在脚本中创建的事件)具有isTrusted false。不受信任的事件不能触发默认操作,因此它们从不修改输入值。出于明显的安全原因,isTrusted是一个只读属性,所以据我所知,仅此而已。
不幸的是,这使得创建单元测试来验证浏览器中的UI行为是不可能的。我假设Selenium通过与浏览器的低级交互来解决这个问题,但是Selenium对于我想要的那种单元测试来说有点重量级。
https://stackoverflow.com/questions/55225577
复制相似问题