Базовые CSS селекторы

CSS-селекторы — это ключевой механизм для идентификации и работы с элементами веб-страницы. В тестировании с использованием Playwright правильно настроенные селекторы помогают эффективно взаимодействовать с элементами UI, проверять их видимость, проверять данные и выполнять другие проверки. Важно понимать, какие базовые типы селекторов существуют и как их использовать для работы с HTML-элементами на странице.

Селектор по идентификатору (#id)

Один из самых простых и эффективных типов селекторов — это селектор по идентификатору. Каждый HTML-элемент может иметь атрибут id, который является уникальным в пределах страницы. Селектор по id позволяет точно и быстро находить элемент.

Пример:

<div id="submit-button">Отправить</div>
await page.click('#submit-button');

В данном примере Playwright будет искать элемент с атрибутом id="submit-button" и выполнит клик по нему.

Селектор по классу (.class)

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

Пример:

<button class="btn-primary">Отправить</button>
await page.click('.btn-primary');

Этот селектор найдет все элементы с классом btn-primary и кликнет по первому из них.

Селектор по атрибуту ([attribute])

Селекторы по атрибутам позволяют находить элементы по любому атрибуту HTML. Это может быть полезно, когда у элемента нет уникального id или класса, но есть другие атрибуты, которые можно использовать для его идентификации.

Пример:

<input type="text" placeholder="Введите ваше имя" />
await page.fill('[placeholder="Введите ваше имя"]', 'Дмитрий');

Здесь используется атрибут placeholder для того, чтобы найти поле ввода и ввести значение.

Селекторы по тегу (tagname)

Селектор по тегу позволяет найти все элементы определённого типа. Этот тип селектора подходит для работы с множеством однотипных элементов, например, с ссылками или кнопками.

Пример:

<button>Отправить</button>
<button>Отмена</button>
await page.click('button');

Этот код кликнет по первому элементу <button>, который встретится на странице.

Селектор по псевдоклассу (:hover, :focus и другие)

Псевдоклассы позволяют выбирать элементы, которые находятся в определённом состоянии. Это может быть полезно, например, для тестирования поведения интерфейса при наведении курсора или фокусе на элементе.

Пример:

<button class="btn">Нажми на меня</button>
await page.hover('.btn');

В этом примере Playwright выполнит наведение курсора на кнопку с классом .btn.

Селекторы по комбинации

Для более точной и гибкой работы с элементами можно использовать комбинацию различных типов селекторов. Например, комбинированные селекторы позволяют искать элементы, которые соответствуют нескольким условиям одновременно.

Пример:

<input type="text" class="form-control" placeholder="Email" />
<input type="password" class="form-control" placeholder="Пароль" />
await page.fill('input.form-control[placeholder="Email"]', 'user@example.com');

Этот селектор ищет элемент input, который имеет класс form-control и атрибут placeholder, равный “Email”, что позволяет точно указать, в какое поле нужно ввести данные.

Селекторы с индексами

Когда на странице несколько однотипных элементов, можно использовать индексы, чтобы выбрать определённый элемент. В Playwright это делается с помощью nth-of-type, nth-child и других подобных конструкций.

Пример:

<ul>
  <li>Первый элемент</li>
  <li>Второй элемент</li>
  <li>Третий элемент</li>
</ul>
await page.click('ul > li:nth-child(2)');

Этот код кликнет по второму элементу списка.

Селекторы по тексту

В Playwright можно использовать селекторы, которые ориентируются на текстовое содержимое элементов. Это позволяет искать элементы, основываясь на их видимом тексте.

Пример:

<button>Отправить</button>
<button>Отмена</button>
await page.click('button:text("Отправить")');

Здесь Playwright найдёт кнопку с текстом “Отправить” и кликнет по ней.

Селекторы по родительскому элементу

Часто бывает нужно выбрать элемент, исходя из его родителя. Это позволяет выстраивать более сложные селекторы для выбора элементов, находящихся в определённых контекстах.

Пример:

<div class="form-group">
  <label for="name">Имя</label>
  <input type="text" id="name" />
</div>
await page.fill('.form-group input', 'Дмитрий');

Этот селектор ищет input внутри элемента с классом form-group и заполняет его значением.

Псевдоэлементы

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

Пример:

<p>Текст <span class="highlight">выделенный</span></p>
await page.hover('span.highlight::after');

Этот код пытается навести курсор на псевдоэлемент ::after элемента с классом highlight.

Применение комбинированных селекторов

Для более точного и гибкого выбора элементов можно комбинировать различные селекторы. Например, можно использовать сочетание классов, атрибутов, индексов и псевдоклассов.

Пример:

<div class="menu-item" data-type="main">
  <a href="#">Главная</a>
</div>
await page.click('.menu-item[data-type="main"] a');

Этот селектор точно выберет ссылку внутри элемента с классом menu-item и атрибутом data-type, равным “main”.

Советы по выбору селекторов

  • Используйте селекторы с id, когда это возможно, так как они наиболее быстрые и уникальные.
  • Для выбора нескольких элементов по классу используйте селекторы с классом, однако будьте осторожны, если класс используется для множества элементов.
  • Селекторы по атрибутам полезны, когда нужно найти элементы с уникальными или специфическими атрибутами, такими как placeholder, name или data-*.
  • В случаях, когда нужно работать с несколькими однотипными элементами (например, кнопками или ссылками), комбинируйте селекторы с индексами или текстом.
  • Постепенно переходите к более сложным комбинациям, если простой селектор не даёт нужной точности или не работает должным образом.

Правильный выбор и использование селекторов в Playwright значительно ускоряют процесс тестирования и позволяют создавать более точные и устойчивые автоматизированные проверки интерфейса.