Como clicar no primeiro link nesse caso:
<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
e recebo este erro:
Capybara::Ambiguous:
Ambiguous match, found 2 elements matching css ".item"
E sem o within
eu recebo este erro:
Failure/Error: first(:link, "Agree").click
NoMethodError:
undefined method `click' for nil:NilClass
Tente o seguinte:
Fontes:
fonte
Esse fraseado também funciona:
fonte
Xpath pode endereçar o elemento. Ainda não sou muito bom com isso, mas algo como
//div[@class='active'][1]/a
Isso pode ou não funcionar, mas o ponto é que o xpath pode endereçar uma matriz de correspondências e obter uma determinada. Você deve conseguir combinar com isso.
Um exemplo de exemplo de trabalho de um dos meus projetos:
fonte
Como first () nem sempre espera, talvez isso seja útil:
fonte
a maioria dessas soluções não usará os brilhantes recursos de espera da Capivara
melhor fazer como este link sugere:
https://thoughtbot.com/blog/write-reliable-asynchronous-integration-tests-with-capybara#find-the-first-matching-element
Ruim:
first(".active").click
Se ainda não houver um elemento .active na página, o valor retornará nulo e o clique falhará.
Boa:
Se você quiser ter certeza de que há exatamente um
find(".active").click
Se você quiser apenas o primeiro elemento, a
find(".active", match: :first).click
Capivara esperará o elemento aparecer antes de tentar clicar.
Observe que
match: :first
é mais frágil, porque ele clicará silenciosamente em um elemento diferente se você introduzir novos elementos correspondentes.fonte
Simples você pode usar:
fonte