Я использую 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 время на обновление - новый элемент был найден. С более конкретными селекторами ждать не нужно.
@Neps - вопрос не в этом.





Вы можете использовать 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.
@SteveStaple, как вы думаете, что это дает? Я использую это в своих тестах в нескольких местах. Если элемент существует, он выполняет код в блоке if, если элемент не существует, его нет.
Я не вижу связи между количеством элементов и результатом .length. Я проводил тесты, в которых считаю до и после добавления элемента, и в обоих случаях ответ по-прежнему равен 0.
Вы уверены, что ваш селектор правильный? Если он не соответствует элементу, как вы ожидаете, это объяснит, что когда-либо было найдено 0 элементов.
@SteveStaple спасибо за участие в этом ответе, это похоже на интересную проблему.
Одно потенциальное различие (в вашем эксперименте) заключается в том, что cy.get() имеет встроенную повторную попытку 5 секунд, тогда как Cypress.$(listItemTitle) является синхронной. Что произойдет, если вы укажете cy.wait(5000) перед повторным счетом или будете считать после последнего cy.get(listItemTitle)?
@Brendan После дальнейшего расследования выяснилось, что все так, как вы сказали. Пришлось перенастроить, чтобы сделать селекторы более конкретными. Теперь все работает как положено. Поместив cy.wait (1000); после выполнения добавления (в моем эксперименте) - давая DOM время на обновление - новый элемент был найден. С более конкретными селекторами ждать не нужно. Думаю, этот вопрос можно смело закрывать.
Приятно слышать, что это работает на вас! Вы можете принять ответ?
@Brendan, если я хочу использовать spanText вне функции, как я могу добиться этого, как я пробовал нет. раз, но каждый раз получая NULL. есть ли способ сделать это с кипарисом?
Не как есть, потому что вы смешиваете синхронизирующий и асинхронный код. Возможно, это поможет вам лучше понять: docs.cypress.io/guides/core-concepts/…
У меня аналогичная проблема, но этот ответ не сработает для меня, потому что if оценивается немедленно, прежде чем запускается что-либо еще.
Можно использовать cy.get(".field").should("have.length", 0)
Обратите внимание, что Cypress не поддерживает условное тестирование: docs.cypress.io/guides/core-concepts/…