Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使KeyboardEvents更改HTMLInputElement的值?_Javascript_Unit Testing_Dom_Ecmascript 6 - Fatal编程技术网

Javascript 如何使KeyboardEvents更改HTMLInputElement的值?

Javascript 如何使KeyboardEvents更改HTMLInputElement的值?,javascript,unit-testing,dom,ecmascript-6,Javascript,Unit Testing,Dom,Ecmascript 6,我试图为代码创建单元测试,在输入元素中键入字符时转换输入元素的值。这是一个简单的keyup事件处理程序,当我在键盘上键入字符时,它会按预期工作 当我尝试创建一个调度keydown和keyup事件的自动测试时,我可以看到事件处理程序启动,但输入元素的value属性从未改变。我尝试过使用JQuery触发事件,并使用基本的DOM方法;两者似乎都不起作用 有人能建议如何改变价值吗?我认为这是可能的,就像硒测试一样 这是代码的一个示例: function setupTest(elem) {

我试图为代码创建单元测试,在输入元素中键入字符时转换输入元素的值。这是一个简单的keyup事件处理程序,当我在键盘上键入字符时,它会按预期工作

当我尝试创建一个调度keydown和keyup事件的自动测试时,我可以看到事件处理程序启动,但输入元素的value属性从未改变。我尝试过使用JQuery触发事件,并使用基本的DOM方法;两者似乎都不起作用

有人能建议如何改变价值吗?我认为这是可能的,就像硒测试一样

这是代码的一个示例:

    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))
    ;
}
功能设置测试(elem){
常量输入=元素[0]作为HTMLInputElement;
const-letters=“aSdFgH”;
设指数=0;
$(“#按钮”)。单击(()=>{
常量字符=字母.charAt(索引);
const keydown=新键盘事件(“keydown”{
键:char,
shiftKey:char>='A'&&char='A'&&char{
const target=event.target作为HTMLInputElement;
console.log(名称、目标值、事件);
}
$(要素)
.focus(事件=>报告(“焦点”,事件))
.keydown(事件=>报告(“keydown”,事件))
.keyup(事件=>报告(“keyup”,事件))
.blur(事件=>报告(“blur”,事件))
;
}

@Artem Bozhko是正确的-这是不可能的。合成事件(在脚本中创建的事件)已被isTrusted false信任。不受信任的事件无法触发默认操作,因此它们从不修改输入值。出于明显的安全原因,据我所知,isTrusted是只读属性


不幸的是,这使得创建验证浏览器中UI行为的单元测试变得不可能。我假设Selenium通过与浏览器进行较低级别的交互来解决这一问题,但是Selenium对于我想要的那种单元测试来说有点重。

@Artem Bozhko是对的-这是不可能的。合成事件(在脚本中创建的)已isTrusted false。不受信任的事件无法触发默认操作,因此它们从不修改输入值。出于明显的安全原因,isTrusted是只读属性,据我所知,就是这样


不幸的是,这使得无法创建单元测试来验证浏览器中的UI行为。我假设Selenium通过与浏览器的较低级别交互来解决这一问题,但是Selenium对于我想要的单元测试来说有点重。

这是真正的语法:
const input=elem[0]作为HTMLInputElement;
?@zer00ne-看起来像是TypeScript,我认为由于安全原因它无法工作。请阅读下面的说明:@zer00ne抱歉,这是TypeScript。我原以为我已将其全部简化为JS,但我遗漏了一点。演员阵容不会影响功能。@ArtemBozhko也许你是对的,但控制台消息显示事件正在触发。我在MDN页面中看不到任何提示事件的默认操作不会发生的内容。这是真正的语法:
const input=elem[0]作为HTMLInputElement;
?@zer00ne-看起来像是TypeScript,我认为由于安全原因它无法工作。请阅读下面的说明:@zer00ne抱歉,这是TypeScript。我原以为我已将其全部简化为JS,但我遗漏了一点。演员阵容不会影响功能。@ArtemBozhko也许你是对的,但控制台消息显示事件正在触发。我在MDN页面中看不到任何提示事件的默认操作不会发生的内容。