Как проверить, совпадают ли заголовки в Cypress

В нашем приложении у нас есть экран с несколькими заголовками (.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 находится внутри заголовка этого класса.

Как вы собираетесь нацеливаться на более чем один, когда вы пытаетесь получить id, когда идентификаторы должны использоваться только один раз?

DᴀʀᴛʜVᴀᴅᴇʀ 21.02.2023 17:26

Можете ли вы добавить немного HTML для таблиц?

agoff 21.02.2023 17:28

Вы уже изучили документацию оператора запроса «get»: docs.cypress.io/api/commands/get Там есть несколько хороших примеров.

Marcel 22.02.2023 14:01
Принципы SOLID в JavaScript с примерами
Принципы SOLID в JavaScript с примерами
Принцип единой ответственности подразумевает то, что:
Типы привязки данных в Angular
Типы привязки данных в Angular
Привязка данных автоматически поддерживает страницу в актуальном состоянии на основе состояния вашего приложения. Вы используете привязку данных,...
3 паттерна TypeScript, которые я использую в своей повседневной работе
3 паттерна TypeScript, которые я использую в своей повседневной работе
В TypeScript 2.0 в язык был добавлен модификатор readonly.
Мифический Angular - Миф Angular: стили компонентов
Мифический Angular - Миф Angular: стили компонентов
Это очень короткая и интересная для меня тема. В Angular каждый компонент может иметь свои собственные прикрепленные стили. Стили могут находиться в...
Подсказка RxJS [filter, skipWhile]
Подсказка RxJS [filter, skipWhile]
Эта подсказка описывает разницу между операторами filter и skipWhile из библиотеки RxJS .
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
2
3
58
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я бы сказал, что вместо использования .each() вы просто хотите выбрать одно из названий с помощью .eq().

cy.get(this.#subDossierTitle)
  .eq(1) // use 1 if it's the 2nd title
  .should('have.text', incident)
})

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

Я бы также предложил добавить атрибут data-cy, чтобы сделать заголовок уникальным.

A.A.Qadosh 21.02.2023 20:16

Не только это, но документация предлагает ориентироваться на атрибуты данных, а не на идентификаторы или классы.

DᴀʀᴛʜVᴀᴅᴇʀ 21.02.2023 20:43

Используемый селектор вполне может быть атрибутом данных, о чем вы не можете знать. @darthvader, вы путаете идентификаторы с приватными полями класса

Val 21.02.2023 21:50

@AAQadosh, вы правы насчет данных, но здесь это невозможно. Может быть 1 субинцидент или x субинцидентов. Мы стараемся использовать как можно больше меток data-cy.

Jasper Slokker 22.02.2023 08:45

У вас есть другой вариант, то есть использовать утверждение 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, так что попробуем.

Jasper Slokker 23.02.2023 10:11
Ответ принят как подходящий

Если вы хотите сохранить тексты заголовков в массиве, используйте обратный вызов .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 работает просто отлично! Тест по-прежнему не проходит, но теперь разработчики должны убедиться, что приложение работает должным образом ;-)

Jasper Slokker 23.02.2023 11:36

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