Home > Software design >  cypress - each iterate over a list and select second appearance from list
cypress - each iterate over a list and select second appearance from list

Time:02-16

I have a list of elements with the following numbers - actually it's a date picker:

[26,27,28,29,30,31,1,2,3,4,5,6,7,8,9,10,........27,28,29,30,31,1,2,3,4] //days of month

I need to select two dates like 6 and 27 as a date range. The problem is, there are duplicated numbers in the list and when the iteration starts, the first 27 selected, not the second one. It ruins my test because first date 27th is from previous month. Current month starts @ 1, so I need to select the date after 1.

//Current behavior: My test clicks on 6 and in the new iteration, clicks on the first 27.

I need to do the iteration to check the numbers and skip the first occurrence and click on the second one.

How I can solve this issue with each? I tried like this, but eq() doesn't work.

let dayVar = 27
.find('.datepicker-row > a').children('span').each(($el, index, list) => {
if($el.text() > 25 && index < 10) {
             cy.wrap($el).should('contain.text', dayVar).eq(1).click()
         } else {
             cy.wrap($el).should('contain.text', dayVar).eq(0).click()
         }
})

Many thanks!

CodePudding user response:

I believe your error is coming from the fact that a should('contain.text') operates on a singular yielded element, and not a list of elements, so when should() finishes and passes its element to the eq(), there is only one element. Reversing the order of these should suffice.

...
if($el.text() > 25 && index < 10) {
             cy.wrap($el).eq(1).should('contain.text', dayVar).click()
         } else {
             cy.wrap($el).eq(0).should('contain.text', dayVar).click()
         }
})

Additionally, you could simplify this logic using a ternary operator like so:

...
cy.wrap($el).eq(($el.text() > 25 && index < 10 ? 1 : 0).should('contain.text', dayVar).click();

CodePudding user response:

You can remove the duplicates from the array using this:

let dates = let dates = [
  26, 27, 28, 29, 30, 31, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10....27, 28, 29, 30, 31, 1,
  2, 3, 4
]
let uniqueDates = [...new Set(dates)]
//uniqueDates are the array for unique dates

You can do something like this. First, push all the dates inside an array as numbers. Then remove the duplicates. And then iterate over the array and perform actions.

let dates = []
cy.get('selector')
  .find('.datepicker-row > a')
  .children('span')
  .each(($el) => {
    dates.push( $ele.text().trim())
  })
let uniqueDates = [...new Set(dates)]
cy.wrap(uniqueDates).each((num, index) => {
  if (num > 25 && index < 10) {
    cy.contains('.datepicker-row > a', num.toString()).eq(1).click()
  } else {
    cy.contains('.datepicker-row > a', num.toString()).eq(0).click()
  }
})
  • Related