#css-selectors #cypress
Вопрос:
Я работаю с Cypress уже несколько недель, и мне начинает требоваться более сложный выбор. Прямо сейчас я не понимаю, как связать селекторы в цепочку, чтобы получить то, что мне нужно.
Вот упрощенная версия HTML, на которую я смотрю:
<my-application-list-item test-hook="applicationListItem">
<div>
<!---->
<div>
<header>
<a test-hook="name" href="/build/applications/iVANKl9Z">E2E Test Item</a>
<my-build-application-menu>
<!---->
<my-dropdown testhook="actionsMenu">
<my-icon-button-settings testhook="openActionsMenu">
<button testhook="openActionsMenu">
Тестовые крючки были размещены, когда мы использовали транспортир, и в переносе есть несоответствие. Но в любом случае, я хочу найти и щелкнуть openActionsMenu
то, что находится внутри applicationListItem
, которое содержит видимый текст «Тестовый элемент E2E».
Я думал, что это сработает, основываясь на документах для get
, contains
, и find
:
cy.get('[test-hook="applicationListItem"]')
.contains("E2E Test Item")
.find('[testhook="openActionsMenu"]')
но это привело к
Timed out retrying after 4000ms: Expected to find element: [testhook="openActionsMenu"], but never found it. Queried from element: <a.ellipsis.my-info-box__title-link.my-link>
даже несмотря на то, что бежал
cy.get('[testhook="openActionsMenu"]')
преуспевает. Что я делаю не так?
Ответ №1:
Используйте .contains(selector, content)
форму содержит().
Переданный предмет-это тот, который соответствует selector
.
cy.contains('[test-hook="applicationListItem"]'), "E2E Test Item")
.find('[testhook="openActionsMenu"]')
Поэкспериментируйте немного, используйте .then(console.log)
, чтобы проверить предмет в этот момент
cy.contains('[test-hook="applicationListItem"]'), "E2E Test Item")
.then(subject => console.log(subject) // <my-application-list-item>
.find('[testhook="openActionsMenu"]')
.then(subject => console.log(subject) // <my-icon-button-settings>
Ответ №2:
«содержит» возвращает элемент, содержащий текст, в данном случае тег <a><a>. Если вы используете братьев и сестер(), вы можете заставить бегуна искать в следующем элементе:
cy.get('[test-hook="applicationListItem"]')
.contains("E2E Test Item")
.siblings()
.find('[testhook="openActionsMenu"]')
Комментарии:
1. Решение, которое я принял, ближе к моему конкретному случаю, но о существовании
siblings
его хорошо знать, спасибо.