Как извлечь и проверить изменение даты с помощью Cypress? - PullRequest
0 голосов
/ 17 января 2019

У меня есть страница, которая содержит текст, который сообщает мне, когда в последний раз обновлялось определенное расписание. Мне нужно взять эту дату, внести изменения в расписание, а затем проверить дату на странице, чтобы увидеть, что она изменилась / обновилась.

Проблема, с которой я столкнулся, заключается в том, чтобы понять, как «извлечь» текст, то есть дату, а затем сравнить ее после внесения изменений на страницу, чтобы сказать, что она отличается. Это HTML-код, который я хочу проверить:

<div class="link-container last-changed" ng-if="$ctrl.lastUpdatedBy"><small>Page was last updated and by:</small><br />tony itadmin 12:09 01/17/2019</div>

Я ожидаю взять из приведенного выше HTML «12:09 17/01/2019», а затем что-то изменить на странице, на которой я нахожусь. Затем, когда страница обновляется, я хочу взять временную метку и увидеть, что она отличается от «12:09 17/01/2019»

Я не уверен, с чего начать с Cypress.

1 Ответ

0 голосов
/ 17 января 2019

Шаблон, который я использую, выглядит следующим образом (хотя я пытаюсь его улучшить),

it('should update last refreshed text', () => {
  cy.contains('selector-closest-to-text', 'signature text')
    .then(els => {
      const before = els[0].textContent;         // #1 parse the text
      expect(before.length).to.be.above(0);      // #2 in case text is empty
      cy.wait(1000)                              // #3 wait a second for new timestamp
      cy.get('selector-for-refresh-trigger')...  // #4 do something to refresh 
      cy.contains('selector-closest-to-text', 'signature text')
        .should('not.contain', before)           // #5 check has actually changed
        .then(els=> {
          const after = els[0].textContent;      // #6 parse again
          expect(after.length).to.be.above(0);   // #7 in case empty
          expect(before).not.to.eq(after);       // #8 compare
        })
    });
});

Примечания:

# 1 - разбор текста

В вашем случае немного сложно получить только дату и время. Вы можете просто использовать textcontent, как я, если вы не собираетесь проверять, что другой пользователь обновил расписание, но если вам просто нужны дата и время, это выражение может сделать это

const before = els[0].textcontent.split(' ').slice(2).join(' ')

Возможно, вы захотите извлечь больше, чем просто время обновления, если это так, создайте простую функцию JS за пределами it()

const parseText = (txt) => {
  const split = txt.split(' ')
  return {
    user: split.slice(0,1),
    role: split.slice(1,1),
    timeRefreshed: split.slice(2).join(' '),
  }
}

и используйте его вот так

const user = parseText(els[0].textcontent).user
const role = parseText(els[0].textcontent).role
const before = parseText(els[0].textcontent).timeRefreshed

# 3 - в ожидании обновления

Это немного грубо, но просто. Может быть улучшено ожиданием изменения текста, should('not.contain', before) может быть достаточно.
Примечание cy.clock(), вероятно, не будет работать здесь.

# 4 - запуск обновления

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


...