Перейти к основному содержанию

Селекторы

Сервер WebdriverIO MCP поддерживает множество стратегий селекторов для поиска элементов на веб-страницах и в мобильных приложениях.

информация

Полную документацию по селекторам, включая все стратегии селекторов WebdriverIO, смотрите в основном руководстве Selectors. Эта страница посвящена селекторам, обычно используемым с сервером MCP.

Веб-селекторы

Для автоматизации браузера сервер MCP поддерживает все стандартные селекторы WebdriverIO. Наиболее часто используемые включают:

СелекторПримерОписание
CSS#login-button, .submit-btnСтандартные CSS селекторы
XPath//button[@id='submit']XPath выражения
Textbutton=Submit, a*=ClickТекстовые селекторы WebdriverIO
ARIAaria/Submit ButtonСелекторы по имени доступности
Test ID[data-testid="submit"]Рекомендуется для тестирования

Подробные примеры и лучшие практики смотрите в документации Selectors.


Мобильные селекторы

Мобильные селекторы работают с платформами iOS и Android через Appium.

Accessibility ID (Рекомендуется)

Accessibility ID - это самый надежный кросс-платформенный селектор. Они работают как на iOS, так и на Android и стабильны при обновлениях приложения.

# Синтаксис
~accessibilityId

# Примеры
~loginButton
~submitForm
~usernameField
Лучшая практика

Всегда предпочитайте accessibility ID, когда они доступны. Они обеспечивают:

  • Кросс-платформенную совместимость (iOS + Android)
  • Стабильность при изменениях UI
  • Лучшую поддерживаемость тестов
  • Улучшенную доступность вашего приложения

Android селекторы

UiAutomator

UiAutomator селекторы мощные и быстрые для Android.

# По тексту
android=new UiSelector().text("Login")

# По частичному тексту
android=new UiSelector().textContains("Log")

# По идентификатору ресурса
android=new UiSelector().resourceId("com.example:id/login_button")

# По имени класса
android=new UiSelector().className("android.widget.Button")

# По описанию (доступность)
android=new UiSelector().description("Login button")

# Комбинированные условия
android=new UiSelector().className("android.widget.Button").text("Login")

# Прокручиваемый контейнер
android=new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("Item"))

Resource ID

Resource ID обеспечивают стабильную идентификацию элементов на Android.

# Полный Resource ID
id=com.example.app:id/login_button

# Частичный ID (пакет приложения подразумевается)
id=login_button

XPath (Android)

XPath работает на Android, но медленнее, чем UiAutomator.

# По классу и тексту
//android.widget.Button[@text='Login']

# По Resource ID
//android.widget.EditText[@resource-id='com.example:id/username']

# По описанию содержимого
//android.widget.ImageButton[@content-desc='Menu']

# Иерархический
//android.widget.LinearLayout/android.widget.Button[1]

iOS селекторы

Predicate String

iOS Predicate Strings быстрые и мощные для автоматизации iOS.

# По метке
-ios predicate string:label == "Login"

# По частичной метке
-ios predicate string:label CONTAINS "Log"

# По имени
-ios predicate string:name == "loginButton"

# По типу
-ios predicate string:type == "XCUIElementTypeButton"

# По значению
-ios predicate string:value == "ON"

# Комбинированные условия
-ios predicate string:type == "XCUIElementTypeButton" AND label == "Login"

# Видимость
-ios predicate string:label == "Login" AND visible == 1

# Без учета регистра
-ios predicate string:label ==[c] "login"

Операторы Predicate:

ОператорОписание
==Равно
!=Не равно
CONTAINSСодержит подстроку
BEGINSWITHНачинается с
ENDSWITHЗаканчивается на
LIKEСоответствие по маске
MATCHESСоответствие регулярному выражению
ANDЛогическое И
ORЛогическое ИЛИ

Class Chain

iOS Class Chains обеспечивают иерархический поиск элементов с хорошей производительностью.

# Прямой потомок
-ios class chain:**/XCUIElementTypeButton[`label == "Login"`]

# Любой потомок
-ios class chain:**/XCUIElementTypeButton

# По индексу
-ios class chain:**/XCUIElementTypeCell[3]

# Комбинированный с Predicate
-ios class chain:**/XCUIElementTypeButton[`name == "submit" AND visible == 1`]

# Иерархический
-ios class chain:**/XCUIElementTypeTable/XCUIElementTypeCell[`label == "Settings"`]

# Последний элемент
-ios class chain:**/XCUIElementTypeButton[-1]

XPath (iOS)

XPath работает на iOS, но медленнее, чем predicate strings.

# По типу и метке
//XCUIElementTypeButton[@label='Login']

# По имени
//XCUIElementTypeTextField[@name='username']

# По значению
//XCUIElementTypeSwitch[@value='1']

# Иерархический
//XCUIElementTypeTable/XCUIElementTypeCell[1]

Кросс-платформенная стратегия селекторов

