Сравните одно значение даты с другими датами и выполните условное действие в cypress

#cypress

Вопрос:

Я пытаюсь сравнить одно значение даты (т. Е. базовое значение) со всеми другими значениями даты на странице, и на основе разницы между этими днями я хочу выполнить другие команды.

введите описание изображения здесь

Ну, в приведенном выше пользовательском интерфейсе базовое значение равно 11 июля 2021 года (дата отправления в первом списке), а другие значения дат-12 июля 2021 года, 20 июля 2021 года, 27 июля 2021 года, 3 августа 2021 года и так далее (Даты прибытия из 2-го списка и далее).

Теперь мне пришлось удалить все списки, где разница в датах между базовым значением и конкретным списком составляет менее 15 дней. В этом случае 12 июля 2021 года, 20 июля 2021 года должны были быть удалены, а все списки с 27 июля 2021 года, 3 августа 2021 года и так далее должны быть нетронутыми, как показано на рисунке ниже.

введите описание изображения здесь

До сих пор я фиксировал значение базового значения и придумал логику для сравнения его с другим значением даты, но я не уверен, как я могу сохранить 2-е и последующие значения даты в переменную для сравнения с базовым значением.

 {
  cy.get("[data-test='departureTime']")
    .eq(0)
    .then((date) => {
      const depDate_FirstPort = new Date(date.text());
      cy.log(depDate_FirstPort.toISOString()); //2021-07-11T19:00:00.000Z

      // const arrDate_SecondPort = new Date(cy.get('[data-test="arrivalTime"]').eq(1).invoke('text'));
      // Since the above approach does not work, hard coding now. 
     
      const arrDate_SecondPort = new Date("22 Jul 2021 12:01")
      cy.log(arrDate_SecondPort.toISOString()); //2021-07-22T10:01:00.000Z

      cy.getDifferenceBetweenDates(depDate_FirstPort,arrDate_SecondPort).then((dif)=>{
        if(dif < 16) {
          cy.log("delete the port entry");
          //do something
        }
      });
    });
  }
 

Команда «Кипарис»:

 Cypress.Commands.add("getDifferenceBetweenDates", (Date1, Date2) => {
  var diff_times =  Math.abs(Date1.getTime() - Date2.getTime());
  var diff_days = Math.ceil(diff_times / (1000 * 3600 * 24));
  cy.log(diff_days) //11
})
 

Кроме того, любопытно узнать, какой возможный подход к повторению всего списка подпадает под «список подлежащих удалению» (12 июля 2021 года, 20 июля 2021 года) на основе условия, упомянутого выше.

Ответ №1:

У вас есть итерационный подход, но вам нужно повторить код, который у вас есть для первой даты, чтобы получить последующие даты.

Итак, это немного, но изменение индекса

 cy.get("[data-test='departureTime']")
  .eq(0)                              // 1,2,3 etc
  .then((date) => {
 

Другой подход заключается в фильтрации всего набора,

 const dayjs = require('dayjs')  // replaces Cypress.moment
                                // first install with
                                // yarn add -D dayjs

it('finds the skipped ports', () => {

  // helper func with format specific to this website
  const toDate = (el) => dayjs(el.innerText, 'D MMM YYYY HH:mm') 
  
  cy.get("[data-test='departureTime']")
    .then($departures => {                  
      const departures = [...$departures]    // convert jQuery object to an array
      const first = toDate(departures[0]);
      const cutoff = first.add(15, 'day')

      const nextPorts = departures.slice(1)  // all but the first
      const skipPorts = nextPorts.filter(port => toDate(port).isBefore(cutoff))

      expect(skipPorts.length).to.eq(2)
      expect(skipPorts[0].innerText).to.eq('12 Jul 2021 14:02')
      expect(skipPorts[1].innerText).to.eq('21 Jul 2021 04:00')
    })  
})
 

Я не совсем понимаю вашу цель, но если вы действительно собираетесь удалить пропуски со страницы, а не просто протестировать их, вам следует опасаться, что список DOM изменится при этом.

Удаление из списка, к которому вы недавно обращались, cy.get("[data-test='departureTime']") приведет к тому, что внутренняя тема станет недействительной, и вы можете получить ошибки «отсоединения от DOM» или удалить неправильный элемент.

Комментарии:

1. Спасибо, что показали нам свой ценный опыт в преобразовании дат и объектов jQ, я многому научился из вашего ответа.

2. Спасибо @RosenMihaylov, мне нужна практика, поэтому я решил попробовать дневную тренировку. Первое впечатление было ???, но после решения проблемы я должен сказать dayjs , что библиотека выглядит довольно хорошо.