В Playwright работа с элементами на веб-странице имеет большое значение для написания надежных и эффективных тестов. При этом, использование селекторов для указания конкретных элементов часто может быть более гибким и мощным, чем простое использование ID или классов. Одной из полезных техник является работа с элементами по их порядковому номеру в DOM-дереве — это позволяет точно указать, какой элемент на странице нужно выбрать.
В Playwright, как и в других библиотеках для автоматизации браузеров,
можно использовать псевдокласс nth-child CSS-селектора для
выбора элемента по его порядковому номеру среди других элементов одного
типа. Это полезно, когда требуется взаимодействовать с конкретным
элементом, например, при наличии повторяющихся блоков или списков.
Чтобы выбрать третий элемент списка, можно использовать следующий селектор:
await page.locator('ul li:nth-child(3)').click();
Этот код ищет на странице первый список (ul), затем
выбирает третий элемент в нем (li:nth-child(3)) и кликает
на него. При этом элемент будет найден по его порядковому номеру в
родительском элементе.
Важно помнить, что нумерация в CSS начинается с 1. То есть
nth-child(1) всегда будет ссылаться на первый элемент в
родительском контейнере, nth-child(2) — на второй и так
далее.
Также стоит учитывать, что nth-child выбирает не только
элементы данного типа, но и все другие дочерние элементы родительского
элемента, включая текстовые узлы и комментарии. Чтобы избежать таких
ошибок, можно использовать более строгие селекторы.
Для того чтобы точно выбрать только элементы списка, можно использовать более детализированный CSS-селектор:
await page.locator('ul > li:nth-child(3)').click();
Здесь ul > li:nth-child(3) гарантирует, что третий
элемент будет выбран только среди прямых дочерних элементов списка
(li), а не среди всех детей.
Псевдоклассы first-child и last-child
позволяют быстро и эффективно выбирать первый и последний элементы в
родительском контейнере, что часто бывает полезно при взаимодействии с
элементами, расположенными в списках, таблицах и других повторяющихся
структурах.
Чтобы выбрать первый элемент в списке и кликнуть по нему, используем следующий код:
await page.locator('ul > li:first-child').click();
Этот код найдет первый элемент в списке и выполнит клик. Здесь
first-child гарантирует выбор именно первого дочернего
элемента типа li внутри списка ul.
Для выбора последнего элемента можно использовать псевдокласс
last-child. Например:
await page.locator('ul > li:last-child').click();
В этом случае будет выбран последний элемент списка и клик по нему.
Иногда элементы на странице динамически обновляются или изменяются. В таких случаях важно, чтобы тесты могли работать с элементами, которые появляются или исчезают в процессе выполнения.
Селекторы nth-child, first-child и
last-child идеально подходят для таких случаев, так как они
могут динамически ссылаться на изменяющиеся элементы. Например, если
список элементов обновляется, и вам нужно кликнуть на первый элемент
нового списка, использование селектора first-child
гарантирует правильный выбор, независимо от изменений.
// Ожидаем, что список обновится, и затем кликаем на первый элемент
await page.locator('ul > li:first-child').waitFor();
await page.locator('ul > li:first-child').click();
Этот код сначала ожидает появления первого элемента в списке (если содержимое обновляется) и затем выполняет клик по нему.
Можно комбинировать различные псевдоклассы для более сложных и точных
выборок элементов. Например, для выбора каждого второго элемента можно
использовать nth-child(2n):
await page.locator('ul > li:nth-child(2n)').click();
Этот код выберет все четные элементы списка. В зависимости от задачи, можно легко адаптировать такой подход для выбора элементов по любым правилам.
Если необходимо выбрать второй и пятый элементы списка, можно
комбинировать несколько nth-child:
await page.locator('ul > li:nth-child(2), ul > li:nth-child(5)').click();
В этом случае будут выбраны второй и пятый элементы списка и выполнены действия с ними.
Хотя использование nth-child является мощным
инструментом, стоит помнить, что в некоторых случаях такие селекторы
могут быть менее производительными по сравнению с прямыми селекторами по
ID или классу, особенно если на странице большое количество
элементов.
Поэтому, когда необходимо выбирать элементы в списках с большим
количеством элементов, лучше сочетать nth-child с другими
способами оптимизации селекторов или использовать более специфичные
подходы для поиска элементов.
Работа с элементами по порядковому номеру или позициям в DOM-дереве
является важной частью автоматизации с использованием Playwright.
Псевдоклассы nth-child, first-child, и
last-child предоставляют гибкие возможности для точного
выбора элементов в различных ситуациях. Комбинирование этих селекторов
позволяет решать задачи, связанные с динамическим контентом, длинными
списками и сложными структурами данных, обеспечивая более точный
контроль над тестируемыми страницами.