在赛普拉斯,如何计算选择的项目并获得长度?

Kat*_*rne 28 cypress

我开始学习赛普拉斯了.我有一个4行表(有一类数据表).我可以通过这种方式验证行数:

cy.get('.datatable').find('tr').each(function(row, i){
        expect(i).to.be.lessThan(4)
})
Run Code Online (Sandbox Code Playgroud)

这是好的,但似乎尴尬,因为我只是想算的长度和并不真正需要访问的东西在排,我想这是更快地做一件事比做4两件事.

如果我记录选择(不知道还有什么叫它):

cy.log(cy.get('.datatable').find('tr'))
Run Code Online (Sandbox Code Playgroud)

它出来了[object Object],我不太确定如何解构它,这告诉我,我正在考虑这一切都是错的.

如果我尝试:

expect(cy.get('.datatable').find('tr')).to.have.lengthOf(4)
Run Code Online (Sandbox Code Playgroud)

我明白了 AssertionError: expected { Object (chainerId, firstCall) } to have a property 'length'

如果我尝试:

    expect(Cypress.$('.datatable > tr')).to.have.lengthOf(4)
Run Code Online (Sandbox Code Playgroud)

我得到AssertionError: expected { Object (length, prevObject, ...) } to have a length of 4 but got 0的至少它有一个长度在这里?

如果我记录那种选择方法,我会得到Object{4}.我不知道从哪里开始.这似乎是一个非常普遍的事情要处理.

Kat*_*rne 54

找到一个解决方案,这可以检查项目的数量:

cy.get('.datatable').find('tr').should('have.length', 4)
Run Code Online (Sandbox Code Playgroud)

这不适Cypress.$()用于符号方法.

参考:https://docs.cypress.io/guides/references/assertions.html#Length

  • 问题是“如何计算所选项目的数量并获得长度?” 而不是“如何检查” - 目标是返回链接之外的计数...... (3认同)
  • 这是测试长度的好方法,但是您不能以这种方式返回长度。要返回,您需要使用 Promise 链 `.then(elm => elm.length)` (2认同)

Yuc*_*uci 25

您还可以通过其属性获得所选项目的长度,例如:

cy.get('.datatable').find('tr').its('length').should('eq', 4)
cy.get('.datatable').find('tr').its('length').should('be.gte', 4)
Run Code Online (Sandbox Code Playgroud)

此外 should('have.length', 4)

在此处输入图片说明 我使用赛普拉斯3.1.0和3.2.0版进行了测试。

  • 出于灵活性的原因,我更喜欢这个解决方案而不是 `.should('have.length', length)` 期望,因为 `.its('length')` 为你的断言提供**更大的灵活性**,例如大于或小于比。 (4认同)
  • 仅供参考,您还可以将大于或小于与“should”一起使用,如下所示:“should('have.length.gte', length)” (2认同)

0x4*_*672 11

一种选择是使用“have.length”...

cy.get('.datatable tr').should('have.length', 4)
Run Code Online (Sandbox Code Playgroud)

...另一种选择是使用 should

cy.get('.datatable tr').should(($tr) => {
    expect($tr).to.have.length(4)
})
Run Code Online (Sandbox Code Playgroud)

...或然后(同步查询)

cy.get('.datatable').then(($table) => {
  // synchronously query to find length of elements
  expect($table.find('td').length).to.equal(4)
})
Run Code Online (Sandbox Code Playgroud)


lau*_*108 5

cypress API docs .should()部分中,使用箭头功能

cy.get('.datatable').find('tr').should(($listOfElements) => {
   expect($listOfElements).to.have.length(4)
   // any other assertions, for example the below one
   // expect($listOfElements).to.have.any.keys('key1', 'key2')
})
Run Code Online (Sandbox Code Playgroud)

这种方法将使您可以使用Chai BDD表示法,并在元素列表中声明一件事。


小智 5

如果您想更加灵活并获得动态效果,请使用此功能。

cy.get('.listings-grid')
  .find('.listing')
  .then(listing => {
    const listingCount = Cypress.$(listing).length;
    expect(listing).to.have.length(listingCount);
  });
Run Code Online (Sandbox Code Playgroud)

  • 这仅在内部填充listingCount,不能在.then()之外返回它....its('length')也返回链接对象,而不是整数 (3认同)