【问题标题】:Using KeyboardEvent to simulate a keypress for a test使用 KeyboardEvent 模拟按键进行测试
【发布时间】:2015-07-16 23:09:17
【问题描述】:

我想编写一个 Javascript 测试来模拟右箭头键上的按键。这是我创建keydown 事件的尝试:

var data = {
   key: 'ArrowRight'
};
var ev = new KeyboardEvent('keydown', data);
console.log(ev);

http://jsfiddle.net/lsiden/6e7duck6/

当我在开发者控制台中检查输出时,我希望在其中一个事件字段中看到值 39,但它似乎仍未初始化。

KeyboardEvent {which: 0, keyCode: 0, charCode: 0, repeat: false, metaKey: false…}
altKey: false
bubbles: false
cancelBubble: false
cancelable: false
charCode: 0
ctrlKey: false
currentTarget: null
defaultPrevented: false
detail: 0
eventPhase: 0
keyCode: 0
keyIdentifier: ""
keyLocation: 0
layerX: 0
layerY: 0
location: 0
metaKey: false
pageX: 0
pageY: 0
path: Array[0]
repeat: false
returnValue: true
shiftKey: false
srcElement: null
target: null
timeStamp: 1430931169397
type: "keydown"
view: null
which: 0
__proto__: KeyboardEvent
.

我尝试关注文档:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/KeyboardEvent

以前有人做过吗?

【问题讨论】:

  • 你是用chrome浏览器还是firefox浏览器测试的?
  • 已经有一段时间了,但可能是 Chrome。
  • 好的。铬就是原因。我找到了适用于 chrome 的解决方案。您找到解决此问题的方法了吗?我知道它已经过去了 5 个月以上。
  • 对不起,时间太长了。
  • 没问题。我想我有解决办法。我会发布它,以便其他人过上轻松的生活。

标签: javascript keyboard automated-tests dom-events


【解决方案1】:

我不会撒谎,这似乎很奇怪。听起来您需要将该按键事件的所有功能包装到一个功能中,然后测试该功能。

如果您已经这样做了,并且需要测试您的函数是否正在寻找某个 keyCode 或其他内容,那么您可以使用纯 javascript 对象并将其传递给您正在测试的函数。

例如

如果你的函数看起来像这样。

function myFunc(evt) {
  if (evt.keyCode === 39) {
    doThis();
  } else {
    doThat();
  }
}

然后要测试你的函数,你只需要一个 keyCode 等于 39 的对象。你的函数不应该关心它是由一个 KeyBoardEvent 对象触发的,该对象附加了一堆其他东西你不需要。

所以你的测试看起来像这样。

var keyboardEvent = {keyCode: 39};
myFunc(keyboardEvent);
// Make sure that doThis() was called and not doThat()

我认为这会解决您的问题并使事情变得更简单。

【讨论】:

  • 我的目标是测试一个 Web 组件是否会收到一个由浏览器生成的真实键盘事件,而不仅仅是它能否正确处理它。不过,您的建议意味着我可以将其分为两个测试,如果再次遇到这种情况,这将很有用。
【解决方案2】:

我遇到了同样的问题,并意识到它在 Firefox 中有效,但在 Chrome 中无效。 Chrome 似乎没有在 KeyboardEvent 中使用“key”属性。你必须使用'keyIdentifier'。要在两种浏览器中进行测试,您可以这样做:

var data = {
       key: 'ArrowRight',
       keyIdentifier:'ArrowRight'
    };
var ev = new KeyboardEvent('keydown', data);
console.log(ev); 

【讨论】:

  • 感谢您的回答。但是,我面临另一个问题TS2345: Argument of type '{ key: string; keyIdentifier: string; }' is not assignable to parameter of type 'KeyboardEventInit'你知道如何解决它吗?谢谢
猜你喜欢
  • 2020-05-28
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 2018-02-03
相关资源
最近更新 更多