#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
, что библиотека выглядит довольно хорошо.