2013-08-29 7 views
31

Ich wollte von class_name finden und das letzte Element unter allen Elementen zurückgeben.Wie findet man das letzte passende Element in Capybara?

In jquery, können wir so etwas wie unten schreiben, aber das scheint nicht

find(".delete:last") 

in Capybara zu arbeiten Wenn Sie webkit Treiber verwenden, können Sie so etwas wie schreiben -

find(".delete:last-child") 

In Capybara, können Sie das letzte Element unter Verwendung von -

Is ther e irgendeine Alternative zu oben? mit dieser Methode in Capybara

+3

Welche Fahrer tun Sie nutzen? '.delete: last-child' sollte mit selen arbeiten –

+0

Eigentlich wollte ich andere Alternativen in Capybara (nicht treiberspezifisch) herausfinden –

+0

Das ist keine treiberspezifische Lösung. Es sollte in allen Treibern funktionieren, die richtige CSS-Selektoren unterstützen. –

Antwort

43

hatte ich das gleiche Problem und am Ende 2,4

all('.delete').last 
+0

Danke Mann. Habe nicht bemerkt, dass es ein 'all' gab. Falls sich jemand fragt, warum dies ein Problem ist, gibt 'find' den übereinstimmenden Knoten zurück (gut) oder löst eine Ausnahme aus, wenn es mehr als eine Übereinstimmung (schlecht) gibt. So funktionieren Pseudo Selektoren nicht. – IAmNaN

+5

FYI für zukünftige Leser: Denken Sie daran, dass "alles" im Gegensatz zu "finden" nicht auf irgendwelche Elemente warten wird; es gibt keine Möglichkeit vorherzusagen, wie viele es sein sollte. Stellen Sie sicher, dass Sie überprüft haben, dass alle asynchronen Aktivitäten auf der Seite abgeschlossen sind, bevor Sie diese verwenden. – tgf

+5

Dies funktioniert auch gut mit "innerhalb", so dass Sie "in allen" (li) machen können. Last {fill_in "Name", mit: "Value"} ' – hoffmanc

0

Aufbauend auf @Sharagoz Antwort und Kommentar des @ tgf über alle (im Gegensatz zu find) wartet nicht auf async zu beenden, diese Kombination scheint für mich arbeiten:

wait_for_ajax 
all('.selector').last 

Damit zu rspec/capybara hinzugefügt:

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 
Verwandte Themen