143 Stimmen

Wie kann ich nach dem Upgrade auf Capybara 2.0 den ersten Link in der Liste der Elemente anklicken?

Wie klickt man in diesem Fall den ersten Link an?

<div class="item">
  <a href="stackoverflow.com/agree/">Agree</a>
</div>
<div class="item">
  <a href="stackoverflow.com/agree/">Agree</a>
</div>

within ".item" do
  first(:link, "Agree").click
end

und ich erhalte diesen Fehler:

Capybara::Ambiguous:
  Ambiguous match, found 2 elements matching css ".item"

Und ohne die within Ich erhalte diesen Fehler:

Failure/Error: first(:link, "Agree").click
NoMethodError:
  undefined method `click' for nil:NilClass

191voto

Andrei Botalov Punkte 19906

Sie können einfach verwenden:

first('.item').click_link('Agree')

ou

first('.item > a').click

(wenn Ihr Standard-Selektor :css ist)


Der Code in Ihrer Frage funktioniert nicht als:

within ".item" do
  first(:link, "Agree").click
end

ist gleichbedeutend mit:

find('.item').first(:link, "Agree").click

Capybara findet mehrere .item so dass eine Ausnahme ausgelöst wird. Ich halte dieses Verhalten von Capybara 2 für sehr gut.

139voto

adamdboudreau Punkte 1361

Versuchen Sie das Folgende:

within ".item" do
  click_link("Agree", :match => :first)
end

Quellen:

27voto

Elle Mundy Punkte 2051

Auch diese Formulierung funktioniert:

within first(".item") do
  click_link "Agree"
end

8voto

Salomanuel Punkte 825

Die meisten dieser Lösungen werden die brillanten Wartefunktionen von Capybara nicht nutzen

tun Sie besser, was dieser Link vorschlägt:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element

Schlecht:

first(".active").click
Wenn es noch kein .active-Element auf der Seite gibt, gibt first null zurück und der Klick schlägt fehl.

Gut:

Wenn Sie sicherstellen wollen, dass es genau eine
find(".active").click

Wenn Sie nur das erste Element haben wollen
find(".active", match: :first).click
Capybara wartet, bis das Element erscheint, bevor es versucht zu klicken.

Beachten Sie, dass match: :first ist spröder, weil es stillschweigend auf ein anderes Element klickt, wenn Sie neue Elemente einführen, die übereinstimmen.

5voto

DGM Punkte 26106

Xpath kann das Element adressieren. Ich bin noch nicht sehr gut darin, aber etwas wie //div[@class='active'][1]/a

Das kann funktionieren oder auch nicht, aber der Punkt ist, dass xpath eine Reihe von Übereinstimmungen adressieren und eine bestimmte herausziehen kann. Damit sollten Sie in der Lage sein, eine Übereinstimmung zu finden.

Ein funktionierendes Beispiel aus einem meiner Projekte:

within page.find("div.panel", text: /Proposals/) do
  within page.find('tr', text: /Foo/) do
    page.should have\_xpath('td\[3\]', text: @today)
  end
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X