2009-09-10 10 views

Odpowiedz

11

Możesz użyć polecenia getXpathCount w celu ustalenia liczby pasujących elementów. Możesz następnie przechodzić między nimi za pomocą inkrementacji, aby zlokalizować każdy element osobno. Poniższy Java (TestNG/JUnit) Przykładem może sprawdzić, czy wszystkie pola na stronie są sprawdzane:

int totalCheckboxes = session().getXpathCount("//input[@type='checkbox']").intValue(); 
for (int i = 1; i < totalCheckboxes+1; i++) { 
    assertTrue(session().isChecked("//input[@type='checkbox'][" + i + "]")); 
} 
+0

Dzięki Dave, Santi. Mój problem polega na tym, że nie mam możliwości korzystania z klienta Selenium podczas testów jednostkowych. Niestety, jestem ograniczony do używania Selenium IDE i tabel poleceń, ale to nie znaczy, że nie byłbym w stanie uszczypnąć w niektórych JS, aby zrobić to samo. –

+1

Jeśli rozwiążesz problem w IDE z JavaScript, prześlij swoje rozwiązanie. Byłbym zainteresowany widząc to. :) –

2

Nie ma mowy, selen mógł ocenić listę elementów zwróconych przez lokalizator. Po prostu chwyta pierwszy i robi z nim rzeczy.

Odpowiedź Dave'a to najlepsza alternatywa dla tego, czego szukasz.

+0

Myślę, że nadal zasługuje na sukces w JS :) –

2

Próbuję zrobić dokładnie to samo w Selenium i próbowałem użyć przykładu @ dave-hunt, ale jest to niepoprawna metoda na znalezienie pojedynczego elementu w kolekcji.

Rozważmy następujący przykład:

<form> 
<div> 
    <input type="text" name="field1" /> 
</div> 
<div> 
    <input type="text" name="field2" /> 
</div> 
</form> 

Jeśli użyć wyrażenia jak:

//input[@type='text'][1] 

tym zwróci wszystkie wejścia tekstowych na stronie. Czemu? Ponieważ każde wejście jest pierwszym pasującym elementem w jego własnym drzewie.

Jeśli jednak użyć wyrażenia jak:

/descendant::input[@type='text'][1] 

lub

/descendant::input[@type='text'][2] 

pierwsze wyrażenie będzie chwycić pierwsze wejście i drugi wyraz będzie chwycić drugie wejście. Bardzo ważne jest, aby użyć pojedynczego "/", a NIE podwójnego "//".

4

Z

/descendant::input[@type='text'][1] 
/descendant::input[@type='text'][2] 

można szukać tylko wszystkich elementów wejściowych w drzewie. Nie zadziała, jeśli po prostu chcesz przeanalizować poddrzewo.

Lepszym sposobem jest:

(/form/div/input[@type='text'])[1] 
(/form/div/input[@type='text'])[2] 

który zwróci wynik # 1, # 2 itd wyrażenia XPath w nawiasach.

Oczywiście można też zrobić

(//input[@type='text'])[1] 

Jest to bardzo przydatny jako Selen używa tylko pierwszy mecz i nie może poradzić sobie ze zbioru wynikowego, czyli co XPath zazwyczaj wraca.

5

Próbowałem powyższego podejścia i selen rzuca wyjątki, że element nie został znaleziony.Dodanie przedrostka xpath = rozwiązało problem.

przykład

xpath=(//td[@class='cell name bold'])[1] 
xpath=(//td[@class='cell name bold'])[2] 
+0

Prefiks 'xpath =' uratował mój dzień! Stukrotne dzięki! –

Powiązane problemy