Перейти до основного вмісту

Селектори

Сервер 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.RecyclerViewПерероблюваний вид
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. Правий клік на елементі → Copy → Copy selector
  4. Тестуйте селектори в Console: 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