Перевод статьи «.contains() – an overlooked gem in Cypress».
.contains()
– одна из моих любимых команд в Cypress. Хотя название этой команды звучит как утверждение, на самом деле она является командой выбора.
Очень важно понимать это различие. Несколько запутанное название команды .contains()
может привести к тому, что вы не заметите ее возможностей. Часть вечной борьбы при тестировании заключается в том, чтобы найти подходящий селектор и при этом сделать тест легко читаемым. Команда.contains()
полагается на выбор элемента по тексту, но в действительности она может делать гораздо больше.
Подпишитесь на наш ТЕЛЕГРАМ КАНАЛ ПО АВТОМАТИЗАЦИИ ТЕСТИРОВАНИЯ
Давайте рассмотрим, что именно делает эту команду такой замечательной.
Наше приложение имеет довольно простую структуру:
<h1>Apples and other fruits</h1> <ul> <li>Apple ?</li> <li>Pear ?</li> <ul>
Простое использование – выделение элемента, содержащего текст
Если вы знакомы с этой командой, то, вероятно, уже знаете, что она помогает выделить элемент с помощью текста:
cy .contains('Apples')
Все просто и понятно. Вы знаете, что она сделает. Команда выделит наш заголовок. Обратите внимание, что нам даже не нужно писать весь текст, достаточно просто добавить слово Apples
.
Следует иметь в виду, что если бы мы просто использовали Apple
в качестве текста, то результат был бы другим, поскольку Apple
встречается на нашей странице дважды. По умолчанию .contains()
будет искать по всему DOM и возвращать первый элемент с подходящими параметрами. Если у вас есть несколько элементов с одинаковым текстом, вам необходимо расширить область поиска.
Определение масштаба поиска
Я люблю объяснять разницу между дочерними, родительскими и двойными командами на примере команды .contains()
. Это отличный пример двойной команды. .contains()
будет искать в области действия предыдущей команды, если таковая существует.
cy .contains('Apple') // will select heading cy .get('li') .contains('Apple') // will select the "Apple ?" element
Эта команда помогает вам найти нужный элемент, поэтому если у вас есть <button>
, где текст находится внутри элемента <span>
, в итоге будет выбран элемент <button>
. Существует определенный порядок предпочтения элементов, который вы можете посмотреть в документации по Cypress.
Однако можно подойти к выбору нужного элемента и по-другому. Это передача двух аргументов в функцию .contains()
. В данном случае первым элементом будет селектор, задающий область видимости искомого элемента.
cy .contains('ul', 'Pear')
Посмотрите, какой элемент был выбран:
Таким образом, я выбираю родительский элемент ul
.
Подбор правильного текста
Если вас не смущают маленькие и большие буквы, вы можете передать в функцию дополнительный параметр, чтобы игнорировать регистр:
cy .contains('apples', { matchCase: false })
Это особенно удобно, когда текст абстрагирован в отдельной переменной или файле, поскольку могут использоваться различные языковые мутации.
Если этого недостаточно, вы можете использовать regex
для сопоставления любой строки.
cy .contains(/Apple/)
Хотя .contains()
звучит как утверждение и может быть использовано как утверждение, оно предназначено для выделения элементов. Я уже писал о различных способах выбора элементов с помощью Cypress в прошлом, и .contains()
является отличным дополнением к этому. Даже если у вас нет полного контроля над тестируемым приложением, эти команды могут стать хорошей заменой xpath или сложным css-селекторам.