So klicken Sie in diesem Fall auf den ersten Link:
<div class="item">
<a href="/agree/">Agree</a>
</div>
<div class="item">
<a href="/agree/">Agree</a>
</div>
within ".item" do
first(:link, "Agree").click
end
und ich bekomme diesen Fehler:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
Und ohne das within
bekomme ich diesen Fehler:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click' for nil:NilClass
Versuche Folgendes:
Quellen:
quelle
Diese Formulierung funktioniert auch:
quelle
Xpath kann das Element adressieren. Ich bin noch nicht sehr gut damit, aber so ähnlich
//div[@class='active'][1]/a
Das mag funktionieren oder auch nicht, aber der Punkt ist, dass xpath ein Array von Übereinstimmungen adressieren und eine bestimmte herausziehen kann. Sie sollten in der Lage sein, damit übereinzustimmen.
Ein Arbeitsbeispiel aus einem meiner Projekte:
quelle
Da first () nicht immer wartet, ist dies vielleicht nützlich:
quelle
Die meisten dieser Lösungen verwenden die brillanten Wartefunktionen von Capybara nicht
Machen Sie es besser, wie 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 die Seite noch kein aktives Element enthält, wird zuerst nil zurückgegeben und der Klick schlägt fehl.
Gut:
Wenn Sie sicherstellen möchten, dass es genau eine gibt
find(".active").click
Wenn Sie nur das erste Element möchten
find(".active", match: :first).click
, wartet Capybara, bis das Element angezeigt wird, bevor Sie versuchen, darauf zu klicken.
Beachten Sie, dass dies
match: :first
spröder ist, da es still auf ein anderes Element klickt, wenn Sie neue Elemente einführen, die übereinstimmen.quelle
Einfach können Sie verwenden:
quelle