【问题标题】:Check if elements are sorted alphabetically in cypressIO检查元素是否在 cypressIO 中按字母顺序排序
【发布时间】:2018-12-12 14:14:28
【问题描述】:

使用 cypressIO 断言元素按字母顺序排序时,最佳做法是什么? 我想基本上检查element[0].text() 是否在element[1].text() 之前正确排序,但对于下面的sn-p 中的所有元素:

cy.get('#main div').each((account) => {

    });
  });

【问题讨论】:

  • 您的代码是否对该列表进行排序?列表是否在某个 API 中排序?我问是因为我想知道测试是否应该在其他地方。如果它来自 API,我可能会模拟它并检查它是否正确显示。
  • 账户排序的方法是什么?它们是什么类型的?点击屏幕等?

标签: javascript cypress


【解决方案1】:

我认为这个或类似的东西对你有用(还没有尝试过)。它获取与您提供的选择器匹配的所有元素的文本并将其存储在一个数组中,然后断言该数组在排序前后匹配。

cy.get('#main div').then($elements => {
  var strings = $elements.map($el => $el.text());
  cy.wrap(strings).should("equal", strings.sort()); // you may need deep equal here instead
});

【讨论】:

  • Brendan 对下拉列表框中的元素进行排序是否同样有效?
  • 我试过cy.get('#cars_list').then($options => { var strings = $options.map($el => $el.text()); cy.wrap(strings).should("equal", strings.sort()); });但抛出错误>.TypeError: $el.text is not a function
  • 我猜#cars_list 没有得到包含文本的单个元素。它可能是所有这些元素的父元素。发布您的 HTML
  • 啊,为什么我没有想出那个:) 你的代码对我不起作用。也得到了.TypeError: $el.text is not a function我做了这个并且它有效:var accounts =[]; cy.get('#main div').each(elements => { strings.push(elements.text()); }); cy.wrap(accounts).should("equal", accounts.sort());
【解决方案2】:

适用于 Cypress 7.x 的解决方案

cy.get('#main div').then($elements => {
  const strings = [...$elements].map(el => el.innerText)
  expect(strings).to.deep.equal([...strings].sort())
})

推理:

  • jQuery .map 与 vanilla JS .map 的工作方式不同,因为它以不同的顺序获取参数(index, el 而不是 el, index)并且不返回纯数组,这是将来排序所必需的。这就是 jQuery 元素列表传播到纯数组的原因。
  • Array.sort() 就地工作,所以在排序前需要克隆数组,否则会比较相同的数据。
  • 要比较数组的值,需要进行深度比较,因此需要使用 expectsdeep.equal 的 Chai 语法。

【讨论】:

  • 听起来不错,但list 来自哪里?
  • @Sarah 很好,错字,应该是strings
猜你喜欢
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多