142

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

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

这很好,但看起来很尴尬,因为我只想计算长度而不需要访问行中的内容,而且我认为做一件事比做四件事要快。

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

cy.log(cy.get('.datatable').find('tr'))

它出来了[object Object],我不太确定如何解构它,这表明我在想这一切都是错误的。

如果我尝试:

expect(cy.get('.datatable').find('tr')).to.have.lengthOf(4)

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

如果我尝试:

    expect(Cypress.$('.datatable > tr')).to.have.lengthOf(4)

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

如果我记录该选择方法,我会得到Object{4}. 我不知道从这里去哪里。看起来这将是一件很常见的事情。

4

11 回答 11

193

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

cy.get('.datatable').find('tr').should('have.length', 4)

这不适Cypress.$()用于表示法。

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

于 2017-10-20T14:01:32.330 回答
100

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

cy.get('.datatable').find('tr').its('length').should('eq', 4)
cy.get('.datatable').find('tr').its('length').should('be.gte', 4)

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

在此处输入图像描述 我使用赛普拉斯 3.1.0 和 3.2.0 版本进行了测试。

于 2018-08-18T09:18:55.843 回答
37

如果您想要更灵活并获得动态结果,请使用它。

cy.get('.listings-grid')
  .find('.listing')
  .then(listing => {
    const listingCount = Cypress.$(listing).length;
    expect(listing).to.have.length(listingCount);
  });
于 2019-07-29T12:26:43.627 回答
13

一种选择是使用 "have.length" ...

cy.get('.datatable tr').should('have.length', 4)

...另一种选择是使用应该

cy.get('.datatable tr').should(($tr) => {
    expect($tr).to.have.length(4)
})

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

cy.get('.datatable').then(($table) => {
  // synchronously query to find length of elements
  expect($table.find('td').length).to.equal(4)
})
于 2019-02-05T13:57:09.320 回答
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')
})

这种方法将允许您使用Chai BDD 表示法并在您的元素列表中断言多个事物。

于 2018-05-28T04:21:36.263 回答
1

我的用例是比较它,说不。页面上的“i”图标应该与否匹配。表行数。因此,该解决方案适用于它,即当我想比较否时。一个选择器与另一个选择器的元素

cy.get('first element').its('length').then((val)=>{
     cy.get('second element).its('length').should('eq',val)
})

在捕获请求的属性(在本例中为长度)then之后写入,在第一个块中,我们通过获取第二个元素的长度来进行比较itsthen

于 2021-07-01T12:31:59.983 回答
0
  • .children (selector(byId, class, custom attribute) 产生 DOM 元素并重试直到超过 defaultCommandTimeout。

    赛普拉斯配置defaultCommandTimeout

  • 一旦DOM元素存在并产生附加length的断言。

<ul data-qa="qa-navbar">
  <li>Home</li>
  <li>About</li>
  <li>Services</li>
  <li>Our Team</li>
  <li>Contact Us</li>
</ul>

    cy
      .get('[data-qa="qa-navbar"]') // selector
      .children() // get direct decendents 
      .should('have.length', 5); // add assertion to have lenght of 5

于 2021-03-12T04:12:46.700 回答
0

cy .get('ul[data-qa="qa-navbar"] li') // 选择器 .should('have.length', 5) // 断言

于 2021-05-20T13:58:03.793 回答
0

要获得您需要使用 cypress 命令的长度:

    cy.get('[ng-repeat="item in catalog"]').then(($el) => { 
        const itemCount = Cypress.$($el).length;
        cy.log(itemCount)
    })
于 2021-10-05T04:01:41.087 回答
0
 - In the element locator "aria-setsize" property to find the "number of items in the current set of listitems or treeitems" can be used.
 - Within ".then" function, for the previously yielded element. Use ".length" jquery as below.
 - To find the list of: Best Sellers in Computers & Accessories, in "Amazon.in" home screen.

it('test', () => {
        cy.visit('https://www.amazon.in/ref=nav_logo')
        cy.wait(3000)
        cy.get('#desktop-5 li[aria-setsize]')
        .then(($el) => {
         const count= $el.length
         cy.log(count)
        })

    })
于 2021-12-09T05:41:18.047 回答
-2

它将尝试直到我们找到 4 个匹配项.datatable > tr

 cy.get('.datatable').find('tr')
    .should('have.length', 4)
于 2022-01-25T07:38:26.137 回答