Cypress: Могу ли я предотвратить сбой Cypress cy.get, если элементы не найдены?

Я использую Cypress cy.get для захвата элементов, но если их нет, мой тест не работает. Я не хочу, чтобы он потерпел неудачу. Я хочу, чтобы это продолжалось. Тест заключается в том, чтобы просто перечислить элементы, которые есть, если таковые имеются.

const listItemTitle = '[data-cy-component=list-item-title]';
cy.get(listItemTitle).each(($el, index, $list) => {
  cy.wrap($el).then(($span) => {
    const spanText = $span.text();
    cy.log(`index: ` + index + ' ' + spanText);
  });
});

Я бы подумал, если бы там не было элементов - этот код все равно был бы в порядке, но не так. Когда я запускаю его, я получаю эту ошибку: CypressError: Превышено время ожидания повторной попытки: Ожидалось найти элемент: '[data-cy-component = list-item-title]', но так и не нашел.

Он отлично работает там, где присутствуют элементы. Если элементы не найдены, я хочу продолжить и провести другой тест.

Вот эксперимент, который я пробовал:

let count: number = Cypress.$(listItemTitle).length;
cy.log('before:' + count);
cy.get(actionsBarActionsAdd).click();
cy.get(singlePickerSearch).type('Assets' + '{enter}');
cy.get(listItemCheckboxTitle)
  .first()
  .click();
cy.toast({
  type: 'Success',
});
count = Cypress.$(listItemTitle).length;
cy.log('after:' + count);
cy.get(listItemTitle).each(($li, index, $lis) => {
  cy.log('interface no. ' + (index + 1) + ' of ' + $lis.length);
  cy.wrap($li).click();
});

Результат был таким:

18 LOG        before:0
19 GET       [data-cy-component-key = "actions-add"] input
20 CLICK
21 GET       [data-cy-component=single-picker-search] input
22 TYPE      Assets{enter}
23 GET       [data-cy-component = "list-item-checkbox-title"]
24 FIRST
25 CLICK
26 GET       .iziToast    toast2
27 ASSERT    expected [ <div.iziToast.iziToast-opening.fadeInUp.iziToast-theme- 
alloy.iziToast-color-green.iziToast-animateInside>, 1 more... ] to have class iziToast-color-green
28 LOG       after:0
29 GET       [data-cy-component=list-item-title]
30 LOG       interface no. 1 of 1

Окончательно показывает, что Cypress. $ (ListItemTitle) .length не подсчитывает количество элементов с помощью selector: listItemTitle.

Обновлять:

Поместив cy.wait (1000); после выполнения добавления (в моем эксперименте) - давая DOM время на обновление - новый элемент был найден. С более конкретными селекторами ждать не нужно.

Обратите внимание, что Cypress не поддерживает условное тестирование: docs.cypress.io/guides/core-concepts/…

Francis Nepomuceno 11.01.2019 22:10

@Neps - вопрос не в этом.

Steve Staple 18.01.2019 16:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
2
8 876
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать jquery через Cypress.$, чтобы проверить, существуют ли они.

const listItemTitle = '[data-cy-component=list-item-title]';
if (Cypress.$(listItemTitle).length > 0) {
  cy.get(listItemTitle).each(($el, index, $list) => {
    cy.wrap($el).then(($span) => {
    const spanText = $span.text();
    cy.log(`index: ` + index + ' ' + spanText);
    });
  });
}

Cypress. $ (ListItemTitle) .length не дает ответа, который, по вашему мнению, дает. Он не подсчитывает количество элементов listItemTitle.

Steve Staple 18.01.2019 16:28

@SteveStaple, как вы думаете, что это дает? Я использую это в своих тестах в нескольких местах. Если элемент существует, он выполняет код в блоке if, если элемент не существует, его нет.

Brendan 18.01.2019 16:48

Я не вижу связи между количеством элементов и результатом .length. Я проводил тесты, в которых считаю до и после добавления элемента, и в обоих случаях ответ по-прежнему равен 0.

Steve Staple 18.01.2019 16:53

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

Brendan 18.01.2019 19:18

@SteveStaple спасибо за участие в этом ответе, это похоже на интересную проблему.

Richard Matsen 18.01.2019 20:27

Одно потенциальное различие (в вашем эксперименте) заключается в том, что cy.get() имеет встроенную повторную попытку 5 секунд, тогда как Cypress.$(listItemTitle) является синхронной. Что произойдет, если вы укажете cy.wait(5000) перед повторным счетом или будете считать после последнего cy.get(listItemTitle)?

Richard Matsen 18.01.2019 20:32

@Brendan После дальнейшего расследования выяснилось, что все так, как вы сказали. Пришлось перенастроить, чтобы сделать селекторы более конкретными. Теперь все работает как положено. Поместив cy.wait (1000); после выполнения добавления (в моем эксперименте) - давая DOM время на обновление - новый элемент был найден. С более конкретными селекторами ждать не нужно. Думаю, этот вопрос можно смело закрывать.

Steve Staple 18.01.2019 20:35

Приятно слышать, что это работает на вас! Вы можете принять ответ?

Brendan 18.01.2019 20:54

@Brendan, если я хочу использовать spanText вне функции, как я могу добиться этого, как я пробовал нет. раз, но каждый раз получая NULL. есть ли способ сделать это с кипарисом?

Nitish Kumar 08.05.2020 15:29

Не как есть, потому что вы смешиваете синхронизирующий и асинхронный код. Возможно, это поможет вам лучше понять: docs.cypress.io/guides/core-concepts/…

Brendan 08.05.2020 20:34

У меня аналогичная проблема, но этот ответ не сработает для меня, потому что if оценивается немедленно, прежде чем запускается что-либо еще.

mzedeler 01.03.2021 21:18

Можно использовать cy.get(".field").should("have.length", 0)

Другие вопросы по теме