У меня есть эта команда 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 когда-либо решить проблему.
row
=> должно быть cy.get('row').last()
.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, как правило, не работает без тщательного тестирования того, что ваш код будет выполняться и не будет иметь каких-либо условий гонки. Когда это возможно, попробуйте объединить свои команды в цепочку или уберите необходимость объявлять что-то как переменную.