Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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/3/sql-server-2005/2.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
如何在cypress上模拟长时间按住按键?_Cypress - Fatal编程技术网

如何在cypress上模拟长时间按住按键?

如何在cypress上模拟长时间按住按键?,cypress,Cypress,我想在不选择特定dom元素的情况下模拟长时间按backquote键,如何使用cypress实现这一点? 我的web应用程序上有一项功能,按下此键时将触发该功能 我已经尝试了下面的几个代码,但没有任何效果 // 1st cy.get('#sidepanel').trigger('keydown', { keycode: 192, release: false }) // 2nd cy.get('body').type('`', { release: false }) // 3rd cy.get

我想在不选择特定dom元素的情况下模拟长时间按backquote键,如何使用cypress实现这一点? 我的web应用程序上有一项功能,按下此键时将触发该功能

我已经尝试了下面的几个代码,但没有任何效果

// 1st
cy.get('#sidepanel').trigger('keydown', { keycode: 192, release: false })

// 2nd
cy.get('body').type('`', { release: false })

// 3rd
cy.get('body').trigger('keydown', { keycode: 192, release: false })
cy.wait(15000)
cy.get('body').trigger('keyup', { keycode: 192, release: false })

我预计它将模拟backqoute的长时间按住键,但看起来backqoute的键入只发生一次而不按住。

当您在浏览器中按住一个键时,实际上会出现许多后续的
按键事件,最后松开钥匙时,会出现一个
keyup

您可以通过在浏览器中运行以下代码来验证此行为:

['keydown'、'keypress'、'keypup'].map(e=>{
document.addEventListener(e,(p)=>console.log(e,p))
})
然后,按住一个键并查看控制台日志以查看发出了哪些事件。在Firefox中,按住A键可以:


因此,要对Cypress执行此操作,您只需模拟这些事件:

//按住5秒钟
对于(变量i=0;i<100;i++){
cy.get('body').trigger('keydown',{keycode:192,release:false})
cy.get('body').trigger('keypress',{keycode:192,release:false})
等等(50)
}
cy.get('body').trigger('keyup',{keycode:192,release:false})

我不知道为什么,但几个月前尝试Zach Bloomquist的答案时,它不起作用。刚才我又试了一次,成功了。我在不同的机器上试用了它,并重新安装了cypress版本3.3.2。不确定它是否有不同的影响

不知何故,扎克的解决方案并没有给出接近实际按下时间的按键。运行他的解决方案实际上会在Cypress运行时按键28秒

//期望:按住5秒
//实际:cypress将按住键28秒
对于(变量i=0;i<100;i++){
cy.get('body').trigger('keydown',{keycode:192,release:false})
cy.get('body').trigger('keypress',{keycode:192,release:false})
等等(50)
}
cy.get('body').trigger('keyup',{keycode:192,release:false})
我提出了一个更简单的解决方案,在cypress中运行时,它几乎与实际的持续时间相匹配:

cy.get('body').trigger('keydown',{keyCode:192})
cy.wait(持续时间)
cy.get('body').trigger('keyup',{keyCode:192})

如果你清楚地看到这个解决方案,就像我在问题中的第三个选择一样。以前不管用,但现在管用了。我注意到不同的是Cypress运行时的浏览器类型。以前是铬,现在是电子61。可能是原因,需要进一步调查以验证。

在我的案例中,它的作用是在接下来的事件中显式设置ctrlkey。 在本例中,它允许我模拟Ctrl+单击加上鼠标移动

cy.get(target.focus();
type({ctrl},{release:false});
cy.get(target.trigger('mousedown',point.x,point.y,{eventConstructor:'MouseEvent',button:0,ctrlKey:true,force:true})
点x+=-200;
点y+=100;
get(target).trigger('mousemove',point.x,point.y,{eventConstructor:'MouseEvent',ctrlKey:true,force:true});
cy.wait(250);
点x+=-20;
点y+=100;
get(target).trigger('mousemove',point.x,point.y,{eventConstructor:'MouseEvent',ctrlKey:true,force:true});
get(target).trigger('mouseup',point.x,point.y,{eventConstructor:'MouseEvent',ctrlKey:true,button:0,force:true});
get(target).trigger('mouseover',point.x,point.y,{eventConstructor:'MouseEvent',ctrlKey:true,button:0,force:true});
cy.get(target).type({ctrl}');

我不认为所有的参数都是必要的,但是
eventConstructor
ctrlKey
和按钮在我的过程中很重要。

被接受的问题没问题。但对我来说,把钥匙码换成钥匙码是有效的

// expect: holding down for 5 seconds
// actual: cypress will hold the keys for 28 seconds
for (var i = 0; i < 100; i++) {
  cy.get('body').trigger('keydown', { keyCode: 87, release: false })
  cy.get('body').trigger('keypress', { keyCode: 87, release: false })
  cy.wait(50)
}
cy.get('body').trigger('keyup', { keyCode: 87, release: false })
//期望:按住5秒
//实际:cypress将按住键28秒
对于(变量i=0;i<100;i++){
cy.get('body').trigger('keydown',{keyCode:87,release:false})
cy.get('body').trigger('keypress',{keyCode:87,release:false})
等等(50)
}
cy.get('body').trigger('keyup',{keyCode:87,release:false})
我还更新了这个例子,因为在我的例子中,需要按W向前移动

问候