Przejdź do głównej treści

Selektory

Serwer WebdriverIO MCP obsługuje różne strategie selektorów do lokalizowania elementów na stronach internetowych i w aplikacjach mobilnych.

informacja

Pełną dokumentację selektorów, w tym wszystkie strategie selektorów WebdriverIO, znajdziesz w głównym przewodniku Selektory. Ta strona koncentruje się na selektorach powszechnie używanych z serwerem MCP.

Selektory webowe

Do automatyzacji przeglądarek serwer MCP obsługuje wszystkie standardowe selektory WebdriverIO. Najczęściej używane to:

SelektorPrzykładOpis
CSS#login-button, .submit-btnStandardowe selektory CSS
XPath//button[@id='submit']Wyrażenia XPath
Tekstbutton=Submit, a*=ClickSelektory tekstowe WebdriverIO
ARIAaria/Submit ButtonSelektory nazw dostępności
Test ID[data-testid="submit"]Zalecane do testowania

Szczegółowe przykłady i najlepsze praktyki znajdziesz w dokumentacji Selektory.


Selektory mobilne

Selektory mobilne działają zarówno z platformami iOS, jak i Android poprzez Appium.

Accessibility ID (Zalecane)

Identyfikatory dostępności to najbardziej niezawodne selektory międzyplatformowe. Działają zarówno na iOS, jak i Android i są stabilne podczas aktualizacji aplikacji.

# Składnia
~accessibilityId

# Przykłady
~loginButton
~submitForm
~usernameField
Najlepsza praktyka

Zawsze preferuj identyfikatory dostępności, gdy są dostępne. Zapewniają one:

  • Kompatybilność międzyplatformową (iOS + Android)
  • Stabilność podczas zmian UI
  • Lepszą utrzymywalność testów
  • Lepszą dostępność twojej aplikacji

Selektory Android

UiAutomator

Selektory UiAutomator są potężne i szybkie dla Androida.

# Według tekstu
android=new UiSelector().text("Login")

# Według częściowego tekstu
android=new UiSelector().textContains("Log")

# Według ID zasobu
android=new UiSelector().resourceId("com.example:id/login_button")

# Według nazwy klasy
android=new UiSelector().className("android.widget.Button")

# Według opisu (dostępność)
android=new UiSelector().description("Login button")

# Łączone warunki
android=new UiSelector().className("android.widget.Button").text("Login")

# Przewijalny kontener
android=new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("Item"))

ID zasobu

Identyfikatory zasobów zapewniają stabilną identyfikację elementów na Androidzie.

# Pełny identyfikator zasobu
id=com.example.app:id/login_button

# Częściowy ID (pakiet aplikacji jest domyślny)
id=login_button

XPath (Android)

XPath działa na Androidzie, ale jest wolniejszy niż UiAutomator.

# Według klasy i tekstu
//android.widget.Button[@text='Login']

# Według ID zasobu
//android.widget.EditText[@resource-id='com.example:id/username']

# Według opisu zawartości
//android.widget.ImageButton[@content-desc='Menu']

# Hierarchicznie
//android.widget.LinearLayout/android.widget.Button[1]

Selektory iOS

Predicate String

Predicate Strings w iOS są szybkie i potężne do automatyzacji iOS.

# Według etykiety
-ios predicate string:label == "Login"

# Według częściowej etykiety
-ios predicate string:label CONTAINS "Log"

# Według nazwy
-ios predicate string:name == "loginButton"

# Według typu
-ios predicate string:type == "XCUIElementTypeButton"

# Według wartości
-ios predicate string:value == "ON"

# Łączone warunki
-ios predicate string:type == "XCUIElementTypeButton" AND label == "Login"

# Widoczność
-ios predicate string:label == "Login" AND visible == 1

# Niewrażliwość na wielkość liter
-ios predicate string:label ==[c] "login"

Operatory predykatów:

OperatorOpis
==Równa się
!=Nie równa się
CONTAINSZawiera podciąg
BEGINSWITHZaczyna się od
ENDSWITHKończy się na
LIKEDopasowanie ze znakami wieloznacznymi
MATCHESDopasowanie wyrażenia regularnego
ANDLogiczne AND
ORLogiczne OR

Class Chain

Łańcuchy klas w iOS zapewniają hierarchiczną lokalizację elementów z dobrą wydajnością.

# Bezpośredni potomek
-ios class chain:**/XCUIElementTypeButton[`label == "Login"`]

# Dowolny potomek
-ios class chain:**/XCUIElementTypeButton

# Według indeksu
-ios class chain:**/XCUIElementTypeCell[3]

# Łączone z predykatem
-ios class chain:**/XCUIElementTypeButton[`name == "submit" AND visible == 1`]

# Hierarchicznie
-ios class chain:**/XCUIElementTypeTable/XCUIElementTypeCell[`label == "Settings"`]

# Ostatni element
-ios class chain:**/XCUIElementTypeButton[-1]

XPath (iOS)

XPath działa na iOS, ale jest wolniejszy niż predicate strings.

# Według typu i etykiety
//XCUIElementTypeButton[@label='Login']

# Według nazwy
//XCUIElementTypeTextField[@name='username']

# Według wartości
//XCUIElementTypeSwitch[@value='1']

# Hierarchicznie
//XCUIElementTypeTable/XCUIElementTypeCell[1]

