Селектори
The WebDriver Protocol provides several selector strategies to query an element. WebdriverIO simplifies them to keep selecting elements simple. Please note that even though the command to query elements is called $
and $$
, they have nothing to do with jQuery or the Sizzle Selector Engine.
While there are so many different selectors available, only a few of them provide a resilient way to find the right element. For example, given the following button:
<button
id="main"
class="btn btn-large"
name="submission"
role="button"
data-testid="submit"
>
Submit
</button>
Ми рекомендуємо і не рекомендуємо наступні селектори:
Селектор | Рекомендовано | Примітки |
---|---|---|
$('button') | 🚨 Ніколи | Найгірший - занадто загальний, без контексту. |
$('.btn.btn-large') | 🚨 Ніколи | Погано. Прив'язаний до стилів. Дуже схильний до змін. |
$('#main') | ⚠️ Зрідка | Краще. Але все ще прив'язаний до стилів або слухачів подій JS. |
$(() => document.queryElement('button')) | ⚠️ Зрідка | Ефективний запит, складний для написання. |
$('button[name="submission"]') | ⚠️ Зрідка | Прив'язаний до атрибуту name , який має семантику HTML. |
$('button[data-testid="submit"]') | ✅ Добре | Потрібен додатковий атрибут, не пов'язаний з a11y. |
$('aria/Submit') або $('button=Submit') | ✅ Завжди | Найкраще. Нагадує, як користувач взаємодіє зі сторінкою. Рекомендується використовувати файли перекладу вашого фронтенду, щоб ваші тести ніколи не падали при оновленні перекладів |
CSS Query Selector
If not indicated otherwise, WebdriverIO will query elements using the CSS selector pattern, e.g.:
loading...
Link Text
Щоб отримати елемент посилання з певним текстом, запитуйте текст, починаючи зі знаку рівності (=
).
Наприклад:
loading...
Ви можете запросити цей елемент, викликавши:
loading...
Partial Link Text
Щоб знайти елемент-посилання, видимий текст якого частково відповідає вашому пошуковому значенню, використовуйте *=
перед рядком запиту (наприклад, *=driver
).
Ви також можете запросити елемент з прикладу вище, викликавши:
loading...
Примітка: Ви не можете змішувати кілька стратегій селекторів в одному селекторі. Використовуйте декілька ланцюжкових запитів елементів для досягнення тієї ж мети, наприклад:
const elem = await $('header h1*=Welcome') // не працює!!!
// використовуйте натомість
const elem = await $('header').$('*=driver')
Element with certain text
Така ж техніка може бути застосована і до елементів. Крім того, також можливо виконати пошук без урахування регістру за допомогою .=
або .*=
в запиті.
Наприклад, ось запит для заголовка 1 рівня з текстом "Welcome to my Page":
loading...
Ви можете запросити цей елемент, викликавши:
loading...
Або використовуючи частковий текст запиту:
loading...
Те саме працює для імен id
та class
:
loading...
Ви можете запросити цей елемент, викликавши:
loading...
Примітка: Ви не можете змішувати кілька стратегій селекторів в одному селекторі. Використовуйте декілька ланцюжкових запитів елементів для досягнення тієї ж мети, наприклад:
const elem = await $('header h1*=Welcome') // не працює!!!
// використовуйте натомість
const elem = await $('header').$('h1*=Welcome')
Tag Name
Щоб запитати елемент з певною назвою тегу, використовуйте <tag>
або <tag />
.
loading...
Ви можете запроси ти цей елемент, викликавши:
loading...
Name Attribute
Для запиту елементів з певним атрибутом name ви можете використовувати або звичайний селектор CSS3, або надану стратегію name з JSONWireProtocol, передаючи щось на зразок [name="some-name"] як параметр селектора:
loading...
loading...
Примітка: Ця стратегія селектора застаріла і працює лише в старих браузерах, які працюють за протоколом JSONWireProtocol, або при використанні Appium.
xPath
Також можливо запитувати елементи через конкретний xPath.
Селектор xPath має формат на зразок //body/div[6]/div[1]/span[1]
.
loading...
Ви можете запитати другий абзац, викликавши:
loading...
Ви можете використовувати xPath також для переміщення вгору та вниз по DOM-дереву:
loading...
Accessibility Name Selector
Запит елементів за їх доступною назвою. Доступна назва - це те, що оголошується програмою зчитування з екрану, коли цей елемент отримує фокус. Значення доступної назви може бути як візуальним вмістом, так і прихованими текстовими альтернативами.
Ви можете прочитати більше про цей селектор у нашому блозі про випуск
Fetch by aria-label
loading...
loading...
Fetch by aria-labelledby
loading...
loading...
Fetch by content
loading...
loading...
Fetch by title
loading...
loading...
Fetch by alt
property
loading...
loading...
ARIA - Role Attribute
Для запиту елементів на основі ролей ARIA, ви можете безпосередньо вказати роль елемента, наприклад [role=button]
як параметр селектора:
loading...
loading...
ID Attribute
Стратегія локатора "id" не підтримується в протоколі WebDriver, замість цього слід використовувати стратегії селекторів CSS або xPath для пошуку елементів за допомогою ID.
Однак деякі драйвери (наприклад, Appium You.i Engine Driver) все ще можуть підтримувати цей селектор.
Поточні підтримувані синтаксиси селектора для ID:
//css locator
const button = await $('#someid')
//xpath locator
const button = await $('//*[@id="someid"]')
//id strategy
// Note: works only in Appium or similar frameworks which supports locator strategy "ID"
const button = await $('id=resource-id/iosname')
JS Function
Ви також можете використовувати функції JavaScript для отримання елементів за допомогою веб-нативних API. Звісно, ви можете робити це лише всередині веб-контексту (н априклад, browser
або веб-контекст на мобільному).
Маючи наступну HTML-структуру:
loading...
Ви можете запитати сусідній елемент #elem
наступним чином:
loading...
Deep Selectors
Починаючи з v9
WebdriverIO немає потреби в цьому спеціальному селекторі, оскільки WebdriverIO автоматично проникає через Shadow DOM за вас. Рекомендується відмовитися від цього селектора, видаливши >>>
перед ним.
Багато фронтенд-додатків сильно покладаються на елементи з shadow DOM. Технічно неможливо запитувати елементи всередині shadow DOM без обхідних шляхів. shadow$
та shadow$$
були такими обхідними шляхами, які мали свої обмеження. З глибоким селектором ви тепер можете запитувати всі елементи в будь-якому shadow DOM, використовуючи звичайну команду запиту.
Якщо у нас є додаток з наступною структурою:
За допомогою цього селектора ви можете запитати елемент <button />
, який вкладений в інший shadow DOM, наприклад:
loading...
Mobile Selectors
Для гібридного мобільного тестування важливо, щоб сервер ав томатизації знаходився в правильному контексті перед виконанням команд. Для автоматизації жестів драйвер в ідеалі повинен бути встановлений у нативний контекст. Але для вибору елементів з DOM драйверу потрібно встановити контекст webview платформи. Тільки потім можуть бути використані методи, згадані вище.
Для нативного мобільного тестування немає перемикання між контекстами, оскільки вам доводиться використовувати мобільні стратегії та безпосередньо використовувати технологію автоматизації пристрою. Це особливо корисно, коли тест потребує певного контролю над пошуком елементів.
Android UiAutomator
Фреймворк Android UI Automator надає кілька способів пошуку елементів. Ви можете використовувати API UI Automator, зокрема клас UiSelector для пошуку елементів. В Appium ви надсилаєте код Java як рядок на сервер, який виконує його в середовищі додатка, повертаючи елемент або елементи.
const selector = 'new UiSelector().text("Cancel").className("android.widget.Button")'
const button = await $(`android=${selector}`)
await button.click()
Android DataMatcher and ViewMatcher (Espresso only)
Стратегія Android DataMatcher надає спосіб пошуку елементів за допомогою Data Matcher
const menuItem = await $({
"name": "hasEntry",
"args": ["title", "ViewTitle"]
})
await menuItem.click()
І аналогічно View Matcher
const menuItem = await $({
"name": "hasEntry",
"args": ["title", "ViewTitle"],
"class": "androidx.test.espresso.matcher.ViewMatchers"
})
await menuItem.click()
Android View Tag (Espresso only)
Стратегія view tag надає зручний спосіб пошуку елементів за їх тегом.
const elem = await $('-android viewtag:tag_identifier')
await elem.click()