База по XPath
Полное руководство по поиску элементов на веб-страницах
Введение в XPath
Базовые элементыдля практики
Коллекция стандартных UI элементов с готовыми локаторами для изучения
Кнопки
Уведомления
Модальное окно
Типы уведомлений
Совет по тестированию
Используйте data-testid атрибуты для более стабильных локаторов. Они не зависят от изменений в стилях или структуре DOM.
Перетащите элемент в эту область
Работа с файлами в тестах
Загрузка: Выбор файла через input[type="file"]
Скачивание: Клик по ссылке с download атрибутом
Проверка: Контроль папки Downloads в тестах
Рейтинг товара
Избранное
Корзина покупок
Категории товаров
//span[@data-testid='product-category-0']//span[text()='Электроника']//span[contains(@class, 'border-slate-600')]Управление пользователями
Поиск в таблице
Имя | Роль | Статус | Последний вход | Действия | ||
|---|---|---|---|---|---|---|
| Елена Волкова | elena@example.com | Пользователь | Активен | 2024-01-16 | ||
| Иван Петров | ivan@example.com | Администратор | Активен | 2024-01-15 | ||
| Кукумбер Тестович | cucumber@example.com | Модератор | Неактивен | 2024-01-10 | ||
| Мария Сидорова | maria@example.com | Пользователь | Активен | 2024-01-14 |
Управление видео и аудио
Видеоплеер
Симуляция видеоплеера
1920x1080 • 16:9
Управление громкостью
Тестирование медиа элементов
- •Проверка воспроизведения видео/аудио
- •Тестирование управления громкостью
- •Взаимодействие с кнопками управления
- •Проверка состояний muted/unmuted
Мониторинг системы
Состояние сети
Соединение установлено
Уровень батареи
Тема оформления
Активная тема
Системная информация
- •Мониторинг состояния системы в реальном времени
- •Динамические индикаторы и переключатели
- •Адаптивная цветовая схема
Изолированное дерево элементов
Shadow DOM создает изолированное дерево элементов, недоступное через обычные селекторы.
Работа с Shadow DOM
•Selenium: Используйте getShadowRoot()
•Playwright: Поддержка из коробки
•Cypress: Команда .shadow()
// Selenium:WebElement host = driver.findElement(By.id("shadow-host"));SearchContext root = host.getShadowRoot();root.findElement(By.id("shadow-button")).click();// Playwright:await page.locator('#shadow-host').locator('#shadow-button').click();// Cypress:cy.get('#shadow-host').shadow().find('#shadow-button').click();Отдельный документ в рамке
iframe содержит отдельный документ, требующий переключения контекста для взаимодействия.
Работа с iframe
•Переключение: driver.switchTo().frame()
•Возврат: driver.switchTo().defaultContent()
•По индексу: switchTo().frame(0)
•По элементу: switchTo().frame(element)
// Selenium:driver.switchTo().frame("test-iframe");driver.findElement(By.id("iframe-button")).click();driver.switchTo().defaultContent();// Playwright:const frame = page.frame('test-iframe');await frame.locator('#iframe-button').click();// Cypress:cy.get('#test-iframe').then(($iframe) => { const body = $iframe.contents().find('body'); cy.wrap(body).find('#iframe-button').click();});Работа с датами и временем
Работа с датами в тестах
•Формат даты: YYYY-MM-DD (ISO 8601)
•Формат времени: HH:MM (24-часовой)
•DateTime: YYYY-MM-DDTHH:MM
•Валидация: Проверка min/max значений
// Selenium - установка даты:WebElement dateInput = driver.findElement(By.id("date-picker"));dateInput.sendKeys("2024-12-25");// Установка времени:WebElement timeInput = driver.findElement(By.id("time-picker"));timeInput.sendKeys("14:30");// Дата и время:WebElement datetimeInput = driver.findElement(By.id("datetime-picker"));datetimeInput.sendKeys("2024-12-25T14:30");// Получение значения:String selectedDate = dateInput.getAttribute("value");// Playwright примеры:await page.fill('#date-picker', '2024-12-25');await page.fill('#time-picker', '14:30');await page.fill('#datetime-picker', '2024-12-25T14:30');// Проверка значения:const value = await page.inputValue('#date-picker');expect(value).toBe('2024-12-25');Динамический поиск с подсказками
// Поле ввода://input[@data-testid='autocomplete-input']// Выпадающий список://div[@data-testid='autocomplete-dropdown']// Первая опция://div[@data-testid='autocomplete-option-0']// По роли://div[@role='option']// По тексту://div[contains(text(), 'Москва')]Тестирование автокомплита
•Ввод текста: Постепенный ввод символов
•Ожидание: Появление выпадающего списка
•Выбор: Клик по опции из списка
•Проверка: Значение установлено в поле
// Selenium - ввод текста:WebElement input = driver.findElement(By.id("city-autocomplete"));input.sendKeys("Мос");// Ожидание списка:WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));wait.until(ExpectedConditions.visibilityOfElementLocated( By.id("autocomplete-dropdown")));// Выбор первой опции:WebElement option = driver.findElement( By.xpath("//div[@data-testid='autocomplete-option-0']"));option.click();// Проверка значения:String value = input.getAttribute("value");Assert.assertEquals("Москва", value);// Playwright пример:await page.fill('#city-autocomplete', 'Мос');await page.waitForSelector('[data-testid="autocomplete-dropdown"]');await page.click('[data-testid="autocomplete-option-0"]');// Проверка:const value = await page.inputValue('#city-autocomplete');expect(value).toBe('Москва');Заполните форму по шагам
Правый клик для вызова
Кликните правой кнопкой мыши по области ниже:
Тестирование контекстных меню
•Вызов: Правый клик мыши (contextmenu event)
•Позиционирование: Координаты x, y курсора
•Закрытие: Клик вне меню или Escape
•Навигация: Клавиши стрелок и Enter
// Selenium - правый клик:WebElement area = driver.findElement(By.id("context-menu-area"));Actions actions = new Actions(driver);actions.contextClick(area).perform();// Ожидание меню:WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));wait.until(ExpectedConditions.visibilityOfElementLocated( By.id("context-menu")));// Клик по пункту:driver.findElement(By.id("context-copy")).click();// Playwright пример:await page.click('#context-menu-area', { button: 'right' });await page.waitForSelector('#context-menu');await page.click('#context-copy');// Cypress пример:cy.get('#context-menu-area').rightclick();cy.get('#context-menu').should('be.visible');cy.get('#context-copy').click();Динамические элементы и продвинутый поиск
Элементы с динамическими ID
ID: 1
Используйте starts-with() или contains()
Элементы с изменяющимися классами
active
Класс: status-active
Поиск по соседним элементам
Поиск по содержимому (text content)
Советы по работе со сложными селекторами
Динамические ID:
Используйте starts-with() или contains()
Изменяющиеся классы:
Ищите по стабильной части класса
Соседние элементы:
Оси XPath: following-sibling, preceding-sibling
Поиск по тексту:
normalize-space() убирает пробелы
Продвинутые CSS и XPath селекторы
Список с nth-child селекторами
- Первый элемент спискаПозиция: 1:first-child🔥 High
- Второй элемент спискаПозиция: 2:nth-child(even)⚡ Medium
- Третий элемент спискаПозиция: 3:nth-child(odd)✅ Low
- Четвертый элемент спискаПозиция: 4:nth-child(even)🔥 High
- Пятый элемент спискаПозиция: 5:nth-child(odd)⚡ Medium
- Последний элемент спискаПозиция: 6:last-child✅ Low
Примеры селекторов
li:first-childили//li[1]li:last-childили//li[last()]li:nth-child(odd)или//li[position() mod 2 = 1]li:nth-child(even)или//li[position() mod 2 = 0]// Selenium - выбор первого элемента:driver.findElement(By.cssSelector("li:first-child"));driver.findElement(By.xpath("//li[1]"));// Выбор последнего элемента:driver.findElement(By.cssSelector("li:last-child"));driver.findElement(By.xpath("//li[last()]"));// Выбор нечетных элементов:driver.findElements(By.cssSelector("li:nth-child(odd)"));driver.findElements(By.xpath("//li[position() mod 2 = 1]"));// Playwright примеры:await page.locator('li:first-child').click();await page.locator('li:last-child').click();await page.locator('li:nth-child(3)').click();// Cypress примеры:cy.get('li').first();cy.get('li').last();cy.get('li:nth-child(odd)');Комплексная фильтрация данных
Блог посты с комплексной фильтрацией
Продвинутые техники автотестирования
CSS селекторы vs XPath
E-commerce каталог с фильтрами
Каталог товаров
Смартфон Galaxy
Ноутбук ThinkPad
Наушники AirPods
Динамические раскрывающиеся секции
FAQ секции
XPath - это язык запросов для выбора узлов в XML документах.
CSS селекторы позволяют выбирать элементы по их атрибутам и структуре.
XPath более мощный, но CSS селекторы быстрее и проще.
Примеры XPath для аккордеона
•//div[@data-expanded='true']- раскрытые секции
•//button[@aria-expanded='true']- активные триггеры
•//div[@data-visible='true']//button- кнопки в видимом контенте
Быстрый справочниклокаторов
Самые популярные паттерны поиска элементов для UI автотестов
//divВсе div элементы
//div[@id='myId']Div с конкретным ID
//div[@class='myClass']Div с конкретным классом
//*[@data-testid='element']По data-testid (рекомендуется)
//button[text()='Нажми']Точное совпадение текста
//button[contains(text(), 'Нажми')]Частичное совпадение
//a[normalize-space()='Ссылка']Игнорирует пробелы
//span[starts-with(text(), 'Начало')]Начинается с текста
//div[contains(@class, 'btn')]Частичное совпадение класса
//input[@type='text'][1]Первый элемент типа
//div[@id='parent']//buttonПотомок элемента
//input[@required and @type='email']Логические операторы
#myIdПо ID
.myClassПо классу
input[type="email"]По атрибуту
div > button:first-childПервый дочерний элемент
//div[@data-testid and @style]Элементы со стилями
//button[not(@disabled)]Активные кнопки
//div[contains(@class, 'visible')]Видимые элементы
//input[@value != '']Заполненные поля
[data-testid="user-button"]Используйте data-testid
//button[contains(@aria-label, 'Save')]Accessibility атрибуты
//form[@name='login']//inputКонтекстный поиск
//div[@role='dialog']Семантические роли
Советы для эффективного тестирования
Стабильные локаторы
Используйте data-testid атрибуты вместо классов CSS для более стабильных тестов
Ожидания
Всегда используйте явные ожидания для динамических элементов
Читаемость
Делайте локаторы понятными и самодокументируемыми
Устойчивость
Избегайте хрупких селекторов, зависящих от структуры DOM
Тестирование
Проверяйте локаторы в DevTools перед использованием в тестах
Производительность
CSS селекторы обычно быстрее XPath для простых случаев