Селекторы
Testplane предоставляет множество способов для поиска элементов на странице браузера.
Рекомендации по использованию селекторов
Мы рекомендуем искать элементы так же, как это делают пользователи тестируемого приложения.
При выборе можно руководствоваться 3 факторами:
- Ориентация на пользователя — селектор отражает то, что видит и использует пользователь
- Стабильность — селектор не ломается при рефакторинге, изменениях CSS или структуры страницы
- Уникальность — селектор однозначно идентифицирует нужный элемент
| Селектор / Способ выбора | Рекомендация | Примечания |
|---|---|---|
По видимому содержимому — тексту, роли, ... (getByRole, getByText, ...) | ✅ Лучший | Ищем элементы так же, как это делают пользователи: по тексту, роли, label — стабильный и "честный" способ поиска. |
По атрибуту data-testid (например, [data-testid="submit"]) | ✅ Хорошо | Атрибут data-testid создан специально для автоматизации: не влияет на стили/доступность, стабилен, явно обозначает цель элемента, но требует ручной разметки такими ID. |
По ID (например, #main) | ⚠️ Редко | ID стабильнее классов, но все равно может зависеть от JS‑логики или изменений в разметке. Используйте, только если ID гарантированно устойчив. |
По типу атрибута (например, input[type="text"]) | ⚠️ Редко | Работа ет, если тип атрибута семантически значим и стабилен. Но может быть слишком общим (много элементов одного типа). |
По атрибутам (кроме data-testid, например, [name="email"]) | ⚠️ Редко | Зависит от семантики HTML‑атрибутов. Может быть нестабильным (атрибуты меняют значение или удаляются). |
XPath (например, (//button)[2]) | 🔴 Плохо | Позиция элемента может измениться, селекторы XPath как правило сложно поддерживать. Однако они могут быть полезны, так как дают максимум возможностей для поиска элементов. |
По классу (например, .sidebar .list-item.state-opened-qU1azF) | 🔴 Плохо | Не связан с поведением пользователя и не отражает семантику, жесткая завязка на иерархию. |
WebdriverIO
В Testplane поддерживается поиск элементов, совместимый с синтаксисом WebdriverIO: по CSS селекторам, по XPath, по тексту элементов и по другим признакам, которые описаны ниже.
Селекторы по тексту
Данный вид селекторов позволяет искать элементы по содержащемуся в них тексту:
="text"— точный поиск текста*="text"— поиск по частичному совпадению текстаa*=text— поиск по тексту внутри тега<a>div.=text— case-insensitive поиск текста внутри тега<div>
describe("Селектор Link Text", () => {
it("Поиск элемента по совпадающему тексту", async ({ browser }) => {
await browser.url("https://testplane.io/ru/");
// Полное совпадени е текста ссылки
const docsLink = await browser.$("=Документация");
const isDocsLinkFound = await docsLink.isExisting();
console.log(`Элемент с полным текстом "Документация" найден: ${isDocsLinkFound}`);
// Частичное совпадение текста ссылки
const partialLink = await browser.$("*=Докум");
const isPartialLinkFound = await partialLink.isExisting();
console.log(`Элемент с частичным текстом "Докум" найден: ${isPartialLinkFound}`);
// Частичное совпадение с указанием тега <a>
const tagPartialLink = await browser.$("a*=Документ");
const isTagPartialLinkFound = await tagPartialLink.isExisting();
console.log(`Элемент <a> с частичным текстом "Документ" найден: ${isTagPartialLinkFound}`);
// Case-insensitive поиск с тегом div
const divCaseInsensitive = await browser.$("div.=testplane");
const isDivCaseInsensitiveFound = await divCaseInsensitive.isExisting();
console.log(
`Элемент <div> с case-insensitive текстом "testplane" найден: ${isDivCaseInsensitiveFound}`,
);
});
});
Стоит использовать, если:
- текст элементов стабилен
- вам необходимо, чтобы тест был максимально приближен к реальным пользовательским сценариям
CSS-селекторы
По атрибуту data-testid
Данный способ подходит для поиска элементов, которые размечены атрибутами для тестирования.
describe("CSS-селектор по атрибуту data-testid", () => {
it("Поиск элемента по data-testid", async ({ browser }) => {
// Открываем страницу и ждем ее загрузки
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по атрибуту data-testid
const element = await browser.$('[data-testid="main-content"]');
// Проверяем существование элемента в DOM
const isExisting = await element.isExisting();
console.log("Элемент с data-testid существует:", isExisting);
});
});
Стоит использовать, если:
- создаете селекторы специально для тестирования
- нужна стабильность селекторов независимо от изменений UI/стилей
По классу
Чтобы найти элемент на странице по классу, используйте селектор ".class-name".
describe("CSS-селектор по классу", () => {
it("Поиск элемента на главной странице", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по классу "navbar"
const navbar = await browser.$(".navbar");
// Проверяем, отображается ли элемент на странице
const isDisplayed = await navbar.isDisplayed();
console.log("Навбар отображается:", isDisplayed);
});
});
Стоит использовать, если:
- класс является стабильным и не генерируется динамически
- нужен быстрый и простой способ найти элемент
- класс семантически описывает элемент (например,
.error-message,.success-banner) - вы работаете с компонентными библиотеками, где классы являются частью API
По id
Чтобы найти элемент по id используйте селектор вида "#id".
describe("CSS-селектор по id", () => {
it("Поиск элемента по id на главной странице", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по id "__docusaurus"
const main = await browser.$("#__docusaurus");
// Проверяем, отображается ли элемент на странице
const isDisplayed = await main.isDisplayed();
console.log("Элемент отображается:", isDisplayed);
});
});
Стоит использовать, если:
- вам необходим быстрый и простой способ поиска элеме нтов
idявляется частью публичного API компонента- нужна максимальная производительность селектора (
id— самый быстрый селектор)
По типу атрибута
Для поиска элемента по атрибуту используйте селектор вида input[type="name"].
describe("CSS-селектор по типу атрибута", () => {
it("Поиск элемента по типу атрибута", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем кнопку по атрибуту type="button"
// Формат селектора: element[type="value"]
const button = await browser.$('button[type="button"]');
// Проверяем существование элемента в DOM
const isExisting = await button.isExisting();
console.log("Кнопка существует:", isExisting);
});
});
Стоит использовать, если:
- нужно найти все элементы определенного типа (все чекбоксы, все радиокнопки)
- нужно работать с семантическими HTML5 типами (
email,tel,url,date)
XPath-селекторы
По тексту элемента
Чтобы найти элемент по содержащемуся в нем тексту, используйте селектор //element[text()="text"].
// Точное совпадение текста
describe("XPath-селектор по тексту элемента", () => {
it("Поиск элемента по тексту", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по тексту внутри него
const link = await browser.$('//a[text()="Docs"]');
// Проверяем существование элемента в DOM
const isExisting = await link.isExisting();
console.log("Элемент с текстом существует:", isExisting);
});
});
Стоит использовать, если:
- текст элемента уникален и стабилен (названия кнопок, заголовки)
- другие стратегии поиска элементов оказались неприменимы
По атрибутам
Для поиска элемента по атрибуту используйте селектор вида //element[@type="atribute"].
describe("XPath-селектор по атрибуту", () => {
it("Поиск элемента по атрибуту", async ({ browser }) => {
await browser.openAndWait("https://testplane.io/");
// Ищем элемент по атрибуту type
const button = await browser.$('//button[@type="button"]');
// Проверяем существование элемента в DOM
const isExisting = await button.isExisting();
console.log("Элемент с атрибутом существует:", isExisting);
});
});