在 Cypress 中递增和递减 <input type="number"/> 的值

vag*_*ges 4 javascript testing cypress

我想测试type="number"Cypress 中 HTML 输入字段 ( ) 的值的递增和递减。更准确地说,我更喜欢使用箭头键来增加和减少值,但我似乎无法使用最明显的方法来实现这一点。

作为一个最小的工作示例,我设置了一个 React 组件,其渲染方法如下所示:

render() {
  return (<input type="number" />);
};
Run Code Online (Sandbox Code Playgroud)

在 Cypress 之外,在该字段中输入内容不会出现任何问题。使用箭头键和鼠标增加和减少值也是如此。

根据赛普拉斯关于 .type-method 的 API 文档,可以使用所谓的特殊字符序列 {uparrow}{downarrow}作为参数来cy.type()模拟用户的向上和向下按键。我尝试在输入标签和文档正文上使用这种方法(如果增量/减量侦听器以某种方式全局定义),如下所示,但它似乎不起作用:

it('Increments the input value when the up key is pressed', () => {
  cy.get('input').type('1000{uparrow}'); 
  // Sets the value to 1000, but does not increment the value

  cy.get('body').type('{uparrow}');
  // Still at 1000. The event listener is not global after all.

  cy.get('input').type('{selectall}{backspace}'); 
  // Selecting all the input and deleting it 
  // using some of the other "special character sequences" works.
});
Run Code Online (Sandbox Code Playgroud)

查看 Cypress 的控制台输出(下图),向上箭头键事件(键代码 38)显然是由 Cypress 发送的。不过,与常规按键相比,此按键引发的生命周期事件较少。

记录第一个 .type 调用的关键事件: 记录第一个 .type 调用的关键事件

记录第二个 .type 调用的关键事件: 记录第二次 .type 调用的关键事件

有谁知道我可能做错了什么?或者我还可以尝试什么?我愿意接受完全避免模拟按键的方法,只要它们涉及手动提取、递增和将值插入到输入字段中。

Jen*_*ane 7

Cypress 在浏览器中工作,这意味着您的测试代码在浏览器中进行评估。这意味着任何在 JavaScript 中无法访问的内容也可能无法被 Cypress 访问 - 尽管支持本机事件已在 Cypress 的路线图上。

当您.type()在 Cypress 中使用时,Cypress 会触发所有必要的事件来模拟该行为。使用数字输入的向上/向下箭头是浏览器特定的实现,并且需要赛普拉斯的本机事件支持才能正确实现这一点。

话虽这么说,您可能只想测试单击向上/向下箭头时应用程序的行为(毕竟 - 您不需要测试数字是否向上和向下,因为这是浏览器实现)。单击向上和向下箭头时,会触发一个事件,因此您可以通过以下方式change使用命令单击向上/向下箭头时基本上测试应用程序的行为:.trigger()

cy.get('input[type="number"]').type('1000').trigger('change')
Run Code Online (Sandbox Code Playgroud)