Нажатие кнопки, которая существует несколько раз и также является вложенной

У меня возникла проблема: я хотел бы нажать кнопку, которая существует несколько раз на сайте и вложена в cards.

Я ищу card, где имя питомца Bala, см. вложение ниже, и я хотел бы нажать на нем кнопку с надписью Detail.

Самое далекое, что я сделал со своим решением, это то, что я могу искать правильный card и просто нажимать первую из этих кнопок Detail.

HTML:

<div _ngcontent-eng-1 = "" class = "col-md-3 pt-3 pb-3">
            <app-pet _ngcontent-eng-1 = "" _nghost-eng-2 = "" class = "dog"><div _ngcontent-eng-2 = "" class = "pet">
  <!--template bindings = {}--><div _ngcontent-eng-2 = "" class = "card">
    <div _ngcontent-eng-2 = "" class = "card-block">
      <h4 _ngcontent-eng-2 = "" class = "card-title">Bala</h4> //Checking this?
      <h6 _ngcontent-eng-2 = "" class = "card-subtitle mb-2">
        <!--template bindings = {}--><div _ngcontent-eng-2 = "" class = "badge badge-pill badge-success">
          New
        </div>
        <!--template bindings = {}--><div _ngcontent-eng-2 = "" class = "badge badge-pill badge-info">
          Important
        </div>
        &nbsp;
      </h6>
      <ul _ngcontent-eng-2 = "" class = "list-group list-group-flush">
        <li _ngcontent-eng-2 = "" class = "list-group-item">
          <div _ngcontent-eng-2 = "" class = "age">
            <span _ngcontent-eng-2 = "">Age: </span>
            <span _ngcontent-eng-2 = "">20</span>
          </div>
        </li>
        <li _ngcontent-eng-2 = "" class = "list-group-item">
          <div _ngcontent-eng-2 = "" class = "type">
            <a _ngcontent-eng-2 = "" href = "/pet/494">
              <img _ngcontent-eng-2 = "" src = "/assets/dog.gif">
            </a>
          </div>
        </li>
        <li _ngcontent-eng-2 = "" class = "list-group-item">
          <a _ngcontent-eng-2 = "" class = "btn btn-primary" href = "/pet/494">
            Detail
          </a> //CLICK
        </li>
      </ul>
    </div>
  </div>
</div>
</app-pet>
</div>

Мой код

Then('I click on the Detail button', () => {
  cy.get('div.card').contains('Bala').find('a.btn.btn-primary').click();
});

Это то, что у меня есть в настоящее время, но я уже использовал несколько разных подходов, таких как find('a').contains('Detail') или find('a').contains('btn.btn-primary') и некоторые другие подобные фрагменты кода.

Графически

Вот так выглядит сайт

Также я просмотрел некоторые похожие темы SO, но они не совсем сработали для меня.

У вас есть сайт, на который мы можем ссылаться? Это облегчило бы задачу.

jjhelguero 09.12.2022 17:09
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
2
1
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать eq, если хотите нажать определенную кнопку:

cy.contains('a', 'Detail').eq(0).click() //Clicks first Detail button
cy.contains('a', 'Detail').eq(1).click() //Clicks second Detail button

Или, если вы хотите нажать все кнопки одну за другой, вы можете использовать each:

cy.contains('a', 'Detail').each(($ele) => {
  cy.wrap($ele).click()
})

Я хотел бы нажать кнопку, где имя питомца «Бала». Однако я действительно не нашел способ сделать это.

Blain 09.12.2022 11:52

Как насчет того, чтобы попробовать это cy.contains('Bala').find('.btn.btn-primary').click()?

Alapan Das 09.12.2022 12:21

К сожалению, не работает :/ Я также пробовал: cy.contains('Bala').find('btn.btn-primary').click(), cy.contains('Bala').find('btn-primary').click(), cy.contains('Bala').find('a.btn.btn-primary').click(), cy.contains('Bala').contains('Detail').click(), но все они выдают ошибку, потому что Cypress ищет ее в h4.card-title.

Blain 09.12.2022 12:25
Ответ принят как подходящий

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

Then('I click on the Detail button', () => {
  cy.contains('div.card', 'Bala').find('a.btn.btn-primary').click();
})

Вы указываете элемент и текст в одной команде.

Кажется, я был очень близок, но все же так далеко :D Большое спасибо, теперь это работает отлично!

Blain 10.12.2022 11:57

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