Проверить, существует ли запись на странице

#cypress

#cypress

Вопрос:

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

Я написал тест Cypress для проверки процесса удаления, тест работает как ожидалось, появляется модальное сообщение, если пользователь подтверждает удаление, панель удаляется.

В ходе теста я убеждаюсь, что правильная панель была удалена, проверяя, не существует ли ее id на странице больше.

 const deleteResult = action => {
  cy.get('div[data-test="Results"]').should('be.visible');
  let contactID;
  cy.get('div[data-test="Results"]')
    .first()
    .within(() => {
      cy.get('p[data-test="Contact ID"]').then($match => {
        contactID= $match.html();
        cy.get('button[data-test="Delete Contact"]')
          .click()
          .get('div[data-test="Delete Record Modal"]')
          .should('be.visible')
          .get(`button[data-test="${action}"]`)
          .click();
      });
    });
  cy.get('p[data-test="Contact ID"]').each($match => {
    cy.wait(2000);
    if (action === 'Confirm Deletion') {
      cy.wrap($match)
        .invoke('text')
        .should('not.eq', contactID);
    } else {
      cy.wrap($match)
        .invoke('text')
        .should('eq', contactID);
    });
};
  

Теперь я пытаюсь написать тест другого варианта — пользователя, который отменяет удаление, мне нужно проверить, contactID существует ли данная запись на странице, как я могу этого добиться?

Приведенный выше код неверен, он ожидает, что у всей панели будет заданное значение contactID .

Редактировать:

 const deleteResult = action => {
  cy.get('div[data-test="Results"]').should('be.visible');
  let contactID;
  cy.get('div[data-test="Results"]')
    .first()
    .within(() => {
      cy.get('p[data-test="Contact ID"]').then($match => {
        contactID= $match.text();
        cy.get('button[data-test="Delete Contact"]')
          .click()
          .get('div[data-test="Delete Record Modal"]')
          .should('be.visible')
          .get(`button[data-test="${action}"]`)
          .click();
      });
    });
  cy.wait(2000);
  const els = cy.get('p[data-test="Contact ID"]');
  if (action === 'Confirm Deletion') {
    els.each($match => {
      cy.wrap($match)
        .invoke('text')
        .should('not.eq', contactID); //contactID is the actual ids
    });
  } else {
    els.should('contain', contactID); //contactID is undefined
  }
};
  

Ответ №1:

Вы можете переместить if перед своей cy.get , чтобы ваша логика больше не была вложена внутрь .each

 const els = cy.get(...)
if (something) {
  cy.then(() => els.should('not.contain', contactID))
} else {
  els.each(...)
}

  

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

1. Спасибо, по какой-то причине each часть работает как ожидалось, но els.should('not.contain', contactID) выдает ошибку: expected [ <p>, 2 more... ] to contain undefined Как это могло быть? Почему на else contactID ее нет undefined , а на if она есть?

2. contactID Находится undefined не только в each

3. Попробуйте contactID = $match.text()

4. Убедитесь, что вы ввели оператор if ниже const els = cy.get('p[data-test="Contact ID"]')

5. Конечно, все же undefined я не понимаю, как это могло быть, пожалуйста, смотрите мой отредактированный вопрос.