В Cypress, как подсчитать выбор предметов и получить длину?
Я начинаю изучать 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}
. Я не знаю, куда идти отсюда. Похоже, это было бы очень распространенным делом.
Ответы
Ответ 1
Найден решение. Это работает, чтобы проверить количество элементов:
cy.get('.datatable').find('tr').should('have.length', 4)
Это не работает с методом обозначения Cypress.$()
.
Ссылка: https://docs.cypress.io/guides/references/assertions.html#Length
Ответ 2
Вы также можете узнать длину выбранных элементов через их свойство, например:
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.
Ответ 3
В разделе docs (.should() 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')
})
Такой подход позволит вам использовать запись Chai BDD и утверждать более одного элемента в вашем списке элементов.
Ответ 4
Одним из вариантов является использование "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)
})
Ответ 5
Есть ли способ сделать это, чтобы он не потерпел неудачу, когда не было найдено детей?
const tabbedPanelContainer = '[data-cy-component=tabbed-panel-container]';
const listItemTitle = '[data-cy-component=list-item-title]';
cy.get(tabbedPanelContainer)
.find(listItemTitle)
.each((row) => {
cy.wrap(row).click();
});
Это вызывает сбой, когда их нет:
CypressError: Timed out retrying: Expected to find element: '[data-cy-component=list-item-title]', but never found it. Queried from element: <div.tabs-container>
Ответ 6
если вы хотите более гибко и иметь динамический результат, используйте это.
cy.get('.listings-grid')
.find('.listing')
.then(listing => {
const listingCount = Cypress.$(listing).length;
expect(listing).to.have.length(listingCount);
});