在赛普拉斯如何计算一个项目的选择和得到的长度?

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

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

这很好,但是看起来有点尴尬,因为我只想计算长度,并不真正需要访问行中的内容,而且我假设做一件事比做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}。我不知道接下来该怎么办。这似乎是一件很常见的事情。

204570 次浏览

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

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

这不适用于 Cypress.$()记数法。

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

Cypress API 文件。应该()部分,使用 箭头函数:

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

这种方法允许您使用 柴湾拓展署批注并在元素列表中断言多个内容。

您还可以得到所选项目 通过它的财产的长度,例如:

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)

enter image description here 我测试了 Cypress 版本3.1.0和3.2。

一种选择是使用“ 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)
})

如果你想要更加灵活并且有一个动态的结果,使用这个。

cy.get('.listings-grid')
.find('.listing')
.then(listing => {
const listingCount = Cypress.$(listing).length;
expect(listing).to.have.length(listingCount);
});
  • . children (selector (byId,class,customAttribute))生成 DOM 元素并重试,直到默认 CommandTimeout 超过。

    柏木配置 默认命令超时

  • 一旦 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


Cy . get (‘ ul [ data-qa = “ qa-navbar”] li’)//selector . should (‘ have. length’,5)//断言

我的用例是比较,说不。在页面上的“ i”图标应该匹配的号码。表行。所以,这个解决方案是有效的,也就是说,当我想比较“不”的时候。一个选择器的元素与另一个选择器的元素的比较

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

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

为了得到你需要使用丝柏命令的长度:

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