Darksymphony
Darksymphony

Reputation: 2693

Cypress number of elements in a table

Is there an easier way to count the number of elements in a table via Cypress? I have a 3 column table and I want to count, how many times is "India" in my table.

I tried it this way:

   cy.get('ag-grid-table').contains(country).its('length').as("countrylength");
        cy.get('@countrylength').then((ccc) => {
          cy.log(ccc)
           })

but this gives me always 1, as it finds only first element.

Then I have this solution, that may probably work:

let count = 0;
cy.get('ag-grid-table div.ag-row').each(($el, index, $list) => {
 
    if($el.text().includes(country))
    {  count ++;    }      
   
}
     

but can't we just find that country with one line command using length()?

Upvotes: 0

Views: 1015

Answers (3)

If you want to use the alias value later in the test, or in another test you could access it directly from the "Mocha context" by using a function callback

if('tests the ag-grid', function() {    // now alias value is available on "this"

  cy.get('ag-grid-table  div.ag-row')
    .invoke('text')
    .then(text => text.match(/India/g).length)   // number of occurrences in table 
    .as("countrylength");

  cy.get('.flags').should('have.length', this.countrylength)
})

Upvotes: 3

Alapan Das
Alapan Das

Reputation: 18624

You can use the filter command for this:

cy.get('ag-grid-table div.ag-row')
  .filter(':contains("India")')
  .should('have.length', 3)

In case you want to use the length of different tests in your project you can use Cypress.env(). As aliases as are removed after every test.

cy.get('ag-grid-table div.ag-row')
  .filter(':contains("India")')
  .its('length')
  .then((len) => {
    Cypress.env('length', len)
  })

//To use it in other test
cy.get('selector').type(Cypress.env('length'))
cy.get('selector').should('have.length', Cypress.env('length'))

Upvotes: 0

TesterDick
TesterDick

Reputation: 10550

You could just move the contains() inside the selector, it gets around the restriction of only returning the first result.

You need to merge the country variable into the selector as well, either with a string template as below, or by concatenating strings (+ operator).

cy.get(`ag-grid-table  div.ag-row:contains("${country}")`)
  .its('length').as("countrylength");

cy.get('@countrylength').should('eq', 3)

Upvotes: 5

Related Questions