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

enter image description here Я тестировал с 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);
  });