2013-08-29 22 views
31

Chciałem znaleźć przez class_name i zwrócić ostatni element spośród wszystkich elementów.Jak znaleźć ostatni pasujący element w kapibarze?

w jQuery, możemy napisać coś jak poniżej, ale to nie wydaje się działać w kapibary

find(".delete:last") 

Jeśli używasz webkit kierowca można napisać coś podobnego -

find(".delete:last-child") 

W Kapibara, możesz pobrać ostatni element używając poniższego -

all(:css, ".delete").last 

Jest to e jakąś alternatywę do powyższego?

+3

który sterownik zrobić używasz? '.delete: last-child'' powinno działać z selenem –

+0

Właściwie chciałem znaleźć inne alternatywy w kapibarze (nie specyficzne dla kierowcy). –

+0

To nie jest rozwiązanie specyficzne dla sterownika. Powinien działać we wszystkich sterownikach, które obsługują poprawnie selektory CSS. –

Odpowiedz

43

miałem ten sam problem, a zakończył się przy użyciu tej metody w Kapibara 2,4

all('.delete').last 
+0

Dzięki człowieku. Nie zdawałem sobie sprawy, że istnieje "wszystko". Jeśli ktoś się zastanawia, dlaczego to jest problem, 'find' zwraca dopasowany węzeł (dobry) lub zgłasza wyjątek, jeśli jest więcej niż jeden mecz (zły). Tak więc pseudo selektory nie działają. – IAmNaN

+5

FYI dla przyszłych czytelników: Należy pamiętać, że 'all' w przeciwieństwie do' find' nie będzie czekać na jakiekolwiek elementy; nie ma sposobu, aby przewidzieć, ile powinno być. Dobrym pomysłem jest upewnienie się, że wszystkie użyteczne działania asynchroniczne zostały wykonane przed użyciem. – tgf

+5

Działa to również z 'wewnątrz ', więc możesz zrobić' wewnątrz wszystkiego (' li '). Last {fill_in "Name", with: "Value"} ' – hoffmanc

0

Opierając się na @Sharagoz odpowiedź i komentarz @ TGF jest o wszystkim (w przeciwieństwie do znalezienia) nie czekając na asynchroniczny do końca, to połączenie wydaje pracować dla mnie:

wait_for_ajax 
all('.selector').last 

z tego dodawano do RSpec/kapibary:

module RspecFeatureHelpers 
    def wait_for_ajax 
    Timeout.timeout(Capybara.default_max_wait_time) do 
     loop do 
     active = page.evaluate_script('jQuery.active') 
     break if active == 0 
     end 
    end 
    end 
end