В нашем приложении у нас есть экран с несколькими заголовками (.tasktable__header.tasktable__header--title), и я хочу проверить эти заголовки. Код, который у меня был, не работал, потому что он всегда смотрел на первый доступный элемент.
verifySubIncidentTitleMatch(incident: string): void {
cy.get(this.#subDossierTitle).each(ele => {
expect(ele.text()).to.equal(incident);
})
}
Но я хочу сохранить заголовки в массиве, а затем сравнить их, но я не знаю, как это сделать.
Вот HTML. Классы таблицы находятся в div 'top20' (первый снимок экрана) А 'tasktable__header--title находится внутри заголовка этого класса.
Можете ли вы добавить немного HTML для таблиц?
Вы уже изучили документацию оператора запроса «get»: docs.cypress.io/api/commands/get Там есть несколько хороших примеров.
Я бы сказал, что вместо использования .each() вы просто хотите выбрать одно из названий с помощью .eq().
cy.get(this.#subDossierTitle)
.eq(1) // use 1 if it's the 2nd title
.should('have.text', incident)
})
Вам придется решить, какой из них правильный, возможно, методом проб и ошибок, если это не очевидно из HTML.
Я бы также предложил добавить атрибут data-cy, чтобы сделать заголовок уникальным.
Не только это, но документация предлагает ориентироваться на атрибуты данных, а не на идентификаторы или классы.
Используемый селектор вполне может быть атрибутом данных, о чем вы не можете знать. @darthvader, вы путаете идентификаторы с приватными полями класса
@AAQadosh, вы правы насчет данных, но здесь это невозможно. Может быть 1 субинцидент или x субинцидентов. Мы стараемся использовать как можно больше меток data-cy.
У вас есть другой вариант, то есть использовать утверждение oneOf — это эффективно сопоставляет «многие к одному», т. е. многие тексты элементов соответствуют одной строке инцидента.
Я предполагаю на данный момент, что вы просто хотите знать, что один из них совпадает, и на самом деле не важно, какой из них.
verifySubIncidentTitleMatch(incident: string): void {
cy.get(this.#subDossierTitle).should(els => {
const texts = [...els].map(el => el.text)
expect(incident).to.be.oneOf(texts)
})
}
Спасибо, не знал oneOf, так что попробуем.
Если вы хотите сохранить тексты заголовков в массиве, используйте обратный вызов .then() для преобразования и используйте include для результирующего массива.
verifySubIncidentTitleMatch(incident: string): void {
cy.get(this.#subDossierTitle)
.then(elements => Array.from(elements).map(element => element.innerText))
.should('include', incident)
}
Вы также можете подать заявку Array.some()
verifySubIncidentTitleMatch(incident: string): void {
cy.get(this.#subDossierTitle)
.then(elements => Array.from(elements).map(element => element.innerText))
.should(titles => {
expect(titles.some(title => title === incident)).to.eq(true)
})
}
Спасибо! Решение Array.some работает просто отлично! Тест по-прежнему не проходит, но теперь разработчики должны убедиться, что приложение работает должным образом ;-)
Как вы собираетесь нацеливаться на более чем один, когда вы пытаетесь получить id, когда идентификаторы должны использоваться только один раз?