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

In Cypress how to count a selection of items and get the length?

我开始学习 Cypress。我有 4 行 table(有 class 数据 table)。我可以这样验证行数:

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}。我不确定从这里去哪里。这似乎是一件很常见的事情。

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

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

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

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

来自cypress API docs .should() section, using an arrow function

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 notation 并在您的元素列表中断言多个事物。

您还可以获得所选项目的长度through its property,例如:

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)

我使用 Cypress 版本 3.1.0 和 3.2.0 进行了测试。

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

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

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

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)
})

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

cy.get('.listings-grid')
  .find('.listing')
  .then(listing => {
    const listingCount = Cypress.$(listing).length;
    expect(listing).to.have.length(listingCount);
  });
  • .children(选择器(byId,class,自定义属性)产生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

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

我的用例是比较那个,说不。页面上的“i”图标应与编号匹配。 table 行。所以,这个解决方案适用于它,即当我想比较编号时。一个选择器与另一个选择器的元素

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

its 捕获请求的 属性(在本例中为长度)之后写入 then 并在第一个 then 块内,我们通过获取第二个元素的长度

获取使用 cypress 命令所需的长度:

    cy.get('[ng-repeat="item in catalog"]').then(($el) => { 
        const itemCount = Cypress.$($el).length;
        cy.log(itemCount)
    })
 - 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)
        })

    })

它将尝试直到找到 4 个匹配的 .datatable > tr

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

当你在承诺的 .then() 部分时,正文变量已经解析:

cy.get("body").then($body => {
    cy.log($body.find(".datatable tr").length);
});`