Jak w takim przypadku kliknąć pierwszy 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
i otrzymuję ten błąd:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
A bez tego within
wyskakuje mi ten błąd:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click' for nil:NilClass
Spróbuj wykonać następujące czynności:
Źródła:
źródło
To wyrażenie działa również:
źródło
Xpath może adresować element. Nie jestem jeszcze z tym dobry, ale coś w stylu
//div[@class='active'][1]/a
To może działać lub nie, ale chodzi o to, że xpath może zaadresować tablicę dopasowań i wyciągnąć konkretną. Powinieneś być w stanie to dopasować.
Działający przykład z jednego z moich projektów:
źródło
Ponieważ first () nie zawsze czeka, być może jest to przydatne:
źródło
większość z tych rozwiązań nie będzie wykorzystywała wspaniałych funkcji oczekiwania Capybara
lepiej zrób tak, jak sugeruje ten link:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element
Zły:
first(".active").click
Jeśli na stronie nie ma jeszcze elementu .active, najpierw zwróci zero, a kliknięcie zakończy się niepowodzeniem.
Dobry:
Jeśli chcesz mieć pewność, że jest dokładnie jeden
find(".active").click
Jeśli chcesz tylko pierwszego elementu,
find(".active", match: :first).click
Kapibara zaczeka na pojawienie się elementu, zanim spróbujesz kliknąć.
Zauważ, że
match: :first
jest to bardziej kruche, ponieważ po cichu kliknie na inny element, jeśli wprowadzisz nowe elementy, które pasują.źródło
Prosty w użyciu:
źródło