ultimate xpath writing cheat sheet tutorial with syntax
20 najlepszych sposobów pisania Ultimate XPATH dla ŻADNEGO typu elementu sieci (XPATH nigdy nie będzie nieważne):
Aplikacja internetowa składa się z różnych typów elementów internetowych, takich jak element sieciowy, na który można kliknąć przycisk, element sieciowy do wprowadzania tekstu, menu rozwijane, przyciski opcji itp.
Te elementy internetowe są również nazywane tagami lub węzłami.
Jeśli chodzi o automatyzację aplikacji internetowych, zaczyna się od napisania skryptu automatyzacji, który znajdzie element sieciowy, wykona na nim akcję taką jak kliknięcie przycisku, wpisanie tekstu w pole wejściowe, zaznaczenie pola wyboru, wybranie przycisku radiowego, przewiń w górę lub w dół i na koniec sprawdź oczekiwane zachowanie w kolejnej czynności.
Czego się nauczysz:
- Co to jest XPath i jak wygląda?
- 20 najlepszych sposobów pisania XPath dla dowolnego elementu sieci
- 1) Odwrotne wyszukiwanie
- # 2) Używanie zmiennych i wartości niestandardowych
- # 3) Używanie tagów „XML”, „AND” itp
- # 4) Korzystanie z atrybutów i tabeli XPATH
- # 5) Korzystanie z atrybutów, tabel i tekstu
- # 6) Generowanie XPATH przy użyciu zagnieżdżonych atrybutów
- # 7) Generowanie XPath poprzez połączenie atrybutów, elementów DIV i przycisków
- # 8) XPATH Generowanie przy użyciu CONTAINS, REVERSE LOOKUP itp.
- # 9) Generowanie XPath przy użyciu Relative, CONTAINS, REVERSE, FOLLOWING SIBLING itp.
- # 10) Generowanie XPath przy użyciu atrybutów, zawartości, rewersu, poprzedzającego rodzeństwa, elementów DIV i rozpiętości
- # 11) Korzystanie z atrybutów, tagów XML itp.
- # 12) Generowanie XPath przez nie zaglądanie do całej strony, ale przeglądanie wszystkich łączy i zawiera
- # 13) Korzystanie z zawartości i atrybutów
- # 14) Używanie atrybutów, podążanie za rodzeństwem i potomkiem
- # 15) Używanie atrybutów, podążanie za rodzeństwem, potomkiem i tekstem
- # 16) Korzystanie z nagłówka i tekstu
- # 17) Używanie tekstu nagłówka, śledzenie rodzeństwa, ścieżka itp.
- # 18) Używanie atrybutów, zawiera i poprzedzające rodzeństwo
- # 19) Poszukiwanie listy rozwijanej za pomocą atrybutu Id, określonego tekstu i wyszukiwania wstecznego
- # 20) Łączenie atrybutu „id” i szukanie linku do określonego tekstu
- Wniosek
- rekomendowane lektury
Co to jest XPath i jak wygląda?
Znalezienie elementu przypomina znalezienie czyjegoś domu na mapie. Jedynym sposobem, w jaki możemy znaleźć dom znajomego bez żadnej pomocy z zewnątrz, jest posiadanie mapy i wiedza, co znaleźć (dom).
Aby przedstawić tę analogię w naszym przypadku, mapa zostanie użyta jako DOM (znaczniki HTML, JavaScript itp.), W którym istnieją wszystkie elementy sieciowe, wraz z określonym elementem sieciowym, który chcemy znaleźć.
Po znalezieniu unikalnego adresu lub ścieżki elementu, skrypt automatyzacji wykona na nim pewne działania w oparciu o scenariusz testowy. Na przykład, chcesz zweryfikować adres URL strony, która otwiera się po kliknięciu przycisku.
Jednak nie jest łatwo znaleźć unikalny adres / ścieżkę elementu WWW, ponieważ mogą istnieć podobne tagi, takie same wartości atrybutów, identyczne ścieżki, co utrudnia utworzenie dokładnego, unikalnego adresu elementu WWW o nazwie „XPATH”.
W tym miejscu szczegółowo omówimy kilka świetnych i skutecznych technik generowania prawidłowej i unikalnej ścieżki XPATH dla dowolnego typu elementu internetowego.
Zalecana lektura => Zidentyfikuj elementy sieci Web za pomocą XPath w Selenium
Czasami możesz łatwo tworzyć XPath za pomocą rozszerzeń przeglądarki, ale w my testowanie automatyzacji karierze, miałem do czynienia z niezliczonymi sytuacjami, w których tradycyjne rozszerzenia przeglądarki nie działają i musisz wymyślić własne, dostosowane XPath, korzystając z własnej kreatywności. Jestem pewien, że masz lub będziesz mieć podobne sytuacje.
W tym samouczku przyjrzymy się 20 najlepszym sposobom tworzenia ostatecznego XPath dla elementu internetowego w taki sposób, że nawet po zmianie kodu XPath pozostanie ważny przez cały czas (chyba że programista przepisuje cały funkcja / moduł).
Znając wszystkie te techniki, staniesz się mistrzem w pisaniu własnej XPath i będziesz w stanie pisać zabójcze XPath z bardzo niewielkimi szansami na unieważnienie.
Najpierw zacznijmy od zrozumienia składni XPath i zdefiniujmy każdą z jej części.
Poniższy obraz pokazuje, jak będzie wyglądać XPath wraz z opisem każdej części:
- //: Wybierz aktualny węzeł, taki jak wejście, div itp.
- Nazwa znacznika: Zmienna elementu / węzła WWW
- @: Wybierz atrybut
- Atrybut: Nazwa atrybutu węzła / określonego elementu sieci
- Wartość: Wartość atrybutu
Chcę tylko podzielić się tutaj kilkoma wskazówkami, że w 80% przypadków mój skrypt testu automatyzacji nie powiódł się z powodu XPath. Jest to spowodowane tym, że istnieje wiele elementów sieci Web dla podanej ścieżki XPath lub XPath jest nieprawidłowy lub strona nie została jeszcze załadowana.
Tak więc, gdy twój przypadek testowy zawiedzie:
- Skopiuj swój XPath.
- Wyszukaj go w przeglądarce (F12 lub okno narzędzia programisty) w DOM, aby sprawdzić, czy jest poprawny, czy nie (patrz poniższy obraz).
Pro typu 1: Upewnij się, że jest unikalny i żaden inny element sieciowy nie pojawia się podczas dwukrotnego wyszukiwania w DOM.
Pro typu 2: Czasami występuje problem z synchronizacją, co oznacza, że element / strona internetowa nie została jeszcze załadowana, podczas gdy skrypt jej szukał, dlatego dodaj trochę czasu oczekiwania i powtórz test.
Pro typu 3: Spróbuj wydrukować cały DOM przed wyszukaniem elementu WWW. W ten sposób możesz sprawdzić, patrząc w Console, czy Twój element sieciowy istnieje w DOM, czy nie.
różnica między testem poczytalności a testem dymu
Zanim zagłębimy się w przeglądanie XPath, jedną ważną rzeczą, którą chcę się podzielić, jest to, że jeśli masz bezpośredni dostęp do zespołu programistów lub jeśli Twój zespół znajduje się tam, gdzie jesteś, poproś zespół programistów o podanie unikalnych identyfikatorów każdy element sieciowy lub przynajmniej te, których chcesz użyć w Automation, a to pozwoli zaoszczędzić dużo czasu.
Jeśli nie ma takiej możliwości, być może będziesz musiał użyć swojej kreatywności i wymyślić własne, dostosowane XPath, a tego właśnie się teraz nauczymy.
20 najlepszych sposobów pisania XPath dla dowolnego elementu sieci
Zanurzmy się szczegółowo w tworzeniu 20 najlepszych sposobów na zabójczą XPath.
1) Odwrotne wyszukiwanie
Powiedzmy, że chcesz kliknąć przycisk i jest podobny przycisk. Oba przyciski mają atrybuty id, ale są dynamiczne i żaden z atrybutów nie jest unikalny w obu elementach przycisku.
W poniższym scenariuszu chcemy kliknąć przycisk „Ustawienia” w „Test interaktywny”.
Kod
Jeśli spojrzysz na przyciski „Ustawienia”, oba kody są podobne. Korzystając z tradycyjnych sposobów, takich jak identyfikator, nazwa, wartość, zawiera itp., Żaden z nich nie zadziała na przykład.
// * [zawiera (text (), „Setting”)], Spowoduje to powstanie dwóch elementów internetowych. Dlatego nie jest wyjątkowy.
Oto ostateczna strategia,
>> Najpierw znajdź najbliższy unikalny tag, który w tym przypadku jest
XPATH: “//*[@id='rcTEST']
>> Po drugie, znajdź element sieci najbliższy zamierzonemu elementowi sieciowemu, który w tym przypadku zawiera (text (), „TEST Interactive”). Teraz jesteśmy w tym samym miejscu, w którym znajduje się przycisk „Ustawienia”, ale aby go kliknąć, najpierw musimy przejść do strony głównej, używając podwójnych kropek, jak pokazano poniżej.
XPATH: “//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..
>> Jak widać, jesteśmy na poziomie, który ma drugi element sieci jako przycisk „Ustawienia”. Zawiera dwa przyciski i chcemy przejść do drugiego przycisku, czyli przycisku „Ustawienia”. Dodając „/ przycisk [2]” na końcu, możemy uzyskać naszą unikalną ścieżkę XPATH dla przycisku „Ustawienia”, jak pokazano poniżej.
Ostateczna ścieżka XPATH:
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/../button[2]”
Oto inny sposób generowania, jeśli myślisz, że mogą zmienić typ elementu sieci z „przycisk” na inny.
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/..//*[contains(text(), 'Setting')]”
lub używając „podążającego rodzeństwa”
“//*[@id='rcTEST']//*[contains(text(), 'TEST Interactive')]/following-sibling::button”
# 2) Używanie zmiennych i wartości niestandardowych
Załóżmy, że istnieje aplikacja internetowa z funkcją FTP („File Transfer Protocol”) do przesyłania / pobierania plików i masz przypadek testowy do pobrania określonego pliku, klikając łącze pobierania.
Najpierw możemy zdefiniować nazwę pliku, którego szukamy, jako zmienną.
Ciąg oczekiwanyNazwaPliku = „Test1”;
co zrobić z plikami apk
Teraz używając XPATH możemy znaleźć rzeczywistą nazwę pliku.
“String actualFileName = WebDriverAccess.getDriver().findElement (By.xpath('//*'+fileName +'/tr/td[1]')).getAttribute('title');”
W powyższym XPath… „/ tr / td [1] .getAttribute („ title ”)” przejdzie do określonego wiersza i pierwszej kolumny i otrzyma wartość atrybutu tytułu. Możemy przechowywać aktualną nazwę pliku w innej zmiennej.
Gdy już mamy zarówno oczekiwane, jak i rzeczywiste nazwy plików, możemy porównać oba, a jeśli oba pasują do siebie, możemy po prostu kliknąć łącze pobierania.
(if acutalFileName == expectedFileName) { WebDriverAccess.getDriver().findElement(By.xpath('//*'+fileName +'/tr/td[4]')).click(); }
Możemy również utworzyć pętlę przez każdy wiersz i sprawdzać nazwę pliku, dopóki go nie znajdziesz.
Loop(int count <30) { String actualFileName = WebDriverAccess. getDriver ().findElement (By. xpath ('//*'+acutalFileName +'/tr[' + count + ']/td[1]')).getAttribute('title'); (if acutalFileName == expectedFileName) { WebDriverAccess. getDriver ().findElement(By. xpath ('//*'+fileName +'/tr/td[4]')).click(); } Count++; }
Możemy wygenerować unikalną XPATH przy użyciu niestandardowych tagów oraz dodać inne warunki.
Na przykład, załóżmy, że nasz zamierzony element sieciowy istnieje w głównym tagu i jest wiele tagów adresowych, ale chcesz znaleźć tylko konkretny. Wszystkie tagi adresowe mają atrybut class, więc możemy zacząć od.
// address[@class='ng-scope ng-isolate-scope']
Zauważyliśmy, że zamierzony przez nas element sieciowy znajduje się w tagu, który zawiera tekst o nazwie „Testowanie”.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,'Testing')
Dowiedzieliśmy się, że w rezultacie znaleziono wiele elementów sieci. Dlatego, aby uczynić go bardziej wyjątkowym, możemy dodać inne warunki, takie jak „id”, które ostatecznie wskażą nam element sieciowy, którego szukamy.
// address[@class='ng-scope ng-isolate-scope']//div[contains(.,Testing') and @id='msgTitle']
# 4) Korzystanie z atrybutów i tabeli XPATH
Załóżmy, że chcemy pisać do elementu WWW, który jest umieszczony wewnątrz tabeli, a tabela jest umieszczona wewnątrz elementu formularza.
Możemy znaleźć wszystkie formularze wewnątrz DOM o nazwie „myForm”.
“//*[@name='myForm']”
Teraz we wszystkich formularzach znajdź tabelę o identyfikatorze „tbl_testdm”.
'//*[@name='myForm']//table[@id='tbl_ testdm’]”
W tabeli przejdź do określonego wiersza i kolumny.
'//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/”
Jeśli w komórce jest wiele danych wejściowych, znajdź dane wejściowe, w których wartość = „Otwórz RFS”, a to da nam ostateczną ścieżkę XPath pola.
//*[@name='myForm']//table[@id='tbl_ testdm’]/tbody/tr/td[6]/ input[@value='Open RFS']'
# 5) Korzystanie z atrybutów, tabel i tekstu
Załóżmy, że zamierzony element sieciowy znajduje się w tablicy paneli i ma wspólny tekst.
Najpierw zacznij od panelu z unikalnym atrybutem, którym w tym przypadku jest „TITLE”.
//*[@title=’Songs Lis Applet']
Teraz przejrzyj wszystkie tagi tabeli.
//*[@title=’Songs Lis Applet']//table
We wszystkich tabelach znajdź kolumnę z tekstem „Autor”.
Final XPath wyglądałoby następująco:
//*[@title=’Songs List Applet']//table//td[contains(text(),'Author')]
# 6) Generowanie XPATH przy użyciu zagnieżdżonych atrybutów
XPath docelowego elementu internetowego można również wygenerować przy użyciu atrybutów zagnieżdżonych. Na przykład, w tym przypadku będzie szukał określonego atrybutu w całym modelu DOM, a następnie szuka w nim innego atrybutu.
vr zestaw słuchawkowy na PC i PS4
//*[@id='parameters']//*[@id='testUpdateTime']')
# 7) Generowanie XPath poprzez połączenie atrybutów, elementów DIV i przycisków
Na przykład, w poniższym XPath udało mi się znaleźć docelowy element sieciowy za pomocą identyfikatora (względnego XPath), kilku znaczników DIV i przycisku.
“//*[@id='MODEL/PLAN']/div[1]/div[2]/div[1]/div[1]/widget/section/div[1]/div/div[1]/div/div/button[1]'
# 8) XPATH Generowanie przy użyciu CONTAINS, REVERSE LOOKUP itp.
Kiedyś miałem listę rozwijaną bez bezpośredniej identyfikacji. Musiałem użyć atrybutów CONTAINS, REVERSE, DIV, aby uzyskać ostateczną XPATH, jak pokazano poniżej.
//*[contains(text(),'Watch Dial)]/../div/select[@data-ng-model='context.questions [subqts.subHandleSubId]']'),
# 9) Generowanie XPath przy użyciu Relative, CONTAINS, REVERSE, FOLLOWING SIBLING itp.
Miałem sytuację, w której aplikacja wyświetla wykres, a każda wartość wykresu musiała zostać zweryfikowana. Ale niestety każda wartość nie miała żadnego unikalnego identyfikatora, więc wymyśliłem ostateczną XPATH, jak pokazano poniżej, dla jednej wartości wykresu, która łączy znaczniki względne, zawiera, odwrotne, podążające za rodzeństwem i znaczniki DIV.
//*[@id='RESEARCH/PLAN']//*[contains(@id, 'A4')]/../../following-sibling::div[1]/div[1]/span[1]/span[1]
# 10) Generowanie XPath przy użyciu atrybutów, zawartości, rewersu, poprzedzającego rodzeństwa, elementów DIV i rozpiętości
Kiedyś musiałem zweryfikować różne dane alarmu i każda wartość alarmu została wyświetlona na podstawie określonych obliczeń lub czasów. Aby uchwycić każdą wartość, musiałem wymyślić poniższą XPATH, która wykorzystuje atrybuty, zawiera, odwrotne, poprzedzające rodzeństwo, elementy div i span.
//*[@id='ALARMDATA']//*[contains(@id, 'AFC2')]/../../preceding-sibling::div[1]/div[1]/span[1]/span[1]
# 11) Korzystanie z atrybutów, tagów XML itp.
W poniższym XPATH, atrybutach i znacznikach XML, sekwencja jest używana do wymyślenia ostatecznego unikalnego adresu elementu WWW.
//*[@id='RESEARCH/REVIEW'] //widget/section/div[1]/div/div[2]/div[1]/div[3]/div[1]//span[@class='details']
# 12) Generowanie XPath przez nie zaglądanie do całej strony, ale przeglądanie wszystkich łączy i zawiera
Poniższy XPath szukałby tylko linków na całej stronie, które zawierają tekst jako „Ręczne wprowadzanie danych parametrów”.
//a[contains(.,'Parameter Data Manual Entry')]
# 13) Korzystanie z zawartości i atrybutów
//*[contains(@style,'display: block; top:')]//input[@name='daterangepicker_end']
# 14) Używanie atrybutów, podążanie za rodzeństwem i potomkiem
//*[@id='dropdown-filter-serviceTools']/following-sibling::ul/descendant::a[text()='Notepad']
# 15) Używanie atrybutów, podążanie za rodzeństwem, potomkiem i tekstem
//*[@id='dropdown-filter-service tools'] /following-sibling::ul/descendant::a[text()='Trigger Dashboard']
# 16) Korzystanie z nagłówka i tekstu
Jeśli element web jest nagłówkiem z określonym tekstem, XPath może wyglądać tak, jak pokazano poniżej:
//h3[text()='Internal Debrief']
# 17) Używanie tekstu nagłówka, śledzenie rodzeństwa, ścieżka itp.
//h3[contains(text(),'Helium Level')]/following-sibling::div/label/input
# 18) Używanie atrybutów, zawiera i poprzedzające rodzeństwo
Kiedy już miałem zakres, który nie miał żadnego unikalnego atrybutu, utworzyłem XPATH, łącząc wartość bezwzględną, zawiera, poprzedzające rodzeństwo i inną ścieżkę bezwzględną.
//div[div[p[contains(text(),'Status')]]]/preceding-sibling::div/div/span[3]/span
# 19) Poszukiwanie listy rozwijanej za pomocą atrybutu Id, określonego tekstu i wyszukiwania wstecznego
//*[@id='COUPLING']//*[contains(text(),'COUPLE Trend')]/../div/select
# 20) Łączenie atrybutu „id” i szukanie linku do określonego tekstu
//*[@id='ffaHeaderDropdown']//a[contains(text(),'Start Workflow')]
Wniosek
Jeśli chodzi o pisanie zabójczej XPATH, to naprawdę zależy od tego, jak dobrze rozumiesz i analizujesz kod. Im lepiej zrozumiesz kod, tym więcej znajdziesz sposobów na pisanie skutecznych XPATH.
Pierwszym krokiem w pisaniu XPath jest znalezienie najbardziej zbliżonego unikalnego elementu internetowego do docelowego elementu internetowego i zbliżanie się do niego przy użyciu różnych technik omówionych powyżej, takich jak atrybuty, DIV, śledzenie, zawiera itp.
Na koniec chcielibyśmy powtórzyć, że naprawdę ułatwi Ci to życie, jeśli poprosisz zespół programistów o dodanie unikalnych identyfikatorów do wszystkich interesujących Cię elementów sieci.
Ilekroć zaczyna się cykl sprintu lub praca nad nowym wymaganiem, a zespół jest dzielony z nowymi makietami, zawsze przeglądam wszystkie makiety i myślę o potencjalnych przypadkach testowych automatyzacji, przygotowuję listę wszystkich potencjalnych elementów sieci, które będą używane w testach automatyzacji i przygotowuję własne identyfikatory.
Gdy lista wszystkich elementów sieci wraz z sugerowanymi identyfikatorami zostanie ukończona, udostępnię ją wcześniej programistom w celu wykorzystania w kodzie programistycznym. W ten sposób zawsze otrzymywałem unikalne identyfikatory, ułatwiając mi pisanie XPATH.
Poniżej znajduje się połączona lista różnych sposobów pisania XPATH:
- „// * [@ id =’ rcTEST ”] // * [zawiera (text (),‘ TEST Interactive ’)] /../ button [2]”
- „// * [@ id =’ rcTEST ”] // * [zawiera (text (),‘ TEST Interactive ’)] /..//* [zawiera (text (),‘ Setting ’)]”
- „// * [@ id =’ rcTEST ”] // * [zawiera (text (),‘ TEST Interactive ’)] / following-sibling :: button”
- „String currentFileName = WebDriverAccess.getDriver (). FindElement (By.xpath („ // * ”+ fileName +” / tr / td [1] ”)). GetAttribute („ title ”);”
- WebDriverAccess.getDriver (). FindElement (By.xpath („// *” + nazwa_pliku + ”/ tr / td [4]”)). Click ();
- '// adres [@ class = 'ng-scope ng-isolate-scope'] // div [zawiera (., Testing ') and @ id =' msgTitle ']'
- „// * [@ name =’ myForm ’] // table [@ id =’ tbl_ testdm ’] / tbody / tr / td [6] /
- wejście [@ value = 'Open RFS'] ”
- „// * [@ title = 'Aplet listy utworów'] // table // td [zawiera (text (), 'Autor')]”
- „// * [@ id =” parametry ”] // * [@ id =’ testUpdateTime ’]”) ”
- „// * [@ id = 'MODEL / PLAN'] / div [1] / div [2] / div [1] / div [1] / widget / section / div [1] / div / div [1] / div / div / button [1] ”
- „// * [zawiera (text (),’ Watch Dial)] /../ div / select [@ data-ng-model = ’context.questions [subqts.subHandleSubId]’] ”),”
- „// * [@ id = 'RESEARCH / PLAN'] // * [zawiera (@id, 'A4')] /../../ following-sibling :: div [1] / div [1] / span [1] / span [1] ”
- „// * [@ id = 'ALARMDATA'] // * [zawiera (@id, 'AFC2')] /../../ previous-sibling :: div [1] / div [1] / span [ 1] / zakres [1] ”
- „// * [@ id = 'RESEARCH / REVIEW'] // widget / section / div [1] / div / div [2] / div [1] / div [3] / div [1] // span [ @ class = 'details'] ”
- „//A[contains(.,’Parameter Data Manual Entry”)] ”
- „// * [zawiera (@ style,’ display: block; top: ’)] // input [@ name =’ daterangepicker_end ’]”
- „// * [@ id =’ dropdown-filter-serviceTools ’] / following-sibling :: ul / descendant :: a [text () =’ Notepad ’]”
- „// * [@ id =’ dropdown-filter-serviceTools ’] / following-sibling :: ul / descendant :: a [text () =’ Trigger Dashboard ’]”
- „// h3 [text () =’ Wewnętrzne sprawozdanie ”]”
- „// h3 [zawiera (text (),’ poziom helu ’)] / following-sibling :: div / label / input”
- „// div [div [p [zawiera (text (),„ Status ”)]]] / previous-sibling :: div / div / span [3] / span”
- „// * [@ id = 'COUPLING'] // * [zawiera (text (), 'Trend COUPLE')] /../ div / select”
- „// * [@ id = 'ffaHeaderDropdown'] // a [zawiera (text (), 'Rozpocznij przepływ pracy')]”
Mam nadzieję, że ten pouczający artykuł wzbogaciłby Twoją wiedzę na temat pisania XPath.
Bio autora: Ten artykuł został napisany przez Adnana Arifa, informatyka, który ma różnorodne doświadczenie i umiejętności w swojej karierze trwającej ponad 9 lat.
rekomendowane lektury
- Dogłębne samouczki dotyczące Eclipse dla początkujących
- Python DateTime Tutorial z przykładami
- Składnia poleceń Unix Cat, opcje z przykładami
- Polecenie sortowania systemu Unix ze składnią, opcjami i przykładami
- Samouczek dotyczący skryptów powłoki Unix z przykładami
- Selenium Find Element By Text Samouczek z przykładami
- Samouczek dotyczący głównych funkcji języka Python z praktycznymi przykładami
- Postprocesor Xpath Extractor w JMeter