Strategia selektorów międzyplatformowych

Pisząc testy, które muszą działać zarówno na iOS, jak i Android, używaj tej kolejności priorytetów:

1. Accessibility ID (Najlepsze)

# Działa na obu platformach
~loginButton

2. Selektory specyficzne dla platformy z logiką warunkową

Gdy identyfikatory dostępności nie są dostępne, użyj selektorów specyficznych dla platformy:

Android:

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

iOS:

-ios predicate string:label == "Login"

3. XPath (Ostatnia deska ratunku)

XPath działa na obu platformach, ale z różnymi typami elementów:

Android:

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

iOS:

//XCUIElementTypeButton[@label='Login']

Referencja typów elementów

Typy elementów Android

TypOpis
android.widget.ButtonPrzycisk
android.widget.EditTextPole tekstowe
android.widget.TextViewEtykieta tekstowa
android.widget.ImageViewObraz
android.widget.ImageButtonPrzycisk graficzny
android.widget.CheckBoxPole wyboru
android.widget.RadioButtonPrzycisk radio
android.widget.SwitchPrzełącznik
android.widget.SpinnerLista rozwijana
android.widget.ListViewWidok listy
android.widget.RecyclerViewWidok recycler
android.widget.ScrollViewKontener przewijania

Typy elementów iOS

TypOpis
XCUIElementTypeButtonPrzycisk
XCUIElementTypeTextFieldPole tekstowe
XCUIElementTypeSecureTextFieldPole hasła
XCUIElementTypeStaticTextEtykieta tekstowa
XCUIElementTypeImageObraz
XCUIElementTypeSwitchPrzełącznik
XCUIElementTypeSliderSuwak
XCUIElementTypePickerKółko wyboru
XCUIElementTypeTableWidok tabeli
XCUIElementTypeCellKomórka tabeli
XCUIElementTypeCollectionViewWidok kolekcji
XCUIElementTypeScrollViewWidok przewijania

Najlepsze praktyki

Zalecane

  • Używaj identyfikatorów dostępności dla stabilnych, międzyplatformowych selektorów
  • Dodawaj atrybuty data-testid do elementów webowych do testowania
  • Używaj identyfikatorów zasobów na Androidzie, gdy identyfikatory dostępności nie są dostępne
  • Preferuj predicate strings zamiast XPath na iOS
  • Utrzymuj selektory proste i specyficzne

Niezalecane

  • Unikaj długich wyrażeń XPath - są wolne i kruche
  • Nie polegaj na indeksach dla dynamicznych list
  • Unikaj selektorów opartych na tekście dla aplikacji lokalizowanych
  • Nie używaj bezwzględnych ścieżek XPath (zaczynających się od korzenia)

Przykłady dobrych i złych selektorów

# Dobre - stabilny identyfikator dostępności
~loginButton

# Złe - kruchy XPath z indeksami
//div[3]/form/button[2]

# Dobre - specyficzny CSS z ID testowym
[data-testid="submit-button"]

# Złe - klasa, która może się zmienić
.btn-primary-lg-v2

# Dobre - UiAutomator z ID zasobu
android=new UiSelector().resourceId("com.app:id/submit")

# Złe - tekst, który może być lokalizowany
android=new UiSelector().text("Submit")

Debugowanie selektorów

Web (Chrome DevTools)

  1. Otwórz Chrome DevTools (F12)
  2. Użyj panelu Elements do inspekcji elementów
  3. Kliknij prawym przyciskiem myszy na element → Kopiuj → Kopiuj selektor
  4. Testuj selektory w Konsoli: document.querySelector('twój-selektor')

Mobile (Appium Inspector)

  1. Uruchom Appium Inspector
  2. Połącz się z działającą sesją
  3. Kliknij na elementy, aby zobaczyć wszystkie dostępne atrybuty
  4. Użyj funkcji "Search for element" do testowania selektorów

Używanie get_visible_elements

Narzędzie get_visible_elements serwera MCP zwraca wiele strategii selektorów dla każdego elementu:

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

Zwraca to elementy z wygenerowanymi selektorami, których możesz używać bezpośrednio.

Opcje zaawansowane

Dla większej kontroli nad wykrywaniem elementów:

# Pobierz tylko obrazy i elementy wizualne
Get visible elements with elementType "visual"

# Pobierz elementy z ich współrzędnymi do debugowania układu
Get visible elements with includeBounds enabled

# Pobierz kolejne 20 elementów (paginacja)
Get visible elements with limit 20 and offset 20

# Dołącz kontenery układu do debugowania
Get visible elements with includeContainers enabled

Narzędzie zwraca paginowaną odpowiedź:

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

Używanie get_accessibility (Tylko przeglądarka)

Do automatyzacji przeglądarki narzędzie get_accessibility dostarcza semantycznych informacji o elementach strony:

# Pobierz wszystkie nazwane węzły dostępności
Get accessibility tree

# Filtruj tylko przyciski i linki
Get accessibility tree filtered to button and link roles

# Pobierz następną stronę wyników
Get accessibility tree with limit 50 and offset 50

Jest to przydatne, gdy get_visible_elements nie zwraca oczekiwanych elementów, ponieważ odpytuje natywne API dostępności przeglądarki.

Welcome! How can I help?

WebdriverIO AI Copilot