Cypress обнаружил промис, хотя промисы не были созданы

У меня есть эта команда Cypress, где я проверяю элементы внутри .row. Он отлично работает, если я перебираю элементы .row, но не работает, если я передаю определенный элемент .row. Я не уверен, что делать с сообщением об ошибке, потому что я нигде не использую промисы.

Команда:

Cypress.Commands.add('normalRowCheck', row => {
    cy.wrap(row).find('button').should('have.text', 'X')
    cy.wrap(row).find('form').should('not.exist')
    cy.wrap(row).find('input').should('not.exist')
    cy.wrap(row).should('have.class', 'row')
})

Работает:

cy.get('.row').each((row, i) => { 
    cy.wrap(row).find('div').should('have.text', 'Adding Task ' + (i+4))
    cy.normalRowCheck(row)
})

Не работает:

cy.normalRowCheck(cy.get('.row').last())

Ошибка: появляется при первом вызове cy.wrap

Cypress обнаружил, что вы вернули обещание из команды, а также вызвали одну или несколько команд cy в этом обещании.

Команда, которая вернула обещание, была:

cy.wrap()

Команда cy, которую вы вызвали внутри промиса, была:

cy.then()

Поскольку команды Cypress уже похожи на промисы, вам не нужно оборачивать их или возвращать собственные промисы.

Cypress разрешит вашу команду с тем, что дает окончательная команда Cypress.

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

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
12
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  1. Я думаю, что есть ошибка в объявлении row => должно быть cy.get('row').last().
  2. Я не верю, что Cypress завершил получение элемента для row, прежде чем вы попытаетесь обернуть его во втором примере. Вы можете исправить это несколькими способами, но вот два примера.

Во-первых, вы можете просто передать полученный элемент в .then(), который затем имеет Элемент JQuery, который ваша пользовательская команда может правильно обернуть.

// using a `.then()`
cy.get('.row').last().then(($row) => {
  cy.normalRowCheck($row);
})

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

// modifying your custom commands to receive the previously yielded subject
Cypress.Commands.add('normalRowCheck', {prevSubject: 'element'}, (row) => {
    cy.wrap(row).find('button').should('have.text', 'X')
    cy.wrap(row).find('form').should('not.exist')
    cy.wrap(row).find('input').should('not.exist')
    cy.wrap(row).should('have.class', 'row')
});

// using the command
cy.get('.row').last().normalRowCheck();
// using the command with .each()
cy.get('.row').each((row, i) => { 
    cy.wrap(row).find('div').should('have.text', 'Adding Task ' + (i+4))
  cy.wrap(row).normalRowCheck();
});

Еще один совет: смешивание переменных и команд Cypress, как правило, не работает без тщательного тестирования того, что ваш код будет выполняться и не будет иметь каких-либо условий гонки. Когда это возможно, попробуйте объединить свои команды в цепочку или уберите необходимость объявлять что-то как переменную.

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