При написании тестов, которые должны работать как на iOS, так и на Android, используйте следующий порядок приоритета:

1. Accessibility ID (Лучший вариант)

# Работает на обеих платформах
~loginButton

2. Платформозависимые с условной логикой

Когда accessibility ID недоступны, используйте платформозависимые селекторы:

Android:

android=new UiSelector().text("Login")

iOS:

-ios predicate string:label == "Login"

3. XPath (Последний вариант)

XPath работает на обеих платформах, но с разными типами элементов:

Android:

//android.widget.Button[@text='Login']

iOS:

//XCUIElementTypeButton[@label='Login']

Справочник по типам элементов

Типы элементов Android

ТипОписание
android.widget.ButtonКнопка
android.widget.EditTextТекстовое поле ввода
android.widget.TextViewТекстовая метка
android.widget.ImageViewИзображение
android.widget.ImageButtonКнопка-изображение
android.widget.CheckBoxФлажок
android.widget.RadioButtonРадиокнопка
android.widget.SwitchПереключатель
android.widget.SpinnerВыпадающий список
android.widget.ListViewПредставление списка
android.widget.RecyclerViewRecycler view
android.widget.ScrollViewПрокручиваемый контейнер

Типы элементов iOS

ТипОписание
XCUIElementTypeButtonКнопка
XCUIElementTypeTextFieldТекстовое поле ввода
XCUIElementTypeSecureTextFieldПоле ввода пароля
XCUIElementTypeStaticTextТекстовая метка
XCUIElementTypeImageИзображение
XCUIElementTypeSwitchПереключатель
XCUIElementTypeSliderПолзунок
XCUIElementTypePickerКолесо выбора
XCUIElementTypeTableТабличное представление
XCUIElementTypeCellЯчейка таблицы
XCUIElementTypeCollectionViewКоллекционное представление
XCUIElementTypeScrollViewПрокручиваемое представление

Лучшие практики

Делайте

  • Используйте accessibility ID для стабильных кросс-платформенных селекторов
  • Добавляйте атрибуты data-testid к веб-элементам для тестирования
  • Используйте resource ID на Android, когда accessibility ID недоступны
  • Предпочитайте predicate strings вместо XPath на iOS
  • Делайте селекторы простыми и конкретными

Не делайте

  • Избегайте длинных XPath выражений - они медленные и хрупкие
  • Не полагайтесь на индексы для динамических списков
  • Избегайте селекторов на основе текста для локализованных приложений
  • Не используйте абсолютный XPath (начиная от корня)

Примеры хороших и плохих селекторов

# Хороший - Стабильный accessibility ID
~loginButton

# Плохой - Хрупкий XPath с индексами
//div[3]/form/button[2]

# Хороший - Конкретный CSS с test ID
[data-testid="submit-button"]

# Плохой - Класс, который может измениться
.btn-primary-lg-v2

# Хороший - UiAutomator с resource ID
android=new UiSelector().resourceId("com.app:id/submit")

# Плохой - Текст, который может быть локализован
android=new UiSelector().text("Submit")

Отладка селекторов

Веб (Chrome DevTools)

  1. Откройте Chrome DevTools (F12)
  2. Используйте панель Elements для проверки элементов
  3. Щелкните правой кнопкой мыши на элементе → Копировать → Копировать селектор
  4. Тестируйте селекторы в консоли: document.querySelector('your-selector')

Мобильные (Appium Inspector)

  1. Запустите Appium Inspector
  2. Подключитесь к вашей работающей сессии
  3. Нажимайте на элементы, чтобы увидеть все доступные атрибуты
  4. Используйте функцию "Search for element" для тестирования селекторов

Использование get_visible_elements

Инструмент get_visible_elements сервера MCP возвращает несколько стратегий селекторов для каждого элемента:

Ask Claude: "Get all visible elements on the screen"

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

Расширенные опции

Для большего контроля над обнаружением элементов:

# Получить только изображения и визуальные элементы
Get visible elements with elementType "visual"

# Получить элементы с их координатами для отладки макета
Get visible elements with includeBounds enabled

# Получить следующие 20 элементов (пагинация)
Get visible elements with limit 20 and offset 20

# Включить контейнеры макета для отладки
Get visible elements with includeContainers enabled

Инструмент возвращает ответ с пагинацией:

{
"total": 42,
"showing": 20,
"hasMore": true,
"elements": [...]
}

Использование get_accessibility (Только для браузера)

Для автоматизации браузера инструмент get_accessibility предоставляет семантическую информацию об элементах страницы:

# Получить все именованные узлы доступности
Get accessibility tree

# Фильтровать только кнопки и ссылки
Get accessibility tree filtered to button and link roles

# Получить следующую страницу результатов
Get accessibility tree with limit 50 and offset 50

Это полезно, когда get_visible_elements не возвращает ожидаемые элементы, так как он запрашивает нативный API доступности браузера.

Welcome! How can I help?

WebdriverIO AI Copilot